games/packages/service_api/lib/services/session_notifier.dart

101 lines
2.6 KiB
Dart
Raw Permalink Normal View History

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();
}
}