Skip to content

Commit d6b3ed6

Browse files
authored
Merge pull request #501 from DevKor-github/codexd/fix-google-login-session
[codex] Fix Google login session flow
2 parents f6291a0 + be93528 commit d6b3ed6

2 files changed

Lines changed: 51 additions & 23 deletions

File tree

lib/data/repositories/user_repository_impl.dart

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:async';
22

33
import 'package:dio/dio.dart';
4+
import 'package:flutter/foundation.dart';
45
import 'package:google_sign_in/google_sign_in.dart';
56
import 'package:injectable/injectable.dart';
67
import 'package:on_time_front/core/logging/app_logger.dart';
@@ -15,6 +16,8 @@ import 'package:rxdart/subjects.dart';
1516

1617
@Singleton(as: UserRepository)
1718
class UserRepositoryImpl implements UserRepository {
19+
static const _googleIosClientId =
20+
'456571312261-r35ah9qi0qaq7al007e2db0e0jmjcmb4.apps.googleusercontent.com';
1821
static const _googleServerClientId =
1922
'456571312261-5kuf2r6i5i7lqjr7qealv06sdgkn3hcp.apps.googleusercontent.com';
2023
static const _googleScopes = ['email', 'profile'];
@@ -45,17 +48,10 @@ class UserRepositoryImpl implements UserRepository {
4548
}
4649

4750
Future<void> _initializeGoogleSignIn() async {
48-
await _googleSignIn.initialize(serverClientId: _googleServerClientId);
49-
final lightweightAuthentication = _googleSignIn
50-
.attemptLightweightAuthentication();
51-
if (lightweightAuthentication != null) {
52-
unawaited(
53-
lightweightAuthentication.catchError((Object error) {
54-
AppLogger.debug('Google lightweight sign-in failed: $error');
55-
return null;
56-
}),
57-
);
58-
}
51+
await _googleSignIn.initialize(
52+
clientId: _googleClientId,
53+
serverClientId: _googleServerClientId,
54+
);
5955
}
6056

6157
@override
@@ -241,4 +237,11 @@ class UserRepositoryImpl implements UserRepository {
241237
@override
242238
Stream<UserEntity> get userStream =>
243239
_userStreamController.asBroadcastStream();
240+
241+
String? get _googleClientId {
242+
if (kIsWeb) return null;
243+
return defaultTargetPlatform == TargetPlatform.iOS
244+
? _googleIosClientId
245+
: null;
246+
}
244247
}

lib/presentation/login/components/google_sign_in_button/google_sign_in_button_mobile.dart

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,56 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
23
import 'package:flutter_svg/svg.dart';
34
import 'package:on_time_front/core/di/di_setup.dart';
45
import 'package:on_time_front/core/logging/app_logger.dart';
56
import 'package:on_time_front/domain/repositories/user_repository.dart';
7+
import 'package:on_time_front/presentation/app/bloc/auth/auth_bloc.dart';
68

7-
class GoogleSignInButton extends StatelessWidget {
9+
class GoogleSignInButton extends StatefulWidget {
810
const GoogleSignInButton({super.key});
911

12+
@override
13+
State<GoogleSignInButton> createState() => _GoogleSignInButtonState();
14+
}
15+
16+
class _GoogleSignInButtonState extends State<GoogleSignInButton> {
17+
bool _isSigningIn = false;
18+
1019
@override
1120
Widget build(BuildContext context) {
1221
final UserRepository authenticationRepository = getIt.get<UserRepository>();
22+
final canSignIn = context.select<AuthBloc, bool>(
23+
(bloc) => bloc.state.status == AuthStatus.unauthenticated,
24+
);
1325

1426
return SizedBox(
1527
width: 358,
1628
height: 54,
1729
child: ElevatedButton(
18-
onPressed: () async {
19-
try {
20-
final googleAccount = await authenticationRepository
21-
.authenticateWithGoogle();
22-
await authenticationRepository.signInWithGoogle(googleAccount);
23-
} catch (error) {
24-
AppLogger.debug(
25-
'Google Sign-In button failed errorType=${error.runtimeType}',
26-
);
27-
}
28-
},
30+
onPressed: !canSignIn || _isSigningIn
31+
? null
32+
: () async {
33+
setState(() {
34+
_isSigningIn = true;
35+
});
36+
try {
37+
final googleAccount = await authenticationRepository
38+
.authenticateWithGoogle();
39+
await authenticationRepository.signInWithGoogle(
40+
googleAccount,
41+
);
42+
} catch (error) {
43+
AppLogger.debug(
44+
'Google Sign-In button failed errorType=${error.runtimeType}',
45+
);
46+
} finally {
47+
if (mounted) {
48+
setState(() {
49+
_isSigningIn = false;
50+
});
51+
}
52+
}
53+
},
2954
style: ElevatedButton.styleFrom(
3055
backgroundColor: Colors.white,
3156
foregroundColor: Colors.black,

0 commit comments

Comments
 (0)