From 942002b073eafca1f4b510b7abc1e0fbb150e66f Mon Sep 17 00:00:00 2001 From: jt274 <47506129+jt274@users.noreply.github.com> Date: Wed, 30 Apr 2025 12:13:58 -0500 Subject: [PATCH 1/4] Expose index to FirestoreItemBuilder Exposes itemBuilder index in FirestoreListView and FirestoreListView.separated to be consistent with flutter ListView.builder and ListView.separated. --- .../firebase_ui_firestore/lib/src/query_builder.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/firebase_ui_firestore/lib/src/query_builder.dart b/packages/firebase_ui_firestore/lib/src/query_builder.dart index e0c9c5fc..22426779 100644 --- a/packages/firebase_ui_firestore/lib/src/query_builder.dart +++ b/packages/firebase_ui_firestore/lib/src/query_builder.dart @@ -4,10 +4,10 @@ import 'dart:async'; +import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_ui_shared/firebase_ui_shared.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:cloud_firestore/cloud_firestore.dart'; /// A function that builds a widget from a [FirestoreQueryBuilderSnapshot] /// @@ -354,6 +354,7 @@ class _Sentinel { typedef FirestoreItemBuilder = Widget Function( BuildContext context, QueryDocumentSnapshot doc, + int index, ); /// A type representing the function passed to [FirestoreListView] for its `loadingBuilder`. @@ -496,7 +497,7 @@ class FirestoreListView extends FirestoreQueryBuilder { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - itemBuilder(context, doc), + itemBuilder(context, doc, index), if (isLastItem && snapshot.hasMore) fetchingIndicatorBuilder?.call(context) ?? const Padding( @@ -513,7 +514,7 @@ class FirestoreListView extends FirestoreQueryBuilder { ], ), ) - : itemBuilder(context, doc); + : itemBuilder(context, doc, index); }, scrollDirection: scrollDirection, reverse: reverse, @@ -606,7 +607,7 @@ class FirestoreListView extends FirestoreQueryBuilder { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - itemBuilder(context, doc), + itemBuilder(context, doc, index), if (isLastItem && snapshot.hasMore) fetchingIndicatorBuilder?.call(context) ?? const Padding( @@ -623,7 +624,7 @@ class FirestoreListView extends FirestoreQueryBuilder { ], ), ) - : itemBuilder(context, doc); + : itemBuilder(context, doc, index); }, separatorBuilder: separatorBuilder, scrollDirection: scrollDirection, From 55fa64c9faee9438337f12d2452a8f3a29039c2f Mon Sep 17 00:00:00 2001 From: jt274 <47506129+jt274@users.noreply.github.com> Date: Wed, 30 Apr 2025 12:36:40 -0500 Subject: [PATCH 2/4] Fix tests, doc, example --- .../firebase_ui_firestore/example/lib/main.dart | 2 +- .../lib/src/query_builder.dart | 2 +- .../firestore_list_view_test.dart | 15 ++++++++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/firebase_ui_firestore/example/lib/main.dart b/packages/firebase_ui_firestore/example/lib/main.dart index 50fe4ed0..2854e830 100644 --- a/packages/firebase_ui_firestore/example/lib/main.dart +++ b/packages/firebase_ui_firestore/example/lib/main.dart @@ -35,7 +35,7 @@ class FirebaseUIFirestoreExample extends StatelessWidget { body: FirestoreListView( query: collection, padding: const EdgeInsets.all(8.0), - itemBuilder: (context, snapshot) { + itemBuilder: (context, snapshot, index) { final user = snapshot.data(); return Column( children: [ diff --git a/packages/firebase_ui_firestore/lib/src/query_builder.dart b/packages/firebase_ui_firestore/lib/src/query_builder.dart index 22426779..3de47c9e 100644 --- a/packages/firebase_ui_firestore/lib/src/query_builder.dart +++ b/packages/firebase_ui_firestore/lib/src/query_builder.dart @@ -413,7 +413,7 @@ typedef FirestoreEmptyBuilder = Widget Function(BuildContext context); /// ```dart /// FirestoreListView( /// query: moviesCollection.orderBy('title'), -/// itemBuilder: (context, snapshot) { +/// itemBuilder: (context, snapshot, index) { /// Movie movie = snapshot.data(); /// return Text(movie.title); /// }, diff --git a/tests/integration_test/firebase_ui_firestore/firestore_list_view_test.dart b/tests/integration_test/firebase_ui_firestore/firestore_list_view_test.dart index 392748f1..f0017754 100644 --- a/tests/integration_test/firebase_ui_firestore/firestore_list_view_test.dart +++ b/tests/integration_test/firebase_ui_firestore/firestore_list_view_test.dart @@ -3,10 +3,11 @@ // BSD-style license that can be found in the LICENSE file. import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_ui_firestore/firebase_ui_firestore.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_ui_firestore/firebase_ui_firestore.dart'; import 'package:mockito/mockito.dart'; + import '../utils.dart'; void main() { @@ -61,7 +62,8 @@ void main() { body: FirestoreListView( query: collection.orderBy('value'), loadingBuilder: (context) => const Text('loading...'), - itemBuilder: (context, snapshot) => throw UnimplementedError(), + itemBuilder: (context, snapshot, index) => + throw UnimplementedError(), ), ), ), @@ -84,7 +86,8 @@ void main() { home: Scaffold( body: FirestoreListView( query: collection.orderBy('value'), - itemBuilder: (context, snapshot) => throw UnimplementedError(), + itemBuilder: (context, snapshot, index) => + throw UnimplementedError(), ), ), ), @@ -105,7 +108,8 @@ void main() { body: FirestoreListView( query: collection, cacheExtent: 0, - itemBuilder: (context, snapshot) => throw UnimplementedError(), + itemBuilder: (context, snapshot, index) => + throw UnimplementedError(), ), ), ), @@ -144,7 +148,7 @@ void main() { cacheExtent: 0, pageSize: 5, itemExtent: size, - itemBuilder: (context, snapshot) { + itemBuilder: (context, snapshot, index) { final v = snapshot.data()['value'] as int; return Container( @@ -208,6 +212,7 @@ class ListViewBuilderSpy extends Mock { Widget call( BuildContext? context, T? snapshot, + int? index, ) { return super.noSuchMethod( Invocation.method(#call, [context, snapshot]), From 767edde2ccfc5dfbc05d8eaa14d7357330bfccb9 Mon Sep 17 00:00:00 2001 From: jt274 <47506129+jt274@users.noreply.github.com> Date: Mon, 28 Jul 2025 09:03:26 -0500 Subject: [PATCH 3/4] Bump cloud_firestore and firebase_core versions --- packages/firebase_ui_firestore/example/pubspec.yaml | 4 ++-- packages/firebase_ui_firestore/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/firebase_ui_firestore/example/pubspec.yaml b/packages/firebase_ui_firestore/example/pubspec.yaml index 17b572e5..f571b635 100644 --- a/packages/firebase_ui_firestore/example/pubspec.yaml +++ b/packages/firebase_ui_firestore/example/pubspec.yaml @@ -30,9 +30,9 @@ dependencies: flutter: sdk: flutter firebase_ui_firestore: ^1.7.2 - cloud_firestore: ^5.6.9 + cloud_firestore: ^6.0.0 cupertino_icons: ^1.0.6 - firebase_core: ^3.14.0 + firebase_core: ^4.0.0 dev_dependencies: drive: ^1.0.0-1.0.nullsafety.5 flutter_test: diff --git a/packages/firebase_ui_firestore/pubspec.yaml b/packages/firebase_ui_firestore/pubspec.yaml index 092345e7..29c70dd9 100644 --- a/packages/firebase_ui_firestore/pubspec.yaml +++ b/packages/firebase_ui_firestore/pubspec.yaml @@ -8,7 +8,7 @@ environment: flutter: ">=3.3.0" dependencies: - cloud_firestore: ^5.6.9 + cloud_firestore: ^6.0.0 firebase_ui_localizations: ^1.14.0 firebase_ui_shared: ^1.4.1 flutter: From 6d64c0a67411f66dd4d1b09fb2e889e59272887c Mon Sep 17 00:00:00 2001 From: jt274 <47506129+jt274@users.noreply.github.com> Date: Mon, 28 Jul 2025 09:52:19 -0500 Subject: [PATCH 4/4] Dependency updates, remove deprecated code --- .../firebase_ui_auth/example/pubspec.yaml | 4 +- .../lib/firebase_ui_auth.dart | 7 +- .../flows/universal_email_sign_in_flow.dart | 50 ------ .../lib/src/providers/auth_provider.dart | 25 +-- .../universal_email_sign_in_screen.dart | 127 --------------- .../views/find_providers_for_email_view.dart | 112 ------------- .../lib/src/widgets/auth_flow_builder.dart | 16 +- packages/firebase_ui_auth/pubspec.yaml | 4 +- .../universal_email_sign_in_flow_test.dart | 154 ------------------ .../firebase_ui_database/example/pubspec.yaml | 4 +- packages/firebase_ui_database/pubspec.yaml | 2 +- .../example/pubspec.yaml | 2 +- .../firebase_ui_oauth/example/pubspec.yaml | 4 +- packages/firebase_ui_oauth/pubspec.yaml | 2 +- packages/firebase_ui_oauth_apple/pubspec.yaml | 2 +- .../firebase_ui_oauth_facebook/pubspec.yaml | 2 +- .../firebase_ui_oauth_google/pubspec.yaml | 2 +- .../firebase_ui_oauth_twitter/pubspec.yaml | 2 +- .../firebase_ui_storage/example/pubspec.yaml | 4 +- packages/firebase_ui_storage/pubspec.yaml | 2 +- .../firebase_ui_auth_e2e.dart | 7 +- .../universal_email_sign_in_screen_test.dart | 126 -------------- tests/pubspec.yaml | 8 +- 23 files changed, 29 insertions(+), 639 deletions(-) delete mode 100644 packages/firebase_ui_auth/lib/src/flows/universal_email_sign_in_flow.dart delete mode 100644 packages/firebase_ui_auth/lib/src/screens/universal_email_sign_in_screen.dart delete mode 100644 packages/firebase_ui_auth/lib/src/views/find_providers_for_email_view.dart delete mode 100644 packages/firebase_ui_auth/test/flows/universal_email_sign_in_flow_test.dart delete mode 100644 tests/integration_test/firebase_ui_auth/universal_email_sign_in_screen_test.dart diff --git a/packages/firebase_ui_auth/example/pubspec.yaml b/packages/firebase_ui_auth/example/pubspec.yaml index 2e04821f..6ac6532b 100644 --- a/packages/firebase_ui_auth/example/pubspec.yaml +++ b/packages/firebase_ui_auth/example/pubspec.yaml @@ -22,8 +22,8 @@ environment: dependencies: cupertino_icons: ^1.0.6 - firebase_auth: ^5.7.0 - firebase_core: ^3.15.2 + firebase_auth: ^6.0.0 + firebase_core: ^4.0.0 flutter: sdk: flutter flutter_localizations: diff --git a/packages/firebase_ui_auth/lib/firebase_ui_auth.dart b/packages/firebase_ui_auth/lib/firebase_ui_auth.dart index 38277d3b..8a704b38 100644 --- a/packages/firebase_ui_auth/lib/firebase_ui_auth.dart +++ b/packages/firebase_ui_auth/lib/firebase_ui_auth.dart @@ -7,12 +7,12 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_ui_oauth/firebase_ui_oauth.dart'; import 'package:flutter/widgets.dart'; -export 'package:firebase_ui_shared/firebase_ui_shared.dart' show ButtonVariant; - import 'src/actions.dart'; import 'src/oauth_providers.dart'; import 'src/providers/auth_provider.dart'; +export 'package:firebase_ui_shared/firebase_ui_shared.dart' show ButtonVariant; + export 'src/actions.dart'; export 'src/auth_controller.dart' show AuthAction, AuthController; export 'src/auth_flow.dart'; @@ -37,7 +37,6 @@ export 'src/flows/email_flow.dart'; export 'src/flows/email_link_flow.dart'; export 'src/flows/oauth_flow.dart' show OAuthController, OAuthFlow; export 'src/flows/phone_auth_flow.dart'; -export 'src/flows/universal_email_sign_in_flow.dart'; // ignore_for_file: use_build_context_synchronously export 'src/mfa.dart' show startMFAVerification; @@ -62,12 +61,10 @@ export 'src/screens/profile_screen.dart' show ProfileScreen; export 'src/screens/register_screen.dart'; export 'src/screens/sign_in_screen.dart'; export 'src/screens/sms_code_input_screen.dart'; -export 'src/screens/universal_email_sign_in_screen.dart'; export 'src/styling/style.dart' show FirebaseUIStyle; export 'src/styling/theme.dart' show FirebaseUITheme; export 'src/views/different_method_sign_in_view.dart'; export 'src/views/email_link_sign_in_view.dart'; -export 'src/views/find_providers_for_email_view.dart'; export 'src/views/forgot_password_view.dart'; export 'src/views/login_view.dart'; export 'src/views/phone_input_view.dart'; diff --git a/packages/firebase_ui_auth/lib/src/flows/universal_email_sign_in_flow.dart b/packages/firebase_ui_auth/lib/src/flows/universal_email_sign_in_flow.dart deleted file mode 100644 index f2565327..00000000 --- a/packages/firebase_ui_auth/lib/src/flows/universal_email_sign_in_flow.dart +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2022, the Chromium project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'package:firebase_ui_auth/firebase_ui_auth.dart'; - -/// A controller interface of the [UniversalEmailSignInFlow]. -@Deprecated( - 'Email enumeration protection is on by default.' - 'Read more here https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection', -) -abstract class UniversalEmailSignInController extends AuthController { - /// {@template ui.auth.auth_controller.find_providers_for_email} - /// Finds providers that can be used to sign in with a provided email. - /// Calls [AuthListener.onBeforeProvidersForEmailFetch], if request succeded – - /// [AuthListener.onDifferentProvidersFound] is called and - /// [AuthListener.onError] if failed. - /// {@endtemplate} - void findProvidersForEmail(String email); -} - -/// {@template ui.auth.flows.universal_email_sign_in_flow} -/// An auth flow that resolves providers that are accosicatied with the given -/// email. -/// {@endtemplate} -@Deprecated( - 'Email enumeration protection is on by default.' - 'Read more here https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection', -) -class UniversalEmailSignInFlow extends AuthFlow - implements UniversalEmailSignInController, UniversalEmailSignInListener { - // {@macro ui.auth.flows.universal_email_sign_in_flow} - UniversalEmailSignInFlow({ - /// {@macro ui.auth.auth_flow.ctor.provider} - required super.provider, - - /// {@macro ui.auth.auth_controller.auth} - super.auth, - - /// {@macro ui.auth.auth_action} - super.action, - }) : super( - initialState: const Uninitialized(), - ); - - @override - void findProvidersForEmail(String email) { - provider.findProvidersForEmail(email); - } -} diff --git a/packages/firebase_ui_auth/lib/src/providers/auth_provider.dart b/packages/firebase_ui_auth/lib/src/providers/auth_provider.dart index ea905f32..ddd53ad7 100644 --- a/packages/firebase_ui_auth/lib/src/providers/auth_provider.dart +++ b/packages/firebase_ui_auth/lib/src/providers/auth_provider.dart @@ -3,8 +3,8 @@ // BSD-style license that can be found in the LICENSE file. import 'package:firebase_auth/firebase_auth.dart' as fba; -import 'package:flutter/material.dart'; import 'package:firebase_ui_auth/firebase_ui_auth.dart'; +import 'package:flutter/material.dart'; /// Default error handler that starts MFA flow /// if [FirebaseAuthMultiFactorException] is thrown. @@ -134,29 +134,6 @@ abstract class AuthProvider authListener.onDifferentProvidersFound( - email, - methods, - credential, - ), - ) - .catchError(authListener.onError); - } - /// {@template ui.auth.auth_provider.on_credential_received} /// A method that is called when the user has successfully completed the /// authentication process and decides what to do with the obtained diff --git a/packages/firebase_ui_auth/lib/src/screens/universal_email_sign_in_screen.dart b/packages/firebase_ui_auth/lib/src/screens/universal_email_sign_in_screen.dart deleted file mode 100644 index 03fe2573..00000000 --- a/packages/firebase_ui_auth/lib/src/screens/universal_email_sign_in_screen.dart +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2022, the Chromium project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'package:firebase_ui_shared/firebase_ui_shared.dart'; -import 'package:flutter/material.dart'; -import 'package:firebase_ui_auth/firebase_ui_auth.dart'; -import '../widgets/internal/universal_page_route.dart'; -import 'internal/multi_provider_screen.dart'; - -/// A screen that allows to resolve previously used providers for a given email. -@Deprecated( - 'Email enumeration protection is on by default.' - 'Read more here https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection', -) -class UniversalEmailSignInScreen extends MultiProviderScreen { - /// A callback that is being called when providers fetch request completed. - final ProvidersFoundCallback? onProvidersFound; - - const UniversalEmailSignInScreen({ - super.key, - - /// {@macro ui.auth.auth_controller.auth} - super.auth, - - /// A list of all supported auth providers - super.providers, - this.onProvidersFound, - }) : assert(onProvidersFound != null || providers != null); - - Widget _wrap(BuildContext context, Widget child) { - return AuthStateListener( - child: FirebaseUIActions.inherit( - from: context, - child: child, - ), - listener: (_, newState, controller) { - if (newState is SignedIn) { - Navigator.of(context).pop(); - } - return null; - }, - ); - } - - void _defaultAction( - BuildContext context, - String email, - List providerIds, - ) { - late Route route; - - if (providerIds.isEmpty) { - route = createPageRoute( - context: context, - builder: (context) => _wrap( - context, - RegisterScreen( - showAuthActionSwitch: false, - providers: providers, - auth: auth, - email: email, - ), - ), - ); - } else { - final providersMap = providers.fold>( - {}, - (acc, element) { - return { - ...acc, - element.providerId: element, - }; - }, - ); - - final authorizedProviders = providerIds - .where(providersMap.containsKey) - .map((id) => providersMap[id]!) - .toList(); - - route = createPageRoute( - context: context, - builder: (context) => _wrap( - context, - SignInScreen( - showAuthActionSwitch: false, - providers: authorizedProviders, - auth: auth, - email: email, - ), - ), - ); - } - - Navigator.of(context).push(route); - } - - @override - Widget build(BuildContext context) { - final content = FindProvidersForEmailView( - auth: auth, - onProvidersFound: onProvidersFound ?? - (email, providers) => _defaultAction(context, email, providers), - ); - - return UniversalScaffold( - body: Center( - child: LayoutBuilder( - builder: (context, constraints) { - if (constraints.biggest.width < 500) { - return Padding( - padding: const EdgeInsets.all(20), - child: content, - ); - } else { - return ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 500), - child: content, - ); - } - }, - ), - ), - ); - } -} diff --git a/packages/firebase_ui_auth/lib/src/views/find_providers_for_email_view.dart b/packages/firebase_ui_auth/lib/src/views/find_providers_for_email_view.dart deleted file mode 100644 index 63b1925d..00000000 --- a/packages/firebase_ui_auth/lib/src/views/find_providers_for_email_view.dart +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2022, the Chromium project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'package:firebase_auth/firebase_auth.dart' as fba; -import 'package:firebase_ui_shared/firebase_ui_shared.dart'; -import 'package:flutter/material.dart' hide Title; -import 'package:firebase_ui_auth/firebase_ui_auth.dart'; -import 'package:firebase_ui_localizations/firebase_ui_localizations.dart'; - -import '../widgets/internal/title.dart'; - -/// A callback that is being called when providers fetch request is completed. -@Deprecated( - 'Email enumeration protection is on by default.' - 'Read more here https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection', -) -typedef ProvidersFoundCallback = void Function( - String email, - List providers, -); - -/// {@template ui.auth.views.find_providers_for_email_view} -/// A view that could be used to build a custom [UniversalEmailSignInScreen]. -/// {@endtemplate} -@Deprecated( - 'Email enumeration protection is on by default.' - 'Read more here https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection', -) -class FindProvidersForEmailView extends StatefulWidget { - final ProvidersFoundCallback? onProvidersFound; - - /// {@macro ui.auth.auth_controller.auth} - final fba.FirebaseAuth? auth; - - /// {@macro ui.auth.views.find_providers_for_email_view} - const FindProvidersForEmailView({ - super.key, - this.onProvidersFound, - this.auth, - }); - - @override - State createState() => - _FindProvidersForEmailViewState(); -} - -@Deprecated( - 'Email enumeration protection is on by default.' - 'Read more here https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection', -) -class _FindProvidersForEmailViewState extends State { - final formKey = GlobalKey(); - final emailCtrl = TextEditingController(); - - late final flow = UniversalEmailSignInFlow( - provider: UniversalEmailSignInProvider(), - auth: widget.auth, - ); - - void _submit(UniversalEmailSignInController ctrl, String email) { - if (formKey.currentState!.validate()) { - ctrl.findProvidersForEmail(email); - } - } - - @override - Widget build(BuildContext context) { - final l = FirebaseUILocalizations.labelsOf(context); - const spacer = SizedBox(height: 24); - - return AuthFlowBuilder( - auth: widget.auth, - flow: flow, - listener: (oldState, newState, controller) { - if (newState is DifferentSignInMethodsFound) { - widget.onProvidersFound?.call( - emailCtrl.text, - newState.methods, - ); - } - }, - builder: (context, state, ctrl, child) => Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Title( - text: l.findProviderForEmailTitleText, - ), - spacer, - Form( - key: formKey, - child: EmailInput( - controller: emailCtrl, - onSubmitted: (_) { - _submit(ctrl, emailCtrl.text); - }, - ), - ), - spacer, - LoadingButton( - isLoading: state is FetchingProvidersForEmail, - label: l.continueText, - onTap: () { - _submit(ctrl, emailCtrl.text); - }, - ) - ], - ), - ); - } -} diff --git a/packages/firebase_ui_auth/lib/src/widgets/auth_flow_builder.dart b/packages/firebase_ui_auth/lib/src/widgets/auth_flow_builder.dart index bd9b086d..fd851ddb 100644 --- a/packages/firebase_ui_auth/lib/src/widgets/auth_flow_builder.dart +++ b/packages/firebase_ui_auth/lib/src/widgets/auth_flow_builder.dart @@ -2,10 +2,10 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'package:firebase_ui_auth/firebase_ui_auth.dart'; -import 'package:flutter/widgets.dart'; import 'package:firebase_auth/firebase_auth.dart' as fba; +import 'package:firebase_ui_auth/firebase_ui_auth.dart'; import 'package:firebase_ui_oauth/firebase_ui_oauth.dart'; +import 'package:flutter/widgets.dart'; import '../auth_controller.dart'; import '../auth_state.dart'; @@ -225,11 +225,6 @@ class _AuthFlowBuilderState return EmailAuthProvider(); case PhoneAuthController: return PhoneAuthProvider(); - - // ignore: deprecated_member_use_from_same_package - case UniversalEmailSignInController: - // ignore: deprecated_member_use_from_same_package - return UniversalEmailSignInProvider(); default: throw Exception("Can't create $T provider"); } @@ -269,13 +264,6 @@ class _AuthFlowBuilderState auth: widget.auth, ); // ignore: deprecated_member_use_from_same_package - } else if (provider is UniversalEmailSignInProvider) { - // ignore: deprecated_member_use_from_same_package - return UniversalEmailSignInFlow( - provider: provider, - action: widget.action, - auth: widget.auth, - ); } else { throw Exception('Unknown provider $provider'); } diff --git a/packages/firebase_ui_auth/pubspec.yaml b/packages/firebase_ui_auth/pubspec.yaml index acc48d96..5da9a067 100644 --- a/packages/firebase_ui_auth/pubspec.yaml +++ b/packages/firebase_ui_auth/pubspec.yaml @@ -11,8 +11,8 @@ environment: dependencies: app_links: ^6.4.0 email_validator: ^2.1.17 - firebase_auth: ^5.7.0 - firebase_core: ^3.15.2 + firebase_auth: ^6.0.0 + firebase_core: ^4.0.0 firebase_ui_localizations: ^1.14.0 firebase_ui_oauth: ^1.7.0 firebase_ui_shared: ^1.4.1 diff --git a/packages/firebase_ui_auth/test/flows/universal_email_sign_in_flow_test.dart b/packages/firebase_ui_auth/test/flows/universal_email_sign_in_flow_test.dart deleted file mode 100644 index b84fc2cb..00000000 --- a/packages/firebase_ui_auth/test/flows/universal_email_sign_in_flow_test.dart +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright 2022, the Chromium project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// ignore_for_file: deprecated_member_use_from_same_package - -import 'package:firebase_auth/firebase_auth.dart' as fba; -import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_ui_auth/firebase_ui_auth.dart'; -import 'package:mockito/mockito.dart'; - -import '../test_utils.dart'; - -void main() { - late UniversalEmailSignInProvider provider; - late MockAuth auth; - late MockListener listener; - - setUp(() { - auth = MockAuth(); - listener = MockListener(); - - provider = UniversalEmailSignInProvider(); - provider.auth = auth; - provider.authListener = listener; - }); - - group('UniversalEmailSignInProvider', () { - test('has correct provider id', () { - expect(provider.providerId, 'universal_email_sign_in'); - }); - - group('#findProvidersForEmail', () { - test('calls fba.FirebaseAuth#fetchSignInMethodsForEmail', () { - provider.findProvidersForEmail('test@test.com'); - final invocation = verify(auth.fetchSignInMethodsForEmail(captureAny)); - - expect(invocation.callCount, 1); - expect(invocation.captured, ['test@test.com']); - }); - - test( - 'calls onBeforeProvidersForEmailFetch', - () { - provider.findProvidersForEmail('test@test.com'); - verify(listener.onBeforeProvidersForEmailFetch()).called(1); - }, - ); - - test('calls onDifferentProvidersFound', () async { - provider.findProvidersForEmail('test@test.com'); - await untilCalled(listener.onBeforeProvidersForEmailFetch()); - - final invocation = verify( - listener.onDifferentProvidersFound( - captureAny, - captureAny, - captureAny, - ), - ); - - invocation.called(1); - - expect(invocation.captured, [ - 'test@test.com', - ['phone'], - null, - ]); - }); - - test('calls onError if an error occured', () async { - final exception = TestException(); - when(auth.fetchSignInMethodsForEmail(any)).thenThrow(exception); - - provider.findProvidersForEmail('test@test.com'); - await untilCalled(listener.onError(any)); - - final invocation = verify(listener.onError(captureAny)); - - expect(invocation.callCount, 1); - expect(invocation.captured, [exception]); - }); - }); - - group('UniversalEmailSignInController', () { - group('#findProvidersForEmail', () { - test( - 'calls UniversalEmailSignInProvider#findProvidersForEmail', - () async { - final provider = MockProvider(); - - UniversalEmailSignInController ctrl = UniversalEmailSignInFlow( - provider: provider, - auth: auth, - ); - - ctrl.findProvidersForEmail('test@test.com'); - final invocation = verify( - provider.findProvidersForEmail(captureAny), - ); - - expect(invocation.callCount, 1); - expect(invocation.captured, ['test@test.com']); - }, - ); - }); - }); - }); -} - -class MockListener extends Mock implements UniversalEmailSignInListener { - @override - void onBeforeProvidersForEmailFetch() { - super.noSuchMethod( - Invocation.method(#onBeforeProvidersForEmailFetch, null), - ); - } - - @override - void onDifferentProvidersFound( - String? email, - List? providers, - fba.AuthCredential? credential, - ) { - super.noSuchMethod( - Invocation.method( - #onDifferentProvidersFound, - [email, providers, credential], - ), - ); - } - - @override - void onError(Object? error) { - super.noSuchMethod( - Invocation.method(#onError, [error]), - ); - } -} - -class MockProvider extends Mock implements UniversalEmailSignInProvider { - @override - void findProvidersForEmail( - String? email, [ - fba.AuthCredential? credential, - ]) { - super.noSuchMethod( - Invocation.method( - #findProvidersForEmail, - [email, credential], - ), - ); - } -} diff --git a/packages/firebase_ui_database/example/pubspec.yaml b/packages/firebase_ui_database/example/pubspec.yaml index fee2d6a8..6bf4a442 100644 --- a/packages/firebase_ui_database/example/pubspec.yaml +++ b/packages/firebase_ui_database/example/pubspec.yaml @@ -33,8 +33,8 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.6 - firebase_core: ^3.15.2 - firebase_database: ^11.3.10 + firebase_core: ^4.0.0 + firebase_database: ^12.0.0 dev_dependencies: drive: ^1.0.0-1.0.nullsafety.5 flutter_test: diff --git a/packages/firebase_ui_database/pubspec.yaml b/packages/firebase_ui_database/pubspec.yaml index 342339e0..3c35ffca 100644 --- a/packages/firebase_ui_database/pubspec.yaml +++ b/packages/firebase_ui_database/pubspec.yaml @@ -9,7 +9,7 @@ environment: dependencies: collection: ^1.18.0 - firebase_database: ^11.3.10 + firebase_database: ^12.0.0 firebase_ui_localizations: ^1.14.0 flutter: sdk: flutter diff --git a/packages/firebase_ui_localizations/example/pubspec.yaml b/packages/firebase_ui_localizations/example/pubspec.yaml index 5edeebf7..c334d2a6 100644 --- a/packages/firebase_ui_localizations/example/pubspec.yaml +++ b/packages/firebase_ui_localizations/example/pubspec.yaml @@ -31,7 +31,7 @@ environment: dependencies: cupertino_icons: ^1.0.6 - firebase_core: ^3.15.2 + firebase_core: ^4.0.0 firebase_ui_auth: ^1.17.0 firebase_ui_localizations: ^1.14.0 flutter: diff --git a/packages/firebase_ui_oauth/example/pubspec.yaml b/packages/firebase_ui_oauth/example/pubspec.yaml index e7ddbb7d..1133b9a2 100644 --- a/packages/firebase_ui_oauth/example/pubspec.yaml +++ b/packages/firebase_ui_oauth/example/pubspec.yaml @@ -33,8 +33,8 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.6 - firebase_auth: ^5.7.0 - firebase_core: ^3.15.2 + firebase_auth: ^6.0.0 + firebase_core: ^4.0.0 firebase_ui_oauth: ^1.7.0 firebase_ui_oauth_apple: ^1.3.2 firebase_ui_oauth_facebook: ^1.3.2 diff --git a/packages/firebase_ui_oauth/pubspec.yaml b/packages/firebase_ui_oauth/pubspec.yaml index a31fe981..c1729b93 100644 --- a/packages/firebase_ui_oauth/pubspec.yaml +++ b/packages/firebase_ui_oauth/pubspec.yaml @@ -9,7 +9,7 @@ environment: dependencies: desktop_webview_auth: ^0.0.14 - firebase_auth: ^5.7.0 + firebase_auth: ^6.0.0 firebase_ui_auth: ^1.17.0 firebase_ui_shared: ^1.4.1 flutter_svg: ^2.0.9 diff --git a/packages/firebase_ui_oauth_apple/pubspec.yaml b/packages/firebase_ui_oauth_apple/pubspec.yaml index d29ab4fd..731d72ac 100644 --- a/packages/firebase_ui_oauth_apple/pubspec.yaml +++ b/packages/firebase_ui_oauth_apple/pubspec.yaml @@ -8,7 +8,7 @@ environment: flutter: ">=3.3.0" dependencies: - firebase_auth: ^5.7.0 + firebase_auth: ^6.0.0 firebase_ui_oauth: ^1.7.0 flutter: sdk: flutter diff --git a/packages/firebase_ui_oauth_facebook/pubspec.yaml b/packages/firebase_ui_oauth_facebook/pubspec.yaml index 39bbaa5f..980da9df 100644 --- a/packages/firebase_ui_oauth_facebook/pubspec.yaml +++ b/packages/firebase_ui_oauth_facebook/pubspec.yaml @@ -8,7 +8,7 @@ environment: flutter: ">=3.3.0" dependencies: - firebase_auth: ^5.7.0 + firebase_auth: ^6.0.0 firebase_ui_oauth: ^1.7.0 flutter: sdk: flutter diff --git a/packages/firebase_ui_oauth_google/pubspec.yaml b/packages/firebase_ui_oauth_google/pubspec.yaml index cdf1c0a5..507f9141 100644 --- a/packages/firebase_ui_oauth_google/pubspec.yaml +++ b/packages/firebase_ui_oauth_google/pubspec.yaml @@ -8,7 +8,7 @@ environment: flutter: ">=3.3.0" dependencies: - firebase_auth: ^5.7.0 + firebase_auth: ^6.0.0 firebase_ui_oauth: ^1.7.0 flutter: sdk: flutter diff --git a/packages/firebase_ui_oauth_twitter/pubspec.yaml b/packages/firebase_ui_oauth_twitter/pubspec.yaml index df6550f5..5187b771 100644 --- a/packages/firebase_ui_oauth_twitter/pubspec.yaml +++ b/packages/firebase_ui_oauth_twitter/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - firebase_auth: ^5.7.0 + firebase_auth: ^6.0.0 firebase_ui_oauth: ^1.7.0 twitter_login: ^4.4.2 diff --git a/packages/firebase_ui_storage/example/pubspec.yaml b/packages/firebase_ui_storage/example/pubspec.yaml index 0df1467c..46873c7c 100644 --- a/packages/firebase_ui_storage/example/pubspec.yaml +++ b/packages/firebase_ui_storage/example/pubspec.yaml @@ -9,8 +9,8 @@ environment: dependencies: cupertino_icons: ^1.0.6 file_picker: ^6.1.1 - firebase_core: ^3.15.2 - firebase_storage: ^12.4.10 + firebase_core: ^4.0.0 + firebase_storage: ^13.0.0 firebase_ui_storage: ^2.1.2 firebase_ui_shared: ^1.4.1 diff --git a/packages/firebase_ui_storage/pubspec.yaml b/packages/firebase_ui_storage/pubspec.yaml index 8e75029f..66802252 100644 --- a/packages/firebase_ui_storage/pubspec.yaml +++ b/packages/firebase_ui_storage/pubspec.yaml @@ -13,7 +13,7 @@ false_secrets: dependencies: flutter: sdk: flutter - firebase_storage: ^12.4.10 + firebase_storage: ^13.0.0 firebase_ui_localizations: ^1.14.0 firebase_ui_shared: ^1.4.1 path: ^1.8.3 diff --git a/tests/integration_test/firebase_ui_auth/firebase_ui_auth_e2e.dart b/tests/integration_test/firebase_ui_auth/firebase_ui_auth_e2e.dart index 542e86d1..8c4e3284 100644 --- a/tests/integration_test/firebase_ui_auth/firebase_ui_auth_e2e.dart +++ b/tests/integration_test/firebase_ui_auth/firebase_ui_auth_e2e.dart @@ -5,19 +5,16 @@ import 'package:flutter/foundation.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'actions_test.dart' as actions; import 'email_form_test.dart' as email_form; import 'email_link_sign_in_view_test.dart' as email_link_sign_in_view; -import 'universal_email_sign_in_screen_test.dart' - as universal_email_sign_in_screen; -import 'phone_verification_test.dart' as phone_verification; import 'layout_test.dart' as layout; -import 'actions_test.dart' as actions; +import 'phone_verification_test.dart' as phone_verification; Future main() async { group('Auth', () { email_form.main(); email_link_sign_in_view.main(); - universal_email_sign_in_screen.main(); actions.main(); switch (defaultTargetPlatform) { diff --git a/tests/integration_test/firebase_ui_auth/universal_email_sign_in_screen_test.dart b/tests/integration_test/firebase_ui_auth/universal_email_sign_in_screen_test.dart deleted file mode 100644 index ac938c04..00000000 --- a/tests/integration_test/firebase_ui_auth/universal_email_sign_in_screen_test.dart +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2022, the Chromium project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -// ignore_for_file: deprecated_member_use - -import 'package:firebase_auth/firebase_auth.dart' as fba; -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_ui_auth/firebase_ui_auth.dart'; -import 'package:firebase_ui_localizations/firebase_ui_localizations.dart'; -import 'package:firebase_ui_oauth_google/firebase_ui_oauth_google.dart'; -import 'package:mockito/mockito.dart'; - -import '../utils.dart'; - -void main() { - const labels = DefaultLocalizations(); - - group('UniversalEmailSignInScreen', () { - testWidgets('validates email', (tester) async { - await render( - tester, - UniversalEmailSignInScreen( - providers: [ - EmailAuthProvider(), - PhoneAuthProvider(), - GoogleProvider(clientId: 'test-client-id'), - ], - ), - ); - - await tester.pump(); - - final input = find.byType(TextField); - expect(input, findsOneWidget); - - await tester.enterText(input, 'notavalidemail'); - await tester.testTextInput.receiveAction(TextInputAction.done); - - await tester.pumpAndSettle(); - - expect(find.text(labels.isNotAValidEmailErrorText), findsOneWidget); - }); - - testWidgets('shows RegisterScreen if no providers found', (tester) async { - await render( - tester, - UniversalEmailSignInScreen( - providers: [ - EmailAuthProvider(), - PhoneAuthProvider(), - GoogleProvider(clientId: 'test-client-id'), - ], - ), - ); - - await tester.pump(); - - final input = find.byType(TextField); - expect(input, findsOneWidget); - - await tester.enterText(input, 'test@test.com'); - await tester.testTextInput.receiveAction(TextInputAction.done); - - await tester.pumpAndSettle(); - - expect(find.byType(RegisterScreen), findsOneWidget); - }); - - testWidgets('shows SignInScreen with only available providers', - (tester) async { - await render( - tester, - UniversalEmailSignInScreen( - auth: MockAuth(), - providers: [ - EmailAuthProvider(), - PhoneAuthProvider(), - GoogleProvider(clientId: 'test-client-id'), - ], - ), - ); - - await tester.pump(); - - final input = find.byType(TextField); - expect(input, findsOneWidget); - - await tester.enterText(input, 'test@test.com'); - await tester.testTextInput.receiveAction(TextInputAction.done); - - await tester.pumpAndSettle(); - - expect(find.byType(SignInScreen), findsOneWidget); - - if (PhoneAuthProvider().supportsPlatform(defaultTargetPlatform)) { - expect(find.text(labels.signInWithPhoneButtonText), findsOneWidget); - } - expect(find.text(labels.signInWithGoogleButtonText), findsOneWidget); - expect(find.byType(EmailForm), findsNothing); - }); - }); -} - -// ignore: avoid_implementing_value_types -class MockApp extends Mock implements FirebaseApp {} - -class MockAuth extends Mock implements fba.FirebaseAuth { - @override - FirebaseApp get app => MockApp(); - - @override - Future> fetchSignInMethodsForEmail(String? email) async { - return super.noSuchMethod( - Invocation.method( - #fetchSignInMethodsForEmail, - [email], - ), - returnValue: ['phone', 'google.com'], - returnValueForMissingStub: ['phone', 'google.com'], - ); - } -} diff --git a/tests/pubspec.yaml b/tests/pubspec.yaml index 3f95a5c6..62a68d8c 100644 --- a/tests/pubspec.yaml +++ b/tests/pubspec.yaml @@ -10,8 +10,8 @@ dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.6 - firebase_auth: ^5.7.0 - firebase_core: ^3.15.2 + firebase_auth: ^6.0.0 + firebase_core: ^4.0.0 firebase_ui_auth: ^1.17.0 firebase_ui_localizations: ^1.14.0 firebase_ui_oauth_apple: ^1.3.2 @@ -21,12 +21,12 @@ dependencies: flutter_facebook_auth: ^6.0.3 twitter_login: ^4.4.2 firebase_ui_oauth_twitter: ^1.3.2 - cloud_firestore: ^5.6.12 + cloud_firestore: ^6.0.0 firebase_ui_firestore: ^1.7.2 http: ^1.1.2 google_sign_in: ^6.2.1 firebase_ui_shared: ^1.4.1 - firebase_database: ^11.3.10 + firebase_database: ^12.0.0 firebase_ui_database: ^1.5.2 dev_dependencies: