tryMap method

  1. @override
Failure? tryMap(
  1. Object error, [
  2. StackTrace? stackTrace
])
override

Пытается преобразовать error в Failure, если это FirebaseException от Firebase Messaging.

Анализирует плагин, код и сообщение ошибки для определения типа:

Возвращает: Failure или null, если ошибка не относится к Messaging.

Implementation

@override
Failure? tryMap(Object error, [StackTrace? stackTrace]) {
  if (error is! FirebaseException) return null;

  final plugin = error.plugin.toLowerCase();
  final code = error.code.toLowerCase();
  final message = error.message?.toLowerCase() ?? '';

  final looksLikeMessaging =
      plugin.contains('messaging') ||
      code.contains('fcm') ||
      code.contains('apns') ||
      message.contains('notification') ||
      message.contains('messaging');

  if (!looksLikeMessaging) return null;

  if (_containsAny('$code $message', const [
    'permission',
    'denied',
    'authorization_denied',
  ])) {
    return const Failure.notification(
      type: NotificationFailure.permissionDenied,
    );
  }

  if (_containsAny('$code $message', const [
    'token',
    'registration-token',
    'apns-token',
  ])) {
    return Failure.notification(
      type: NotificationFailure.tokenRegistrationFailed,
      message: error.message,
    );
  }

  if (_containsAny('$code $message', const [
    'channel',
    'notification channel',
  ])) {
    return Failure.notification(
      type: NotificationFailure.channelNotFound,
      message: error.message,
    );
  }

  if (_containsAny('$code $message', const [
    'payload',
    'invalid-argument',
    'malformed',
  ])) {
    return Failure.notification(
      type: NotificationFailure.invalidPayload,
      message: error.message,
    );
  }

  if (_containsAny('$code $message', const [
    'unavailable',
    'service unavailable',
    'internal',
  ])) {
    return Failure.notification(
      type: NotificationFailure.serviceUnavailable,
      message: error.message,
    );
  }

  return Failure.notification(
    type: NotificationFailure.serviceUnavailable,
    message: error.message ?? error.toString(),
  );
}