Movie Context Menu

main
Herwig Birke 2 months ago
parent 3086a751ec
commit 2cf1fb648c

@ -143,6 +143,10 @@ class BackendApi {
});
}
Future<void> deleteMovie(int movieId) async {
await _post({'action': 'delete_movie', 'movie_id': movieId});
}
Future<List<Map<String, dynamic>>> getEpisodes({
String? status,
String? q,

@ -127,7 +127,7 @@ class MovieListScreen extends ConsumerWidget {
separatorBuilder: (_, __) => const Divider(height: 1),
itemBuilder: (context, i) {
final m = itemsSorted[i];
return ListTile(
final tile = ListTile(
tileColor: _statusBg(m.status, context),
leading: m.posterPath != null
? ClipRRect(
@ -187,6 +187,72 @@ class MovieListScreen extends ConsumerWidget {
);
},
);
Future<void> setStatus(ItemStatus s) async {
final messenger = ScaffoldMessenger.of(context);
try {
await ref.read(backendApiProvider).setStatus(type: 'movie', refId: m.id, status: s.name);
ref.invalidate(moviesStreamProvider);
ref.invalidate(moviesProvider);
messenger.showSnackBar(SnackBar(content: Text('Status gesetzt: ${s.name}')));
} catch (e) {
messenger.showSnackBar(SnackBar(content: Text('Fehler: $e')));
}
}
Future<void> updateMovie() async {
final messenger = ScaffoldMessenger.of(context);
try {
final tmdb = ref.read(tmdbApiProvider);
final json = await tmdb.getMovie(m.tmdbId);
await ref.read(backendApiProvider).upsertMovie(json);
ref.invalidate(moviesStreamProvider);
ref.invalidate(moviesProvider);
messenger.showSnackBar(const SnackBar(content: Text('Film aktualisiert')));
} catch (e) {
messenger.showSnackBar(SnackBar(content: Text('Update fehlgeschlagen: $e')));
}
}
Future<void> deleteMovie() async {
final confirm = await showDialog<bool>(
context: context,
builder: (ctx) => AlertDialog(
title: const Text('Film löschen?'),
content: Text(m.title),
actions: [
TextButton(onPressed: () => Navigator.of(ctx).pop(false), child: const Text('Abbrechen')),
FilledButton(onPressed: () => Navigator.of(ctx).pop(true), child: const Text('Löschen')),
],
),
);
if (confirm != true) return;
final messenger = ScaffoldMessenger.of(context);
try {
await ref.read(backendApiProvider).deleteMovie(m.id);
ref.invalidate(moviesStreamProvider);
ref.invalidate(moviesProvider);
messenger.showSnackBar(const SnackBar(content: Text('Film gelöscht')));
} catch (e) {
messenger.showSnackBar(SnackBar(content: Text('Löschen fehlgeschlagen: $e')));
}
}
return MenuAnchor(
menuChildren: [
MenuItemButton(onPressed: () => setStatus(ItemStatus.Init), child: const Text('set to init')),
MenuItemButton(onPressed: () => setStatus(ItemStatus.Progress), child: const Text('set to progress')),
MenuItemButton(onPressed: () => setStatus(ItemStatus.Done), child: const Text('set to done')),
MenuItemButton(onPressed: updateMovie, child: const Text('update')),
MenuItemButton(onPressed: deleteMovie, child: const Text('delete')),
],
builder: (ctx, controller, child) => GestureDetector(
onSecondaryTapDown: (_) => controller.open(),
onSecondaryTapUp: (_) => controller.open(),
onLongPress: () => controller.open(),
child: tile,
),
);
},
),
);

Loading…
Cancel
Save