From d07cf83f4591f68e17b099084c2242ba7bc55cee Mon Sep 17 00:00:00 2001 From: liwei Date: Tue, 12 Dec 2023 09:21:44 +0800 Subject: [PATCH] fix: sort of completed tasks --- pkg/download/downloader.go | 13 +++++++------ pkg/download/model.go | 8 ++++++++ ui/flutter/lib/api/model/task.dart | 2 ++ ui/flutter/lib/api/model/task.g.dart | 2 ++ .../controllers/task_downloaded_controller.dart | 3 ++- .../controllers/task_downloading_controller.dart | 2 +- .../task/controllers/task_list_controller.dart | 14 +++----------- 7 files changed, 25 insertions(+), 19 deletions(-) diff --git a/pkg/download/downloader.go b/pkg/download/downloader.go index 7aedbaf24..a8cc5349a 100644 --- a/pkg/download/downloader.go +++ b/pkg/download/downloader.go @@ -572,7 +572,8 @@ func (d *Downloader) getProtocolConfig(name string, v any) bool { func (d *Downloader) watch(task *Task) { err := task.fetcher.Wait() if err != nil { - task.Status = base.DownloadStatusError + task.updateStatus(base.DownloadStatusError) + d.storage.Put(bucketTask, task.ID, task.clone()) d.emit(EventKeyError, task, err) } else { task.Progress.Used = task.timer.Used() @@ -586,7 +587,7 @@ func (d *Downloader) watch(task *Task) { totalSize := task.Meta.Res.Size task.Progress.Speed = totalSize / used task.Progress.Downloaded = totalSize - task.Status = base.DownloadStatusDone + task.updateStatus(base.DownloadStatusDone) d.storage.Put(bucketTask, task.ID, task.clone()) d.emit(EventKeyDone, task) d.emit(EventKeyFinally, task, err) @@ -658,7 +659,6 @@ func (d *Downloader) doCreate(fetcher fetcher.Fetcher, opts *base.Options) (task task.fetcher = fetcher task.Meta = fetcher.Meta() task.Progress = &Progress{} - task.Status = base.DownloadStatusReady initTask(task) if err = fetcher.Create(opts); err != nil { return @@ -699,7 +699,7 @@ func (d *Downloader) doStart(task *Task) (err error) { cloneTask := task.clone() isCreate := task.Status == base.DownloadStatusReady - task.Status = base.DownloadStatusRunning + task.updateStatus(base.DownloadStatusRunning) doStart := func() error { task.lock.Lock() @@ -714,7 +714,8 @@ func (d *Downloader) doStart(task *Task) (err error) { if task.Meta.Res == nil { err := task.fetcher.Resolve(task.Meta.Req) if err != nil { - task.Status = base.DownloadStatusError + task.updateStatus(base.DownloadStatusError) + d.storage.Put(bucketTask, task.ID, task.clone()) d.emit(EventKeyError, task, err) return err } @@ -768,7 +769,7 @@ func (d *Downloader) doStart(task *Task) (err error) { func (d *Downloader) doPause(task *Task) (err error) { err = func() error { if task.Status != base.DownloadStatusDone { - task.Status = base.DownloadStatusPause + task.updateStatus(base.DownloadStatusPause) task.timer.Pause() if task.fetcher != nil { if err := task.fetcher.Pause(); err != nil { diff --git a/pkg/download/model.go b/pkg/download/model.go index ea8c1d0f5..a17ba44a9 100644 --- a/pkg/download/model.go +++ b/pkg/download/model.go @@ -24,6 +24,7 @@ type Task struct { Status base.Status `json:"status"` Progress *Progress `json:"progress"` CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` fetcherBuilder fetcher.FetcherBuilder fetcher fetcher.Fetcher @@ -41,9 +42,15 @@ func NewTask() *Task { ID: id, Status: base.DownloadStatusReady, CreatedAt: time.Now(), + UpdatedAt: time.Now(), } } +func (t *Task) updateStatus(status base.Status) { + t.UpdatedAt = time.Now() + t.Status = status +} + func (t *Task) clone() *Task { return &Task{ ID: t.ID, @@ -51,6 +58,7 @@ func (t *Task) clone() *Task { Status: t.Status, Progress: t.Progress, CreatedAt: t.CreatedAt, + UpdatedAt: t.UpdatedAt, } } diff --git a/ui/flutter/lib/api/model/task.dart b/ui/flutter/lib/api/model/task.dart index 67baa0c9e..779539917 100644 --- a/ui/flutter/lib/api/model/task.dart +++ b/ui/flutter/lib/api/model/task.dart @@ -13,6 +13,7 @@ class Task { Status status; Progress progress; DateTime createdAt; + DateTime updatedAt; Task({ required this.id, @@ -20,6 +21,7 @@ class Task { required this.status, required this.progress, required this.createdAt, + required this.updatedAt, }); factory Task.fromJson(Map json) => _$TaskFromJson(json); diff --git a/ui/flutter/lib/api/model/task.g.dart b/ui/flutter/lib/api/model/task.g.dart index 43afce32a..b5974a168 100644 --- a/ui/flutter/lib/api/model/task.g.dart +++ b/ui/flutter/lib/api/model/task.g.dart @@ -12,6 +12,7 @@ Task _$TaskFromJson(Map json) => Task( status: $enumDecode(_$StatusEnumMap, json['status']), progress: Progress.fromJson(json['progress'] as Map), createdAt: DateTime.parse(json['createdAt'] as String), + updatedAt: DateTime.parse(json['updatedAt'] as String), ); Map _$TaskToJson(Task instance) => { @@ -20,6 +21,7 @@ Map _$TaskToJson(Task instance) => { 'status': _$StatusEnumMap[instance.status]!, 'progress': instance.progress.toJson(), 'createdAt': instance.createdAt.toIso8601String(), + 'updatedAt': instance.updatedAt.toIso8601String(), }; const _$StatusEnumMap = { diff --git a/ui/flutter/lib/app/modules/task/controllers/task_downloaded_controller.dart b/ui/flutter/lib/app/modules/task/controllers/task_downloaded_controller.dart index c33a6eb14..59c6c4749 100644 --- a/ui/flutter/lib/app/modules/task/controllers/task_downloaded_controller.dart +++ b/ui/flutter/lib/app/modules/task/controllers/task_downloaded_controller.dart @@ -3,5 +3,6 @@ import 'package:gopeed/app/modules/task/controllers/task_list_controller.dart'; import '../../../../api/model/task.dart'; class TaskDownloadedController extends TaskListController { - TaskDownloadedController() : super([Status.done], SortDirection.asc); + TaskDownloadedController() + : super([Status.done], (a, b) => b.updatedAt.compareTo(a.updatedAt)); } diff --git a/ui/flutter/lib/app/modules/task/controllers/task_downloading_controller.dart b/ui/flutter/lib/app/modules/task/controllers/task_downloading_controller.dart index f41011428..1f69ee0df 100644 --- a/ui/flutter/lib/app/modules/task/controllers/task_downloading_controller.dart +++ b/ui/flutter/lib/app/modules/task/controllers/task_downloading_controller.dart @@ -9,5 +9,5 @@ class TaskDownloadingController extends TaskListController { Status.pause, Status.wait, Status.error - ], SortDirection.desc); + ], (a, b) => b.createdAt.compareTo(a.createdAt)); } diff --git a/ui/flutter/lib/app/modules/task/controllers/task_list_controller.dart b/ui/flutter/lib/app/modules/task/controllers/task_list_controller.dart index 3fba10117..bca359678 100644 --- a/ui/flutter/lib/app/modules/task/controllers/task_list_controller.dart +++ b/ui/flutter/lib/app/modules/task/controllers/task_list_controller.dart @@ -5,13 +5,11 @@ import 'package:get/get.dart'; import '../../../../api/api.dart'; import '../../../../api/model/task.dart'; -enum SortDirection { asc, desc } - abstract class TaskListController extends GetxController { List statuses; - SortDirection sortDirection; + int Function(Task a, Task b) compare; - TaskListController(this.statuses, this.sortDirection); + TaskListController(this.statuses, this.compare); final tasks = [].obs; final isRunning = false.obs; @@ -48,13 +46,7 @@ abstract class TaskListController extends GetxController { getTasksState() async { final tasks = await getTasks(statuses); // sort tasks by create time - tasks.sort((a, b) { - if (sortDirection == SortDirection.asc) { - return a.createdAt.compareTo(b.createdAt); - } else { - return b.createdAt.compareTo(a.createdAt); - } - }); + tasks.sort(compare); this.tasks.value = tasks; } }