...
This commit is contained in:
@@ -12,9 +12,11 @@ class GameRankDto {
|
||||
});
|
||||
|
||||
factory GameRankDto.fromJson(Map<String, dynamic> json) {
|
||||
// [🔥 수정] playerName에 Null check 추가
|
||||
// [🔥 수정] primaryScore에 Null check 및 안전한 toInt() 추가
|
||||
return GameRankDto(
|
||||
playerName: json['playerName'],
|
||||
primaryScore: (json['primaryScore'] as num).toInt(),
|
||||
playerName: json['playerName'] ?? 'Unknown',
|
||||
primaryScore: (json['primaryScore'] as num?)?.toInt() ?? 0,
|
||||
secondaryScore: (json['secondaryScore'] as num?)?.toInt(),
|
||||
);
|
||||
}
|
||||
@@ -33,7 +35,8 @@ class GameRankWithRankNumber {
|
||||
factory GameRankWithRankNumber.fromJson(Map<String, dynamic> json) {
|
||||
return GameRankWithRankNumber(
|
||||
rankData: GameRankDto.fromJson(json['rankData']),
|
||||
rankNumber: (json['rankNumber'] as num).toInt(),
|
||||
// [🔥 수정] rankNumber에 Null check 및 안전한 toInt() 추가
|
||||
rankNumber: (json['rankNumber'] as num?)?.toInt() ?? 0,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -65,4 +68,4 @@ class RankSubmissionResult {
|
||||
myRank: myRankData,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
// packages/service_api/lib/services/identity_service.dart
|
||||
|
||||
import 'dart:convert';
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
// 🔽 [신규] 현재 로그인 세션을 담을 모델
|
||||
// 현재 로그인 세션을 담을 모델
|
||||
class UserSession {
|
||||
final String userId;
|
||||
final String? userName;
|
||||
@@ -26,21 +28,31 @@ class IdentityService {
|
||||
static const String _loginProviderKey = 'app_login_provider';
|
||||
static const String _userEmailKey = 'app_user_email';
|
||||
|
||||
// 게임별 저장 키 정의
|
||||
static const String _sudokuMaxLevelKey = 'max_unlocked_level';
|
||||
static const String _sudokuRankMapKey = 'last_checked_rank_map';
|
||||
|
||||
static const String _spiderMaxLevelKey = 'max_unlocked_spider_level';
|
||||
static const String _spiderRankMapKey = 'last_checked_spider_rank_map';
|
||||
|
||||
// 🔽 [신규] 수학 퀴즈 전용 키
|
||||
static const String _mathQuizMaxLevelKey = 'max_unlocked_mathquiz_level';
|
||||
static const String _mathQuizRankMapKey = 'last_checked_mathquiz_rank_map';
|
||||
|
||||
// [🔥 신규] 색상 일치 게임 키
|
||||
static const String _colorMatchMaxLevelKey = 'max_unlocked_colormatch_level';
|
||||
static const String _colorMatchRankMapKey = 'last_checked_colormatch_rank_map';
|
||||
|
||||
// [🔥 신규] 순서 기억 게임 키
|
||||
static const String _sequenceMaxLevelKey = 'max_unlocked_sequence_level';
|
||||
static const String _sequenceRankMapKey = 'last_checked_sequence_rank_map';
|
||||
|
||||
// [🔥 신규] 카드 뒤집기 게임 키
|
||||
static const String _cardFlipMaxLevelKey = 'max_unlocked_cardflip_level';
|
||||
static const String _cardFlipRankMapKey = 'last_checked_cardflip_rank_map';
|
||||
|
||||
final _storage = const FlutterSecureStorage();
|
||||
|
||||
IOSOptions _getIOSOptions() => const IOSOptions(
|
||||
// 🔽 [수정] Xcode 설정 전까지 'groupId'를 주석 처리하여 크래시 방지
|
||||
// groupId: 'group.com.lunaticbum.mygamecenter',
|
||||
);
|
||||
IOSOptions _getIOSOptions() => const IOSOptions();
|
||||
|
||||
AndroidOptions _getAndroidOptions() => const AndroidOptions(
|
||||
encryptedSharedPreferences: true,
|
||||
@@ -137,16 +149,25 @@ class IdentityService {
|
||||
return await getUserSession();
|
||||
}
|
||||
|
||||
// 🔽 [수정] 7. 최대 레벨 가져오기 (gameType 분기)
|
||||
// 7. [수정] 최대 레벨 가져오기 (모든 게임 타입 지원)
|
||||
Future<int> getMaxUnlockedLevel({String gameType = 'SUDOKU'}) async {
|
||||
String key;
|
||||
switch (gameType) {
|
||||
case 'SPIDER':
|
||||
key = _spiderMaxLevelKey;
|
||||
break;
|
||||
case 'MATH_QUIZ': // 👈 [추가]
|
||||
case 'MATH_QUIZ':
|
||||
key = _mathQuizMaxLevelKey;
|
||||
break;
|
||||
case 'COLOR_MATCH': // 👈 추가
|
||||
key = _colorMatchMaxLevelKey;
|
||||
break;
|
||||
case 'SEQUENCE': // 👈 추가
|
||||
key = _sequenceMaxLevelKey;
|
||||
break;
|
||||
case 'CARD_FLIP': // 👈 추가
|
||||
key = _cardFlipMaxLevelKey;
|
||||
break;
|
||||
default: // 'SUDOKU'
|
||||
key = _sudokuMaxLevelKey;
|
||||
}
|
||||
@@ -158,16 +179,25 @@ class IdentityService {
|
||||
return int.parse(levelString ?? '1');
|
||||
}
|
||||
|
||||
// 🔽 [수정] 8. 최대 레벨 저장하기 (gameType 분기)
|
||||
// 8. [수정] 최대 레벨 저장하기 (모든 게임 타입 지원)
|
||||
Future<void> saveMaxUnlockedLevel(int level, {String gameType = 'SUDOKU'}) async {
|
||||
String key;
|
||||
switch (gameType) {
|
||||
case 'SPIDER':
|
||||
key = _spiderMaxLevelKey;
|
||||
break;
|
||||
case 'MATH_QUIZ': // 👈 [추가]
|
||||
case 'MATH_QUIZ':
|
||||
key = _mathQuizMaxLevelKey;
|
||||
break;
|
||||
case 'COLOR_MATCH': // 👈 추가
|
||||
key = _colorMatchMaxLevelKey;
|
||||
break;
|
||||
case 'SEQUENCE': // 👈 추가
|
||||
key = _sequenceMaxLevelKey;
|
||||
break;
|
||||
case 'CARD_FLIP': // 👈 추가
|
||||
key = _cardFlipMaxLevelKey;
|
||||
break;
|
||||
default: // 'SUDOKU'
|
||||
key = _sudokuMaxLevelKey;
|
||||
}
|
||||
@@ -179,16 +209,25 @@ class IdentityService {
|
||||
);
|
||||
}
|
||||
|
||||
// 🔽 [수정] 9. 마지막 랭킹 맵 가져오기 (gameType 분기)
|
||||
// 9. [수정] 마지막 랭킹 맵 가져오기 (모든 게임 타입 지원)
|
||||
Future<Map<int, int>> getLastSavedRankMap({String gameType = 'SUDOKU'}) async {
|
||||
String key;
|
||||
switch (gameType) {
|
||||
case 'SPIDER':
|
||||
key = _spiderRankMapKey;
|
||||
break;
|
||||
case 'MATH_QUIZ': // 👈 [추가]
|
||||
case 'MATH_QUIZ':
|
||||
key = _mathQuizRankMapKey;
|
||||
break;
|
||||
case 'COLOR_MATCH': // 👈 추가
|
||||
key = _colorMatchRankMapKey;
|
||||
break;
|
||||
case 'SEQUENCE': // 👈 추가
|
||||
key = _sequenceRankMapKey;
|
||||
break;
|
||||
case 'CARD_FLIP': // 👈 추가
|
||||
key = _cardFlipRankMapKey;
|
||||
break;
|
||||
default: // 'SUDOKU'
|
||||
key = _sudokuRankMapKey;
|
||||
}
|
||||
@@ -207,16 +246,25 @@ class IdentityService {
|
||||
}
|
||||
}
|
||||
|
||||
// 🔽 [수정] 10. 마지막 랭킹 맵 저장하기 (gameType 분기)
|
||||
// 10. [수정] 마지막 랭킹 맵 저장하기 (모든 게임 타입 지원)
|
||||
Future<void> saveLastRankMap(Map<int, int> rankMap, {String gameType = 'SUDOKU'}) async {
|
||||
String key;
|
||||
switch (gameType) {
|
||||
case 'SPIDER':
|
||||
key = _spiderRankMapKey;
|
||||
break;
|
||||
case 'MATH_QUIZ': // 👈 [추가]
|
||||
case 'MATH_QUIZ':
|
||||
key = _mathQuizRankMapKey;
|
||||
break;
|
||||
case 'COLOR_MATCH': // 👈 추가
|
||||
key = _colorMatchRankMapKey;
|
||||
break;
|
||||
case 'SEQUENCE': // 👈 추가
|
||||
key = _sequenceRankMapKey;
|
||||
break;
|
||||
case 'CARD_FLIP': // 👈 추가
|
||||
key = _cardFlipRankMapKey;
|
||||
break;
|
||||
default: // 'SUDOKU'
|
||||
key = _sudokuRankMapKey;
|
||||
}
|
||||
|
||||
@@ -96,7 +96,9 @@ class PuzzleService {
|
||||
final List<dynamic> data = jsonDecode(utf8.decode(response.bodyBytes));
|
||||
return data.map((json) => GameRankDto.fromJson(json)).toList();
|
||||
} else {
|
||||
throw Exception('랭킹 로딩 실패');
|
||||
// [🔥 수정] 실패 시 HTTP 상태 코드 명시
|
||||
log("랭킹 로딩 실패: HTTP Status ${response.statusCode}");
|
||||
throw Exception('랭킹 로딩 실패: HTTP Status ${response.statusCode}');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user