signIn method
Future<Map<String, dynamic> ?>
signIn(
- BuildContext context, {
- String? email,
- String? referralCode,
- bool forceWebView = false,
Implementation
Future<Map<String, dynamic>?> signIn(BuildContext context,
{String? email, String? referralCode, bool forceWebView = false}) async {
// If forceWebView is true, skip refresh token logic and open WebView directly
if (forceWebView) {
debugPrint('[INFO] Force WebView sign-in requested');
final tokens = await Navigator.of(context).push<Map<String, dynamic>>(
MaterialPageRoute(
builder: (_) =>
WebViewSignInPage(email: email, referralCode: referralCode),
),
);
return tokens;
}
// Check if we have a valid refresh token and try to refresh first
final refreshToken = await TokenStorage.getRefreshToken();
if (refreshToken != null) {
debugPrint('[INFO] Attempting token refresh before WebView sign-in');
try {
await refreshTokens();
// Check if refresh was successful
final newAccessToken = await TokenStorage.getAccessToken();
if (newAccessToken != null && newAccessToken.isNotEmpty) {
debugPrint(
'[INFO] Token refresh successful, returning stored tokens');
// Return consistent format with stored tokens
final email = await TokenStorage.getEmail();
final userId = await TokenStorage.getUserId();
final idToken = await TokenStorage.getIdToken();
return {
'accessToken': newAccessToken,
'refreshToken': refreshToken,
'idToken': idToken ?? '',
'email': email ?? '',
'userId': userId ?? '',
};
}
} catch (e) {
debugPrint('[WARNING] Token refresh failed during sign-in: $e');
}
}
// If no valid refresh token or refresh failed, open WebView
debugPrint('[INFO] Opening WebView for authentication');
final tokens = await Navigator.of(context).push<Map<String, dynamic>>(
MaterialPageRoute(
builder: (_) =>
WebViewSignInPage(email: email, referralCode: referralCode),
),
);
return tokens;
}