2025-12-15 18:18:17 +09:00
|
|
|
import 'package:flutter/foundation.dart';
|
2025-11-14 18:03:50 +09:00
|
|
|
import 'identity_service.dart';
|
|
|
|
|
|
2025-12-15 18:18:17 +09:00
|
|
|
class SessionNotifier extends ChangeNotifier {
|
|
|
|
|
final IdentityService _identityService;
|
2025-11-14 18:03:50 +09:00
|
|
|
UserSession? _session;
|
2025-12-15 18:18:17 +09:00
|
|
|
bool _isLoading = true; // 초기값을 true로 설정하여 깜빡임 방지
|
|
|
|
|
|
|
|
|
|
SessionNotifier(this._identityService);
|
2025-11-14 18:03:50 +09:00
|
|
|
|
|
|
|
|
UserSession? get session => _session;
|
|
|
|
|
bool get isGuest => _session?.isGuest ?? true;
|
2025-12-15 18:18:17 +09:00
|
|
|
bool get isLoading => _isLoading;
|
2025-11-14 18:03:50 +09:00
|
|
|
|
|
|
|
|
Future<void> loadSession() async {
|
2025-12-15 18:18:17 +09:00
|
|
|
_setLoading(true);
|
|
|
|
|
try {
|
|
|
|
|
// 1. 저장된 세션 불러오기
|
|
|
|
|
_session = await _identityService.getUserSession();
|
|
|
|
|
|
|
|
|
|
// 2. [Fix] 저장된 세션이 없으면 자동으로 게스트 로그인 수행
|
|
|
|
|
if (_session == null) {
|
|
|
|
|
await loginGuest();
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
debugPrint("Session load error: $e");
|
|
|
|
|
// 에러 발생 시에도 게스트로 진입 시도
|
|
|
|
|
await loginGuest();
|
|
|
|
|
} finally {
|
|
|
|
|
_setLoading(false);
|
|
|
|
|
}
|
2025-11-14 18:03:50 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> login(String provider) async {
|
2025-12-15 18:18:17 +09:00
|
|
|
if (provider == 'guest') {
|
|
|
|
|
await loginGuest();
|
|
|
|
|
} else {
|
|
|
|
|
await loginSocial(
|
|
|
|
|
provider: provider,
|
|
|
|
|
email: "$provider@example.com",
|
|
|
|
|
name: "User ($provider)",
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-11-14 18:03:50 +09:00
|
|
|
|
2025-12-15 18:18:17 +09:00
|
|
|
Future<void> loginGuest() async {
|
2025-11-14 18:03:50 +09:00
|
|
|
try {
|
2025-12-15 18:18:17 +09:00
|
|
|
final userId = await _identityService.getOrCreateUser();
|
|
|
|
|
_session = UserSession(
|
|
|
|
|
userId: userId,
|
|
|
|
|
provider: 'guest',
|
|
|
|
|
userName: '게스트', // 기본 이름 부여
|
|
|
|
|
);
|
|
|
|
|
// 게스트 정보도 세션 스토리지에 저장하여 다음 실행 시 유지
|
|
|
|
|
await _identityService.saveSocialLogin(
|
|
|
|
|
userId: userId,
|
|
|
|
|
provider: 'guest',
|
|
|
|
|
name: '게스트'
|
|
|
|
|
);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
debugPrint("Guest login failed: $e");
|
|
|
|
|
}
|
|
|
|
|
notifyListeners();
|
|
|
|
|
}
|
2025-11-14 18:03:50 +09:00
|
|
|
|
2025-12-15 18:18:17 +09:00
|
|
|
Future<void> loginSocial({
|
|
|
|
|
required String provider,
|
|
|
|
|
required String email,
|
|
|
|
|
String? name,
|
|
|
|
|
String? photoUrl,
|
|
|
|
|
}) async {
|
|
|
|
|
_setLoading(true);
|
|
|
|
|
try {
|
2025-11-14 18:03:50 +09:00
|
|
|
_session = await _identityService.saveSocialLogin(
|
2025-12-15 18:18:17 +09:00
|
|
|
userId: "master-id-${email ?? provider}",
|
|
|
|
|
email: email,
|
|
|
|
|
name: name,
|
|
|
|
|
photoUrl: photoUrl,
|
|
|
|
|
provider: provider,
|
2025-11-14 18:03:50 +09:00
|
|
|
);
|
|
|
|
|
notifyListeners();
|
|
|
|
|
} catch (e) {
|
2025-12-15 18:18:17 +09:00
|
|
|
debugPrint("Login failed: $e");
|
|
|
|
|
} finally {
|
|
|
|
|
_setLoading(false);
|
2025-11-14 18:03:50 +09:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> logout() async {
|
2025-12-15 18:18:17 +09:00
|
|
|
_setLoading(true);
|
|
|
|
|
await _identityService.logout();
|
|
|
|
|
_session = null;
|
|
|
|
|
await loginGuest(); // 로그아웃 후 다시 게스트로 전환
|
|
|
|
|
_setLoading(false);
|
|
|
|
|
}
|
2025-11-14 18:03:50 +09:00
|
|
|
|
2025-12-15 18:18:17 +09:00
|
|
|
void _setLoading(bool value) {
|
|
|
|
|
_isLoading = value;
|
2025-11-14 18:03:50 +09:00
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
}
|