patch small issue with trad and theme
This commit is contained in:
@@ -4,8 +4,7 @@ import '../../domain/entities/pokemon.dart';
|
||||
class PokemonDto {
|
||||
PokemonDto._();
|
||||
|
||||
/// Mappe un nom de type français (API Tyradex) vers l'enum.
|
||||
static PokemonType frenchTypeToEnum(String frenchType) {
|
||||
static PokemonType _frenchTypeToEnum(String type) {
|
||||
const map = {
|
||||
'Normal': PokemonType.normal,
|
||||
'Combat': PokemonType.fighting,
|
||||
@@ -26,41 +25,65 @@ class PokemonDto {
|
||||
'Ténèbres': PokemonType.dark,
|
||||
'Fée': PokemonType.fairy,
|
||||
};
|
||||
return map[frenchType] ?? PokemonType.unknown;
|
||||
return map[type] ?? PokemonType.unknown;
|
||||
}
|
||||
|
||||
/// Construit une entité depuis la réponse Tyradex (objet unique ou élément de liste).
|
||||
/// [fallbackId] sert quand le JSON ne contient pas `pokedex_id`.
|
||||
static Pokemon fromTyradexJson(Map<String, dynamic> json, {int? fallbackId}) {
|
||||
// Tyradex always returns type names in French regardless of endpoint language.
|
||||
static PokemonType _typeToEnum(String typeName, String languageCode) {
|
||||
return _frenchTypeToEnum(typeName);
|
||||
}
|
||||
|
||||
/// Construit une entité depuis la réponse Tyradex.
|
||||
/// [languageCode] détermine quelle langue utiliser pour [name] ('fr' ou 'en').
|
||||
static Pokemon fromTyradexJson(
|
||||
Map<String, dynamic> json, {
|
||||
int? fallbackId,
|
||||
String languageCode = 'fr',
|
||||
}) {
|
||||
final id = (json['pokedex_id'] as int?) ??
|
||||
fallbackId ??
|
||||
(throw ArgumentError('pokedex_id absent et fallbackId non fourni'));
|
||||
|
||||
final nameMap = json['name'] as Map<String, dynamic>?;
|
||||
final name = nameMap?['fr'] ?? nameMap?['en'] ?? 'unknown';
|
||||
final nameFr = nameMap?['fr'] as String? ?? 'unknown';
|
||||
final nameEn = nameMap?['en'] as String? ?? nameFr;
|
||||
final name = languageCode == 'en' ? nameEn : nameFr;
|
||||
|
||||
final List types = json['types'] ?? [];
|
||||
final type1 =
|
||||
types.isNotEmpty ? frenchTypeToEnum(types[0]['name']) : PokemonType.unknown;
|
||||
final type2 = types.length > 1 ? frenchTypeToEnum(types[1]['name']) : null;
|
||||
// Tyradex retourne toujours les types dans la langue du endpoint (fr ou en).
|
||||
final type1 = types.isNotEmpty
|
||||
? _typeToEnum(types[0]['name'] as String, languageCode)
|
||||
: PokemonType.unknown;
|
||||
final type2 = types.length > 1
|
||||
? _typeToEnum(types[1]['name'] as String, languageCode)
|
||||
: null;
|
||||
|
||||
final Map<String, dynamic>? stats = json['stats'];
|
||||
// Tyradex expose 'category' (FR) et parfois 'category_en' (EN).
|
||||
final descFr = json['category'] as String?;
|
||||
final descEn = (json['category_en'] ?? json['category']) as String?;
|
||||
return Pokemon(
|
||||
name: name,
|
||||
nameFr: nameFr,
|
||||
nameEn: nameEn,
|
||||
id: id,
|
||||
type1: type1,
|
||||
type2: type2,
|
||||
hp: stats?['hp'] ?? 0,
|
||||
atk: stats?['atk'] ?? 0,
|
||||
def: stats?['def'] ?? 0,
|
||||
spd: stats?['vit'] ?? 0, // 'vit' = vitesse chez Tyradex
|
||||
description: json['category'],
|
||||
spd: stats?['vit'] ?? 0,
|
||||
description: descFr,
|
||||
descriptionEn: descEn,
|
||||
);
|
||||
}
|
||||
|
||||
/// Sérialise pour SQLite.
|
||||
/// Sérialise pour SQLite (stocke les deux noms et descriptions).
|
||||
static Map<String, dynamic> toDb(Pokemon p) {
|
||||
return {
|
||||
'name': p.name,
|
||||
'name_fr': p.nameFr ?? p.name,
|
||||
'name_en': p.nameEn ?? p.name,
|
||||
'id': p.id,
|
||||
'type1': p.type1.name,
|
||||
'type2': p.type2?.name,
|
||||
@@ -69,15 +92,23 @@ class PokemonDto {
|
||||
'def': p.def,
|
||||
'spd': p.spd,
|
||||
'description': p.description,
|
||||
'description_en': p.descriptionEn,
|
||||
'isCaught': p.isCaught ? 1 : 0,
|
||||
'isSeen': p.isSeen ? 1 : 0,
|
||||
};
|
||||
}
|
||||
|
||||
/// Reconstruit depuis une ligne SQLite.
|
||||
static Pokemon fromDb(Map<String, dynamic> row) {
|
||||
/// [languageCode] détermine quel nom afficher.
|
||||
static Pokemon fromDb(Map<String, dynamic> row, {String languageCode = 'fr'}) {
|
||||
final nameFr = row['name_fr'] as String? ?? row['name'] as String;
|
||||
final nameEn = row['name_en'] as String? ?? nameFr;
|
||||
final name = languageCode == 'en' ? nameEn : nameFr;
|
||||
|
||||
return Pokemon(
|
||||
name: row['name'],
|
||||
name: name,
|
||||
nameFr: nameFr,
|
||||
nameEn: nameEn,
|
||||
id: row['id'],
|
||||
type1: PokemonType.values.firstWhere(
|
||||
(e) => e.name == row['type1'],
|
||||
@@ -94,6 +125,7 @@ class PokemonDto {
|
||||
def: row['def'] ?? 0,
|
||||
spd: row['spd'] ?? 0,
|
||||
description: row['description'],
|
||||
descriptionEn: row['description_en'] as String?,
|
||||
isCaught: row['isCaught'] == 1 || row['isCaught'] == true,
|
||||
isSeen: row['isSeen'] == 1 || row['isSeen'] == true,
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user