signIn method

Future<void> signIn()

Signs in to Firebase Auth using Email & Password.

Implementation

Future<void> signIn() async {
  _log.info('Signing in to Firebase Auth as $email...');

  // Check if emulator is being used
  final isEmulator =
      Platform.environment['FUNCTIONS_EMULATOR'] == 'true' ||
      Platform.environment['FIRESTORE_EMULATOR_HOST'] != null;

  if (isEmulator) {
    _log.info('Using emulator mode. Simulating authentication token.');
    _idToken = 'emulator-token';
    _refreshToken = 'emulator-refresh-token';
    _tokenExpiry = DateTime.now().add(const Duration(hours: 24));
    return;
  }

  final url = '$firebaseSignInUrl?key=$apiKey';

  final response = await http.post(
    Uri.parse(url),
    headers: {'Content-Type': 'application/json'},
    body: jsonEncode({
      'email': email,
      'password': password,
      'returnSecureToken': true,
    }),
  );

  if (response.statusCode != 200) {
    throw HttpException(
      'Firebase sign in failed: ${response.statusCode} ${response.body}',
    );
  }

  final data = jsonDecode(response.body) as Map<String, dynamic>;
  _idToken = data['idToken'] as String?;
  _refreshToken = data['refreshToken'] as String?;
  final expiresInStr = data['expiresIn'] as String? ?? '3600';
  final expiresIn = int.tryParse(expiresInStr) ?? 3600;

  _tokenExpiry = DateTime.now().add(Duration(seconds: expiresIn));
  _log.info('Successfully signed in. Token expires in ${expiresIn}s');
}