signIn method

Future<Map<String, dynamic>?> signIn(
  1. BuildContext context, {
  2. String? email,
  3. String? referralCode,
  4. 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;
}