From 88ca9dbc9a3df9fcb5e0a07d4a6565354d1e58ae Mon Sep 17 00:00:00 2001 From: dab246 Date: Sat, 6 Aug 2022 19:49:18 +0700 Subject: [PATCH] TF-654 Add DownloadController to manage list task download --- .../bindings/mailbox_dashboard_bindings.dart | 2 + .../download/download_controller.dart | 41 +++++++++++++++++++ .../model/download/download_task_state.dart | 41 +++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 lib/features/mailbox_dashboard/presentation/controller/download/download_controller.dart create mode 100644 lib/features/mailbox_dashboard/presentation/model/download/download_task_state.dart diff --git a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart index e203c3be2..f770f152b 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -63,6 +63,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_composer_cache_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/download/download_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; @@ -87,6 +88,7 @@ class MailboxDashBoardBindings extends BaseBindings { @override void bindingsController() { + Get.put(DownloadController()); Get.put(SearchController( Get.find(), Get.find(), diff --git a/lib/features/mailbox_dashboard/presentation/controller/download/download_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/download/download_controller.dart new file mode 100644 index 000000000..3455bfc42 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/controller/download/download_controller.dart @@ -0,0 +1,41 @@ + +import 'package:core/utils/app_logger.dart'; +import 'package:get/get.dart'; +import 'package:model/download/download_task_id.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart'; + +typedef UpdateDownloadTaskStateCallback = DownloadTaskState Function(DownloadTaskState currentState); + +class DownloadController extends GetxController { + + final listDownloadTaskState = RxList(); + + bool get notEmptyListDownloadTask => listDownloadTaskState.isNotEmpty; + + void addDownloadTask(DownloadTaskState task) { + log('DownloadController::addDownloadTask(): ${task.taskId}'); + listDownloadTaskState.add(task); + } + + void updateDownloadTaskByTaskId( + DownloadTaskId downloadTaskId, + UpdateDownloadTaskStateCallback updateDownloadTaskCallback, + ) { + final matchIndex = listDownloadTaskState + .indexWhere((task) => task.taskId == downloadTaskId); + if (matchIndex >= 0) { + listDownloadTaskState[matchIndex] = updateDownloadTaskCallback(listDownloadTaskState[matchIndex]); + listDownloadTaskState.refresh(); + } + } + + void deleteDownloadTask(DownloadTaskId taskId) { + log('DownloadController::deleteDownloadTask(): $taskId'); + final matchIndex = listDownloadTaskState + .indexWhere((task) => task.taskId == taskId); + if (matchIndex >= 0) { + listDownloadTaskState.removeAt(matchIndex); + listDownloadTaskState.refresh(); + } + } +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/model/download/download_task_state.dart b/lib/features/mailbox_dashboard/presentation/model/download/download_task_state.dart new file mode 100644 index 000000000..19ca745a2 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/model/download/download_task_state.dart @@ -0,0 +1,41 @@ + +import 'package:equatable/equatable.dart'; +import 'package:model/download/download_task_id.dart'; +import 'package:model/email/attachment.dart'; + +class DownloadTaskState with EquatableMixin { + final DownloadTaskId taskId; + final Attachment attachment; + final double progress; + final int downloaded; + final int total; + + DownloadTaskState({ + required this.taskId, + required this.attachment, + this.progress = 0, + this.downloaded = 0, + this.total = 0 + }); + + DownloadTaskState copyWith({ + DownloadTaskId? taskId, + Attachment? attachment, + double? progress, + int? downloaded, + int? total + }) { + return DownloadTaskState( + taskId: taskId ?? this.taskId, + attachment: attachment ?? this.attachment, + progress: progress ?? this.progress, + downloaded: downloaded ?? this.downloaded, + total: total ?? this.total + ); + } + + double get percentDownloading => progress / 100; + + @override + List get props => [taskId, attachment, progress, downloaded, total]; +} \ No newline at end of file