From 3a0146ccdfccc1c7f1ff99f2c1574c303045ad55 Mon Sep 17 00:00:00 2001 From: Guillaume Bernos Date: Wed, 24 Apr 2024 14:01:56 +0200 Subject: [PATCH 1/2] fix(web): fix type casting for JSString --- .../lib/_flutterfire_internals.dart | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/packages/_flutterfire_internals/lib/_flutterfire_internals.dart b/packages/_flutterfire_internals/lib/_flutterfire_internals.dart index 194e8c94dc25..0701e825c98c 100644 --- a/packages/_flutterfire_internals/lib/_flutterfire_internals.dart +++ b/packages/_flutterfire_internals/lib/_flutterfire_internals.dart @@ -11,6 +11,8 @@ // This file exports utilities shared between firebase packages, without making // them public. +import 'dart:js_interop'; + import 'package:firebase_core/firebase_core.dart'; import 'src/interop_shimmer.dart' @@ -56,11 +58,23 @@ FirebaseException _firebaseExceptionFromCoreFirebaseError( required String Function(String) codeParser, required String Function(String code, String message)? messageParser, }) { - // ignore: unnecessary_cast - final convertCode = firebaseError.code as String; + // Necessary because of the conditional import + late final String convertCode; + if ((firebaseError.code) is JSAny) { + convertCode = (firebaseError.code as JSString).toDart; + } else { + // ignore: unnecessary_cast + convertCode = firebaseError.code as String; + } final code = codeParser(convertCode); - // ignore: unnecessary_cast - final convertMessage = firebaseError.message as String; + + late final String convertMessage; + if (firebaseError.message is JSAny) { + convertMessage = (firebaseError.message as JSString).toDart; + } else { + // ignore: unnecessary_cast + convertMessage = firebaseError.message as String; + } final message = messageParser != null ? messageParser(code, convertMessage) : convertMessage.replaceFirst('(${firebaseError.code})', ''); @@ -81,8 +95,15 @@ FirebaseException _firebaseExceptionFromCoreFirebaseError( /// See also https://github.com/dart-lang/sdk/issues/30741 bool _testException(Object? objectException) { final exception = objectException! as core_interop.JSError; - // ignore: unnecessary_cast - final message = exception.message as String; + + // Necessary because of the conditional import + late final String message; + if (exception.message is JSAny) { + message = (exception.message as JSString).toDart; + } else { + // ignore: unnecessary_cast + message = exception.message as String; + } // Firestore web does not contain `Firebase` in the message so we check the exception itself. return message.contains('Firebase') || exception.toString().contains('FirebaseError'); From c406ffc67aee48b24e3b5a7faf73227713f37782 Mon Sep 17 00:00:00 2001 From: Guillaume Bernos Date: Wed, 24 Apr 2024 14:26:37 +0200 Subject: [PATCH 2/2] refactor --- .../lib/_flutterfire_internals.dart | 40 +++++++------------ .../lib/src/interop_shimmer.dart | 6 +++ 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/packages/_flutterfire_internals/lib/_flutterfire_internals.dart b/packages/_flutterfire_internals/lib/_flutterfire_internals.dart index 0701e825c98c..426ee8fe94f4 100644 --- a/packages/_flutterfire_internals/lib/_flutterfire_internals.dart +++ b/packages/_flutterfire_internals/lib/_flutterfire_internals.dart @@ -11,13 +11,13 @@ // This file exports utilities shared between firebase packages, without making // them public. -import 'dart:js_interop'; - import 'package:firebase_core/firebase_core.dart'; import 'src/interop_shimmer.dart' if (dart.library.js_interop) 'package:firebase_core_web/firebase_core_web_interop.dart' as core_interop; +import 'src/interop_shimmer.dart' if (dart.library.js_interop) 'dart:js_interop' + as js_interop; export 'src/exception.dart'; @@ -52,29 +52,26 @@ extension ObjectX on T? { } } +// Necessary because of the conditional import +String _safeConvertFromPossibleJSObject(dynamic value) { + if (value is js_interop.JSAny) { + return (value as js_interop.JSString).toDart; + } else { + return value as String; + } +} + FirebaseException _firebaseExceptionFromCoreFirebaseError( core_interop.JSError firebaseError, { required String plugin, required String Function(String) codeParser, required String Function(String code, String message)? messageParser, }) { - // Necessary because of the conditional import - late final String convertCode; - if ((firebaseError.code) is JSAny) { - convertCode = (firebaseError.code as JSString).toDart; - } else { - // ignore: unnecessary_cast - convertCode = firebaseError.code as String; - } + final convertCode = _safeConvertFromPossibleJSObject(firebaseError.code); final code = codeParser(convertCode); - late final String convertMessage; - if (firebaseError.message is JSAny) { - convertMessage = (firebaseError.message as JSString).toDart; - } else { - // ignore: unnecessary_cast - convertMessage = firebaseError.message as String; - } + final String convertMessage = + _safeConvertFromPossibleJSObject(firebaseError.message); final message = messageParser != null ? messageParser(code, convertMessage) : convertMessage.replaceFirst('(${firebaseError.code})', ''); @@ -96,14 +93,7 @@ FirebaseException _firebaseExceptionFromCoreFirebaseError( bool _testException(Object? objectException) { final exception = objectException! as core_interop.JSError; - // Necessary because of the conditional import - late final String message; - if (exception.message is JSAny) { - message = (exception.message as JSString).toDart; - } else { - // ignore: unnecessary_cast - message = exception.message as String; - } + final message = _safeConvertFromPossibleJSObject(exception.message); // Firestore web does not contain `Firebase` in the message so we check the exception itself. return message.contains('Firebase') || exception.toString().contains('FirebaseError'); diff --git a/packages/_flutterfire_internals/lib/src/interop_shimmer.dart b/packages/_flutterfire_internals/lib/src/interop_shimmer.dart index 24aa05387458..a2d683346b19 100644 --- a/packages/_flutterfire_internals/lib/src/interop_shimmer.dart +++ b/packages/_flutterfire_internals/lib/src/interop_shimmer.dart @@ -12,3 +12,9 @@ abstract class JSError { String get stack; dynamic get serverResponse; } + +abstract class JSAny {} + +abstract class JSString { + String get toDart; +}