feat: add seeding tab

This commit is contained in:
Simon Ding
2025-02-10 16:06:35 +08:00
parent f3b2b3bc32
commit ce020566b7
2 changed files with 38 additions and 12 deletions

View File

@@ -20,7 +20,7 @@ class _ActivityPageState extends ConsumerState<ActivityPage>
@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<ActivityPage>
Tab(
text: "下载中",
),
Tab(
text: "做种中",
),
Tab(
text: "历史记录",
),
@@ -56,10 +59,12 @@ class _ActivityPageState extends ConsumerState<ActivityPage>
Builder(builder: (context) {
AsyncValue<List<Activity>>? 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<ActivityPage>
Function(int) onDelete() {
return (id) {
final f = ref
.read(activitiesDataProvider("active").notifier)
.read(activitiesDataProvider(ActivityStatus.active).notifier)
.deleteActivity(id);
showLoadingWithFuture(f);
};

View File

@@ -5,7 +5,7 @@ import 'package:ui/providers/APIs.dart';
import 'package:ui/providers/server_response.dart';
var activitiesDataProvider = AsyncNotifierProvider.autoDispose
.family<ActivityData, List<Activity>, String>(ActivityData.new);
.family<ActivityData, List<Activity>, 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<List<Activity>, String> {
extends AutoDisposeFamilyAsyncNotifier<List<Activity>, ActivityStatus> {
Timer? _timer;
@override
FutureOr<List<Activity>> build(String arg) async {
FutureOr<List<Activity>> 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<Activity> 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;
}