From ce020566b764defab9bea0f1b27ee6df7626c77d Mon Sep 17 00:00:00 2001 From: Simon Ding Date: Mon, 10 Feb 2025 16:06:35 +0800 Subject: [PATCH] feat: add seeding tab --- ui/lib/activity.dart | 15 ++++++++++----- ui/lib/providers/activity.dart | 35 +++++++++++++++++++++++++++------- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/ui/lib/activity.dart b/ui/lib/activity.dart index 45f4b6e..00df601 100644 --- a/ui/lib/activity.dart +++ b/ui/lib/activity.dart @@ -20,7 +20,7 @@ class _ActivityPageState extends ConsumerState @override void initState() { super.initState(); - _nestedTabController = new TabController(length: 2, vsync: this); + _nestedTabController = new TabController(length: 3, vsync: this); } @override @@ -48,6 +48,9 @@ class _ActivityPageState extends ConsumerState Tab( text: "下载中", ), + Tab( + text: "做种中", + ), Tab( text: "历史记录", ), @@ -56,10 +59,12 @@ class _ActivityPageState extends ConsumerState Builder(builder: (context) { AsyncValue>? activitiesWatcher; - if (selectedTab == 1) { - activitiesWatcher = ref.watch(activitiesDataProvider("archive")); + if (selectedTab == 2) { + activitiesWatcher = ref.watch(activitiesDataProvider(ActivityStatus.archive)); + } else if (selectedTab == 1) { + activitiesWatcher = ref.watch(activitiesDataProvider(ActivityStatus.seeding)); } else if (selectedTab == 0) { - activitiesWatcher = ref.watch(activitiesDataProvider("active")); + activitiesWatcher = ref.watch(activitiesDataProvider(ActivityStatus.active)); } return activitiesWatcher!.when( @@ -158,7 +163,7 @@ class _ActivityPageState extends ConsumerState Function(int) onDelete() { return (id) { final f = ref - .read(activitiesDataProvider("active").notifier) + .read(activitiesDataProvider(ActivityStatus.active).notifier) .deleteActivity(id); showLoadingWithFuture(f); }; diff --git a/ui/lib/providers/activity.dart b/ui/lib/providers/activity.dart index 8c1dfa3..cfe18e0 100644 --- a/ui/lib/providers/activity.dart +++ b/ui/lib/providers/activity.dart @@ -5,7 +5,7 @@ import 'package:ui/providers/APIs.dart'; import 'package:ui/providers/server_response.dart'; var activitiesDataProvider = AsyncNotifierProvider.autoDispose - .family, String>(ActivityData.new); + .family, ActivityStatus>(ActivityData.new); var mediaHistoryDataProvider = FutureProvider.autoDispose.family( (ref, arg) async { @@ -23,32 +23,53 @@ var mediaHistoryDataProvider = FutureProvider.autoDispose.family( }, ); +enum ActivityStatus { + active, + seeding, + archive, +} + class ActivityData - extends AutoDisposeFamilyAsyncNotifier, String> { + extends AutoDisposeFamilyAsyncNotifier, ActivityStatus> { Timer? _timer; @override - FutureOr> build(String arg) async { + FutureOr> build(ActivityStatus arg) async { if (_timer != null) { _timer!.cancel(); } final dio = APIs.getDio(); + + var status = arg == ActivityStatus.archive + ? "archive" + : "active"; //archive or active var resp = - await dio.get(APIs.activityUrl, queryParameters: {"status": arg}); + await dio.get(APIs.activityUrl, queryParameters: {"status": status}); final sp = ServerResponse.fromJson(resp.data); if (sp.code != 0) { throw sp.message; } List activities = List.empty(growable: true); for (final a in sp.data as List) { - activities.add(Activity.fromJson(a)); + var activity = Activity.fromJson(a); + if (arg == ActivityStatus.archive) { + activities.add(activity); + } else { + if (arg == ActivityStatus.active && activity.status != "seeding") { + activities.add(activity); + } else if (arg == ActivityStatus.seeding && + activity.status == "seeding") { + activities.add(activity); + } + } } - if (arg == "active") { + if (status == "active") { //refresh active downloads + _timer?.cancel(); _timer = Timer(const Duration(seconds: 5), - () => ref.invalidateSelf()); //Periodically Refresh + ref.invalidateSelf); //Periodically Refresh } return activities; }