tryMap method
Пытается преобразовать error в Failure, если это FirebaseException
от Firebase Messaging.
Анализирует плагин, код и сообщение ошибки для определения типа:
permission,denied→ NotificationFailure.permissionDeniedtoken,registration-token→ NotificationFailure.tokenRegistrationFailedchannel→ NotificationFailure.channelNotFoundpayload,invalid-argument→ NotificationFailure.invalidPayload
Возвращает: 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(),
);
}