From 6f90b092f28cb2e4b7fc91275f61283bf1580709 Mon Sep 17 00:00:00 2001 From: cp-sneha-s Date: Mon, 11 Mar 2024 14:33:41 +0530 Subject: [PATCH] Implement apple login for iOS --- lib/data/services/account_service.dart | 2 +- lib/data/services/auth_service.dart | 16 ----------- lib/style/other/smart_scroll_view.dart | 3 +- .../members/list/member_list_screen.dart | 2 +- lib/ui/sign_in/bloc/sign_in_view_bloc.dart | 15 ++-------- lib/ui/sign_in/bloc/sign_in_view_event.dart | 4 +-- lib/ui/sign_in/bloc/sign_in_view_state.dart | 18 +++++------- lib/ui/sign_in/sign_in_screen.dart | 22 +++++++-------- .../sign_in/widget/apple_signin_button.dart | 7 +++-- .../sign_in/widget/google_signin_button.dart | 7 +++-- pubspec.lock | 28 ++----------------- pubspec.yaml | 2 -- .../authentication/login/login_bloc_test.dart | 3 +- .../space/join_space/join_space_test.dart | 6 ++-- 14 files changed, 38 insertions(+), 97 deletions(-) diff --git a/lib/data/services/account_service.dart b/lib/data/services/account_service.dart index e2f82142..07822218 100644 --- a/lib/data/services/account_service.dart +++ b/lib/data/services/account_service.dart @@ -29,7 +29,7 @@ class AccountService { user = Account( uid: authData.uid, email: authData.email!, - name:name?? authData.displayName); + name: name ?? authData.displayName); await _accountsDb.doc(authData.uid).set(user); } await _setUserSession(authData.uid); diff --git a/lib/data/services/auth_service.dart b/lib/data/services/auth_service.dart index b7a2f699..59c9e9d2 100644 --- a/lib/data/services/auth_service.dart +++ b/lib/data/services/auth_service.dart @@ -3,14 +3,12 @@ import 'dart:convert'; import 'dart:math'; import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:crypto/crypto.dart'; import 'package:firebase_auth/firebase_auth.dart' as firebase_auth; import 'package:flutter/foundation.dart'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:injectable/injectable.dart'; import 'package:oauth2/oauth2.dart'; import 'package:projectunity/data/services/account_service.dart'; -import 'package:sign_in_with_apple/sign_in_with_apple.dart'; import '../model/account/account.dart'; import '../state_manager/auth/desktop/desktop_auth_manager.dart'; @@ -121,20 +119,6 @@ class AuthService { return null; } - String generateNounce([int length = 32]) { - const charset = - '0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._'; - final random = Random.secure(); - return List.generate(length, (_) => charset[random.nextInt(charset.length)]) - .join(); - } - - String sha256ofString(String input) { - final bytes = utf8.encode(input); - final digest = sha256.convert(bytes); - return digest.toString(); - } - Future signOut() async { try { await firebaseAuth.signOut(); diff --git a/lib/style/other/smart_scroll_view.dart b/lib/style/other/smart_scroll_view.dart index d477f9b6..591f5155 100644 --- a/lib/style/other/smart_scroll_view.dart +++ b/lib/style/other/smart_scroll_view.dart @@ -1,4 +1,3 @@ - // A scrollview that supports Spacer to fill the remaining space import 'package:flutter/cupertino.dart'; @@ -33,4 +32,4 @@ class SmartScrollView extends StatelessWidget { }, ); } -} \ No newline at end of file +} diff --git a/lib/ui/admin/members/list/member_list_screen.dart b/lib/ui/admin/members/list/member_list_screen.dart index 75195945..21ec630b 100644 --- a/lib/ui/admin/members/list/member_list_screen.dart +++ b/lib/ui/admin/members/list/member_list_screen.dart @@ -104,7 +104,7 @@ class HeaderDelegate extends SliverPersistentHeaderDelegate { } @override - double get maxExtent => 60; + double get maxExtent => 80; @override double get minExtent => 60; diff --git a/lib/ui/sign_in/bloc/sign_in_view_bloc.dart b/lib/ui/sign_in/bloc/sign_in_view_bloc.dart index bb77eeb9..e6328556 100644 --- a/lib/ui/sign_in/bloc/sign_in_view_bloc.dart +++ b/lib/ui/sign_in/bloc/sign_in_view_bloc.dart @@ -1,20 +1,14 @@ import 'dart:async'; -import 'dart:convert'; -import 'dart:math'; - -import 'package:crypto/crypto.dart'; import 'package:firebase_auth/firebase_auth.dart' as firebase_auth; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:injectable/injectable.dart'; import 'package:projectunity/data/services/account_service.dart'; -import 'package:projectunity/ui/sign_in/widget/apple_signin_button.dart'; import '../../../data/core/exception/error_const.dart'; import '../../../data/model/account/account.dart'; import '../../../data/provider/user_state.dart'; import '../../../data/services/auth_service.dart'; import 'sign_in_view_event.dart'; import 'sign_in_view_state.dart'; -import 'package:sign_in_with_apple/sign_in_with_apple.dart'; @Injectable() class SignInBloc extends Bloc { @@ -31,11 +25,6 @@ class SignInBloc extends Bloc { on(_appleSignIn); } - Future check(Emitter emit) async { - final isAvailable = await SignInWithApple.isAvailable(); - emit(state.copyWith(appleSignInAvailable: isAvailable)); - } - Future _googleSignIn( SignInEvent event, Emitter emit) async { try { @@ -68,8 +57,8 @@ class SignInBloc extends Bloc { emit(state.copyWith(appleSignInLoading: false)); } } on Exception catch (e) { - emit( - state.copyWith(appleSignInLoading: false, error: somethingWentWrongError)); + emit(state.copyWith( + appleSignInLoading: false, error: somethingWentWrongError)); throw Exception(e.toString()); } } diff --git a/lib/ui/sign_in/bloc/sign_in_view_event.dart b/lib/ui/sign_in/bloc/sign_in_view_event.dart index 23909f59..12f353a8 100644 --- a/lib/ui/sign_in/bloc/sign_in_view_event.dart +++ b/lib/ui/sign_in/bloc/sign_in_view_event.dart @@ -1,7 +1,7 @@ import 'package:equatable/equatable.dart'; -abstract class SignInEvent{} +abstract class SignInEvent {} class GoogleSignInEvent extends SignInEvent {} -class AppleSignInEvent extends SignInEvent {} +class AppleSignInEvent extends SignInEvent {} diff --git a/lib/ui/sign_in/bloc/sign_in_view_state.dart b/lib/ui/sign_in/bloc/sign_in_view_state.dart index da5aac34..0e9532e3 100644 --- a/lib/ui/sign_in/bloc/sign_in_view_state.dart +++ b/lib/ui/sign_in/bloc/sign_in_view_state.dart @@ -3,16 +3,12 @@ import 'package:freezed_annotation/freezed_annotation.dart'; part "sign_in_view_state.freezed.dart"; - @freezed -class SignInState with _$SignInState{ - const factory SignInState({ - @Default(false) appleSignInAvailable, - @Default(false) googleSignInLoading, - @Default(false) appleSignInLoading, - @Default(false) signInSuccess, - String? error -}) = _SignInState; +class SignInState with _$SignInState { + const factory SignInState( + {@Default(false) appleSignInAvailable, + @Default(false) googleSignInLoading, + @Default(false) appleSignInLoading, + @Default(false) signInSuccess, + String? error}) = _SignInState; } - - diff --git a/lib/ui/sign_in/sign_in_screen.dart b/lib/ui/sign_in/sign_in_screen.dart index 8d9d2559..3469d65c 100644 --- a/lib/ui/sign_in/sign_in_screen.dart +++ b/lib/ui/sign_in/sign_in_screen.dart @@ -42,7 +42,7 @@ class SignInScreenState extends State { return AppPage( backGroundColor: context.colorScheme.surface, body: BlocListener( - listenWhen: (previous,current)=>current.error != null, + listenWhen: (previous, current) => current.error != null, listener: (context, state) { if (state.error != null) { showSnackBar(context: context, error: state.error); @@ -58,10 +58,13 @@ class SignInScreenState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Image.asset(ImageConst.loginPageVectorImage, - fit: BoxFit.cover, - ), - const SizedBox(height: 50,), + Image.asset( + ImageConst.loginPageVectorImage, + fit: BoxFit.cover, + ), + const SizedBox( + height: 50, + ), Text( context.l10n.sign_in_title_text, textAlign: TextAlign.center, @@ -76,23 +79,20 @@ class SignInScreenState extends State { left: 20.0, right: 20, top: 20, bottom: 40), child: Text( context.l10n.sign_in_description_text, - style: AppTextStyle.style16 - .copyWith(color: context.colorScheme.textSecondary), + style: AppTextStyle.style16.copyWith( + color: context.colorScheme.textSecondary), overflow: TextOverflow.fade, textAlign: TextAlign.center, ), ), - ], - ), ), const GoogleSignInButton(), const SizedBox( height: 20, ), - if(kIsWeb || Platform.isIOS) - const AppleSignInButton() + if (kIsWeb || Platform.isIOS) const AppleSignInButton() ], ), ), diff --git a/lib/ui/sign_in/widget/apple_signin_button.dart b/lib/ui/sign_in/widget/apple_signin_button.dart index dd291ee6..17f83f26 100644 --- a/lib/ui/sign_in/widget/apple_signin_button.dart +++ b/lib/ui/sign_in/widget/apple_signin_button.dart @@ -17,7 +17,8 @@ class AppleSignInButton extends StatelessWidget { @override Widget build(BuildContext context) { return BlocBuilder( - buildWhen: (previous, current) => previous.appleSignInLoading!=current.appleSignInLoading, + buildWhen: (previous, current) => + previous.appleSignInLoading != current.appleSignInLoading, builder: (context, state) { return AppButton( onTap: () => context.read().add(AppleSignInEvent()), @@ -26,7 +27,7 @@ class AppleSignInButton extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Container( - padding: const EdgeInsets.all(5), + padding: const EdgeInsets.all(5), decoration: BoxDecoration( shape: BoxShape.circle, color: context.colorScheme.surface), @@ -48,4 +49,4 @@ class AppleSignInButton extends StatelessWidget { ); }); } -} \ No newline at end of file +} diff --git a/lib/ui/sign_in/widget/google_signin_button.dart b/lib/ui/sign_in/widget/google_signin_button.dart index aafc502f..ac0dabc1 100644 --- a/lib/ui/sign_in/widget/google_signin_button.dart +++ b/lib/ui/sign_in/widget/google_signin_button.dart @@ -18,7 +18,8 @@ class GoogleSignInButton extends StatelessWidget { @override Widget build(BuildContext context) { return BlocBuilder( - buildWhen: (previous, current) => previous.googleSignInLoading != current.googleSignInLoading, + buildWhen: (previous, current) => + previous.googleSignInLoading != current.googleSignInLoading, builder: (context, state) { return AppButton( onTap: () => context.read().add(GoogleSignInEvent()), @@ -27,11 +28,11 @@ class GoogleSignInButton extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Container( - padding: const EdgeInsets.all(5), + padding: const EdgeInsets.all(5), decoration: BoxDecoration( shape: BoxShape.circle, color: context.colorScheme.surface), - child: SvgPicture.asset( + child: SvgPicture.asset( Assets.images.googleLogo, )), const SizedBox( diff --git a/pubspec.lock b/pubspec.lock index 3eca49c0..8efce51b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -250,7 +250,7 @@ packages: source: hosted version: "0.3.3+8" crypto: - dependency: "direct main" + dependency: transitive description: name: crypto sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab @@ -1189,30 +1189,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" - sign_in_with_apple: - dependency: "direct main" - description: - name: sign_in_with_apple - sha256: "3dcc472f6d3ef6915828b4aa536da14df20a6d1fee65c02eaa7e75b5c4f3f599" - url: "https://pub.dev" - source: hosted - version: "6.0.0" - sign_in_with_apple_platform_interface: - dependency: transitive - description: - name: sign_in_with_apple_platform_interface - sha256: a5883edee09ed6be19de19e7d9f618a617fe41a6fa03f76d082dfb787e9ea18d - url: "https://pub.dev" - source: hosted - version: "1.0.0" - sign_in_with_apple_web: - dependency: transitive - description: - name: sign_in_with_apple_web - sha256: ffe74793bc31e7e7cc7e149fe14711a59e50a9cbbb3198e1f67fda92492f7b54 - url: "https://pub.dev" - source: hosted - version: "2.0.0" simple_gesture_detector: dependency: transitive description: @@ -1556,4 +1532,4 @@ packages: version: "3.1.2" sdks: dart: ">=3.3.0 <4.0.0" - flutter: ">=3.19.1" + flutter: ">=3.19.0" diff --git a/pubspec.yaml b/pubspec.yaml index 6c5bf92a..ebf15056 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,7 +20,6 @@ dependencies: cloud_firestore: ^4.5.2 collection: ^1.17.0 connectivity_plus: ^5.0.2 - crypto: device_info_plus: ^9.1.2 equatable: ^2.0.5 freezed: ^2.4.7 @@ -45,7 +44,6 @@ dependencies: package_info_plus: ^5.0.1 rxdart: ^0.27.7 shared_preferences: ^2.1.1 - sign_in_with_apple: ^6.0.0 sticky_headers: ^0.3.0+2 table_calendar: ^3.0.7 url_launcher: ^6.1.11 diff --git a/test/unit_test/authentication/login/login_bloc_test.dart b/test/unit_test/authentication/login/login_bloc_test.dart index 5020dd37..30318e1c 100644 --- a/test/unit_test/authentication/login/login_bloc_test.dart +++ b/test/unit_test/authentication/login/login_bloc_test.dart @@ -36,7 +36,6 @@ void main() { bloc = SignInBloc(userStateNotifier, authService, accountService); }); - group("Log in with google test", () { test("Set initial state on cancel login test", () async { when(authService.signInWithGoogle()).thenAnswer((_) async => null); @@ -59,7 +58,7 @@ void main() { bloc.stream, emitsInOrder([ const SignInState(googleSignInLoading: true), - const SignInState(googleSignInLoading: false,signInSuccess: true), + const SignInState(googleSignInLoading: false, signInSuccess: true), ])); await untilCalled(userStateNotifier.setUser(user)); verify(userStateNotifier.setUser(user)).called(1); diff --git a/test/unit_test/space/join_space/join_space_test.dart b/test/unit_test/space/join_space/join_space_test.dart index 2979d7e5..8e84fac1 100644 --- a/test/unit_test/space/join_space/join_space_test.dart +++ b/test/unit_test/space/join_space/join_space_test.dart @@ -230,8 +230,7 @@ void main() { }); group("sign out test ", () { test("sign out successful test with navigation test", () async { - when(authService.signOut()) - .thenAnswer((_) => Future(() => true)); + when(authService.signOut()).thenAnswer((_) => Future(() => true)); bloc.add(SignOutEvent()); expect( bloc.stream, @@ -244,8 +243,7 @@ void main() { }); test("sign out failure test", () { - when(authService.signOut()) - .thenAnswer((_) => Future(() => false)); + when(authService.signOut()).thenAnswer((_) => Future(() => false)); bloc.add(SignOutEvent()); expect( bloc.stream,