add games
This commit is contained in:
@@ -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;
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user