import 'package:firebase_auth/firebase_auth.dart' as fb; import 'auth.dart'; /// Firebase Auth가 보존한 세션을 앱의 인증 계약으로 변환한다. /// /// [FirebaseBoot]가 live인 경우에만 생성해야 한다. 설정이 없는 목 모드에서는 /// Firebase 인스턴스에 접근하지 않고 [AuthRepository]에 null 세션을 전달한다. final class FirebaseAuthSession implements AuthSession { FirebaseAuthSession({fb.FirebaseAuth? firebaseAuth}) : _firebaseAuth = firebaseAuth ?? fb.FirebaseAuth.instance; final fb.FirebaseAuth _firebaseAuth; @override AuthAccount? get currentAccount => _toAccount(_firebaseAuth.currentUser); @override Stream get accountChanges => _firebaseAuth.authStateChanges().map(_toAccount); @override Future signOut() => _firebaseAuth.signOut(); } AuthAccount? _toAccount(fb.User? user) { if (user == null) return null; return AuthAccount( uid: user.uid, provider: _providerOf(user), displayName: user.displayName, email: user.email, ); } SocialProvider? _providerOf(fb.User user) { final ids = user.providerData.map((data) => data.providerId).toSet(); if (ids.contains('google.com')) return SocialProvider.google; if (ids.contains('apple.com')) return SocialProvider.apple; if (ids.any((id) => id.toLowerCase().contains('kakao'))) { return SocialProvider.kakao; } if (ids.any((id) => id.toLowerCase().contains('line'))) { return AuthProviderKind.line; } if (ids.contains('password')) return AuthProviderKind.email; return null; }