add games

This commit is contained in:
2025-12-02 14:55:55 +01:00
parent 975b704553
commit 46ea9d10d3
10 changed files with 634 additions and 76 deletions
+41
View File
@@ -0,0 +1,41 @@
import '../../../core/status.dart';
class Game {
final int id; // DB id
final int igdbId;
final String name;
final String? localizedTitle;
final String? originalName;
final ItemStatus status;
final String? note;
final String? summary;
final String? coverUrl;
Game({
required this.id,
required this.igdbId,
required this.name,
this.localizedTitle,
this.originalName,
this.status = ItemStatus.Init,
this.note,
this.summary,
this.coverUrl,
});
factory Game.fromJson(Map<String, dynamic> j) {
return Game(
id: (j['id'] as num).toInt(),
igdbId: (j['igdb_id'] as num).toInt(),
name: (j['name'] ?? '') as String,
localizedTitle: j['loc_title'] as String?,
originalName: j['original_name'] as String?,
status: j['status'] != null ? statusFromString(j['status'] as String) : ItemStatus.Init,
note: j['note'] as String?,
summary: j['loc_summary'] as String?,
coverUrl: j['cover_url'] as String?,
);
}
String get displayName => (localizedTitle != null && localizedTitle!.isNotEmpty) ? localizedTitle! : name;
}
@@ -0,0 +1,42 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../core/status.dart';
import '../../shared/providers.dart';
import 'game_model.dart';
final gameFilterProvider = StateProvider<ItemStatus?>((_) => null);
final gamesProvider = FutureProvider.autoDispose<List<Game>>((ref) async {
final backend = ref.watch(backendApiProvider);
final st = ref.watch(gameFilterProvider);
const pageSize = 500;
var offset = 0;
final all = <Map<String, dynamic>>[];
while (true) {
final page = await backend.getGames(status: st?.name, offset: offset, limit: pageSize, lang: 'de');
all.addAll(page);
if (page.length < pageSize) break;
offset += pageSize;
}
return all.map(Game.fromJson).toList();
});
final gamesStreamProvider = StreamProvider.autoDispose<List<Game>>((ref) async* {
final backend = ref.watch(backendApiProvider);
final st = ref.watch(gameFilterProvider);
const pageSize = 300;
var offset = 0;
var agg = <Game>[];
while (true) {
final page = await backend.getGames(status: st?.name, offset: offset, limit: pageSize, lang: 'de');
final mapped = page.map(Game.fromJson).toList();
if (mapped.isEmpty) {
if (agg.isEmpty) yield const <Game>[];
break;
}
agg = [...agg, ...mapped];
yield agg;
if (mapped.length < pageSize) break;
offset += pageSize;
}
});