From 0493661f9ac0282d5f7a0218f3c743a187d5e7f5 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Mon, 10 Nov 2025 01:49:38 +0800 Subject: [PATCH] :bug: Fixes and optimizations --- lib/main.dart | 2 + lib/models/upload_task.dart | 1 + lib/models/upload_task.freezed.dart | 45 ++--- lib/models/upload_task.g.dart | 2 + lib/pods/chat/messages_notifier.g.dart | 2 +- lib/pods/upload_tasks.dart | 3 + lib/widgets/upload_overlay.dart | 238 +++++++++++++++---------- 7 files changed, 182 insertions(+), 111 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index fa7fd971..16ec7849 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -59,6 +59,8 @@ void main() async { try { await EasyLocalization.ensureInitialized(); + // Disable logs + EasyLocalization.logger.enableBuildModes = []; if (kIsWeb || !Platform.isLinux) { await Firebase.initializeApp( diff --git a/lib/models/upload_task.dart b/lib/models/upload_task.dart index 1dac519b..c3f52268 100644 --- a/lib/models/upload_task.dart +++ b/lib/models/upload_task.dart @@ -30,6 +30,7 @@ sealed class UploadTask with _$UploadTask { required UploadTaskStatus status, required DateTime createdAt, required DateTime updatedAt, + required String type, // Task type (e.g., 'FileUpload') double? transmissionProgress, // Local file upload progress (0.0-1.0) String? errorMessage, SnCloudFile? result, diff --git a/lib/models/upload_task.freezed.dart b/lib/models/upload_task.freezed.dart index 9e12fce7..aad3187d 100644 --- a/lib/models/upload_task.freezed.dart +++ b/lib/models/upload_task.freezed.dart @@ -15,7 +15,8 @@ T _$identity(T value) => value; /// @nodoc mixin _$UploadTask { - String get id; String get taskId; String get fileName; String get contentType; int get fileSize; int get uploadedBytes; int get totalChunks; int get uploadedChunks; UploadTaskStatus get status; DateTime get createdAt; DateTime get updatedAt; double? get transmissionProgress;// Local file upload progress (0.0-1.0) + String get id; String get taskId; String get fileName; String get contentType; int get fileSize; int get uploadedBytes; int get totalChunks; int get uploadedChunks; UploadTaskStatus get status; DateTime get createdAt; DateTime get updatedAt; String get type;// Task type (e.g., 'FileUpload') + double? get transmissionProgress;// Local file upload progress (0.0-1.0) String? get errorMessage; SnCloudFile? get result; String? get poolId; String? get bundleId; String? get encryptPassword; String? get expiredAt; /// Create a copy of UploadTask /// with the given fields replaced by the non-null parameter values. @@ -29,16 +30,16 @@ $UploadTaskCopyWith get copyWith => _$UploadTaskCopyWithImpl Object.hash(runtimeType,id,taskId,fileName,contentType,fileSize,uploadedBytes,totalChunks,uploadedChunks,status,createdAt,updatedAt,transmissionProgress,errorMessage,result,poolId,bundleId,encryptPassword,expiredAt); +int get hashCode => Object.hashAll([runtimeType,id,taskId,fileName,contentType,fileSize,uploadedBytes,totalChunks,uploadedChunks,status,createdAt,updatedAt,type,transmissionProgress,errorMessage,result,poolId,bundleId,encryptPassword,expiredAt]); @override String toString() { - return 'UploadTask(id: $id, taskId: $taskId, fileName: $fileName, contentType: $contentType, fileSize: $fileSize, uploadedBytes: $uploadedBytes, totalChunks: $totalChunks, uploadedChunks: $uploadedChunks, status: $status, createdAt: $createdAt, updatedAt: $updatedAt, transmissionProgress: $transmissionProgress, errorMessage: $errorMessage, result: $result, poolId: $poolId, bundleId: $bundleId, encryptPassword: $encryptPassword, expiredAt: $expiredAt)'; + return 'UploadTask(id: $id, taskId: $taskId, fileName: $fileName, contentType: $contentType, fileSize: $fileSize, uploadedBytes: $uploadedBytes, totalChunks: $totalChunks, uploadedChunks: $uploadedChunks, status: $status, createdAt: $createdAt, updatedAt: $updatedAt, type: $type, transmissionProgress: $transmissionProgress, errorMessage: $errorMessage, result: $result, poolId: $poolId, bundleId: $bundleId, encryptPassword: $encryptPassword, expiredAt: $expiredAt)'; } @@ -49,7 +50,7 @@ abstract mixin class $UploadTaskCopyWith<$Res> { factory $UploadTaskCopyWith(UploadTask value, $Res Function(UploadTask) _then) = _$UploadTaskCopyWithImpl; @useResult $Res call({ - String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, UploadTaskStatus status, DateTime createdAt, DateTime updatedAt, double? transmissionProgress, String? errorMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt + String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, UploadTaskStatus status, DateTime createdAt, DateTime updatedAt, String type, double? transmissionProgress, String? errorMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt }); @@ -66,7 +67,7 @@ class _$UploadTaskCopyWithImpl<$Res> /// Create a copy of UploadTask /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? taskId = null,Object? fileName = null,Object? contentType = null,Object? fileSize = null,Object? uploadedBytes = null,Object? totalChunks = null,Object? uploadedChunks = null,Object? status = null,Object? createdAt = null,Object? updatedAt = null,Object? transmissionProgress = freezed,Object? errorMessage = freezed,Object? result = freezed,Object? poolId = freezed,Object? bundleId = freezed,Object? encryptPassword = freezed,Object? expiredAt = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? id = null,Object? taskId = null,Object? fileName = null,Object? contentType = null,Object? fileSize = null,Object? uploadedBytes = null,Object? totalChunks = null,Object? uploadedChunks = null,Object? status = null,Object? createdAt = null,Object? updatedAt = null,Object? type = null,Object? transmissionProgress = freezed,Object? errorMessage = freezed,Object? result = freezed,Object? poolId = freezed,Object? bundleId = freezed,Object? encryptPassword = freezed,Object? expiredAt = freezed,}) { return _then(_self.copyWith( id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as String,taskId: null == taskId ? _self.taskId : taskId // ignore: cast_nullable_to_non_nullable @@ -79,7 +80,8 @@ as int,uploadedChunks: null == uploadedChunks ? _self.uploadedChunks : uploadedC as int,status: null == status ? _self.status : status // ignore: cast_nullable_to_non_nullable as UploadTaskStatus,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable -as DateTime,transmissionProgress: freezed == transmissionProgress ? _self.transmissionProgress : transmissionProgress // ignore: cast_nullable_to_non_nullable +as DateTime,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String,transmissionProgress: freezed == transmissionProgress ? _self.transmissionProgress : transmissionProgress // ignore: cast_nullable_to_non_nullable as double?,errorMessage: freezed == errorMessage ? _self.errorMessage : errorMessage // ignore: cast_nullable_to_non_nullable as String?,result: freezed == result ? _self.result : result // ignore: cast_nullable_to_non_nullable as SnCloudFile?,poolId: freezed == poolId ? _self.poolId : poolId // ignore: cast_nullable_to_non_nullable @@ -180,10 +182,10 @@ return $default(_that);case _: /// } /// ``` -@optionalTypeArgs TResult maybeWhen(TResult Function( String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, UploadTaskStatus status, DateTime createdAt, DateTime updatedAt, double? transmissionProgress, String? errorMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt)? $default,{required TResult orElse(),}) {final _that = this; +@optionalTypeArgs TResult maybeWhen(TResult Function( String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, UploadTaskStatus status, DateTime createdAt, DateTime updatedAt, String type, double? transmissionProgress, String? errorMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt)? $default,{required TResult orElse(),}) {final _that = this; switch (_that) { case _UploadTask() when $default != null: -return $default(_that.id,_that.taskId,_that.fileName,_that.contentType,_that.fileSize,_that.uploadedBytes,_that.totalChunks,_that.uploadedChunks,_that.status,_that.createdAt,_that.updatedAt,_that.transmissionProgress,_that.errorMessage,_that.result,_that.poolId,_that.bundleId,_that.encryptPassword,_that.expiredAt);case _: +return $default(_that.id,_that.taskId,_that.fileName,_that.contentType,_that.fileSize,_that.uploadedBytes,_that.totalChunks,_that.uploadedChunks,_that.status,_that.createdAt,_that.updatedAt,_that.type,_that.transmissionProgress,_that.errorMessage,_that.result,_that.poolId,_that.bundleId,_that.encryptPassword,_that.expiredAt);case _: return orElse(); } @@ -201,10 +203,10 @@ return $default(_that.id,_that.taskId,_that.fileName,_that.contentType,_that.fil /// } /// ``` -@optionalTypeArgs TResult when(TResult Function( String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, UploadTaskStatus status, DateTime createdAt, DateTime updatedAt, double? transmissionProgress, String? errorMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt) $default,) {final _that = this; +@optionalTypeArgs TResult when(TResult Function( String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, UploadTaskStatus status, DateTime createdAt, DateTime updatedAt, String type, double? transmissionProgress, String? errorMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt) $default,) {final _that = this; switch (_that) { case _UploadTask(): -return $default(_that.id,_that.taskId,_that.fileName,_that.contentType,_that.fileSize,_that.uploadedBytes,_that.totalChunks,_that.uploadedChunks,_that.status,_that.createdAt,_that.updatedAt,_that.transmissionProgress,_that.errorMessage,_that.result,_that.poolId,_that.bundleId,_that.encryptPassword,_that.expiredAt);} +return $default(_that.id,_that.taskId,_that.fileName,_that.contentType,_that.fileSize,_that.uploadedBytes,_that.totalChunks,_that.uploadedChunks,_that.status,_that.createdAt,_that.updatedAt,_that.type,_that.transmissionProgress,_that.errorMessage,_that.result,_that.poolId,_that.bundleId,_that.encryptPassword,_that.expiredAt);} } /// A variant of `when` that fallback to returning `null` /// @@ -218,10 +220,10 @@ return $default(_that.id,_that.taskId,_that.fileName,_that.contentType,_that.fil /// } /// ``` -@optionalTypeArgs TResult? whenOrNull(TResult? Function( String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, UploadTaskStatus status, DateTime createdAt, DateTime updatedAt, double? transmissionProgress, String? errorMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt)? $default,) {final _that = this; +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, UploadTaskStatus status, DateTime createdAt, DateTime updatedAt, String type, double? transmissionProgress, String? errorMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt)? $default,) {final _that = this; switch (_that) { case _UploadTask() when $default != null: -return $default(_that.id,_that.taskId,_that.fileName,_that.contentType,_that.fileSize,_that.uploadedBytes,_that.totalChunks,_that.uploadedChunks,_that.status,_that.createdAt,_that.updatedAt,_that.transmissionProgress,_that.errorMessage,_that.result,_that.poolId,_that.bundleId,_that.encryptPassword,_that.expiredAt);case _: +return $default(_that.id,_that.taskId,_that.fileName,_that.contentType,_that.fileSize,_that.uploadedBytes,_that.totalChunks,_that.uploadedChunks,_that.status,_that.createdAt,_that.updatedAt,_that.type,_that.transmissionProgress,_that.errorMessage,_that.result,_that.poolId,_that.bundleId,_that.encryptPassword,_that.expiredAt);case _: return null; } @@ -233,7 +235,7 @@ return $default(_that.id,_that.taskId,_that.fileName,_that.contentType,_that.fil @JsonSerializable() class _UploadTask extends UploadTask { - const _UploadTask({required this.id, required this.taskId, required this.fileName, required this.contentType, required this.fileSize, required this.uploadedBytes, required this.totalChunks, required this.uploadedChunks, required this.status, required this.createdAt, required this.updatedAt, this.transmissionProgress, this.errorMessage, this.result, this.poolId, this.bundleId, this.encryptPassword, this.expiredAt}): super._(); + const _UploadTask({required this.id, required this.taskId, required this.fileName, required this.contentType, required this.fileSize, required this.uploadedBytes, required this.totalChunks, required this.uploadedChunks, required this.status, required this.createdAt, required this.updatedAt, required this.type, this.transmissionProgress, this.errorMessage, this.result, this.poolId, this.bundleId, this.encryptPassword, this.expiredAt}): super._(); factory _UploadTask.fromJson(Map json) => _$UploadTaskFromJson(json); @override final String id; @@ -247,6 +249,8 @@ class _UploadTask extends UploadTask { @override final UploadTaskStatus status; @override final DateTime createdAt; @override final DateTime updatedAt; +@override final String type; +// Task type (e.g., 'FileUpload') @override final double? transmissionProgress; // Local file upload progress (0.0-1.0) @override final String? errorMessage; @@ -269,16 +273,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _UploadTask&&(identical(other.id, id) || other.id == id)&&(identical(other.taskId, taskId) || other.taskId == taskId)&&(identical(other.fileName, fileName) || other.fileName == fileName)&&(identical(other.contentType, contentType) || other.contentType == contentType)&&(identical(other.fileSize, fileSize) || other.fileSize == fileSize)&&(identical(other.uploadedBytes, uploadedBytes) || other.uploadedBytes == uploadedBytes)&&(identical(other.totalChunks, totalChunks) || other.totalChunks == totalChunks)&&(identical(other.uploadedChunks, uploadedChunks) || other.uploadedChunks == uploadedChunks)&&(identical(other.status, status) || other.status == status)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.transmissionProgress, transmissionProgress) || other.transmissionProgress == transmissionProgress)&&(identical(other.errorMessage, errorMessage) || other.errorMessage == errorMessage)&&(identical(other.result, result) || other.result == result)&&(identical(other.poolId, poolId) || other.poolId == poolId)&&(identical(other.bundleId, bundleId) || other.bundleId == bundleId)&&(identical(other.encryptPassword, encryptPassword) || other.encryptPassword == encryptPassword)&&(identical(other.expiredAt, expiredAt) || other.expiredAt == expiredAt)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _UploadTask&&(identical(other.id, id) || other.id == id)&&(identical(other.taskId, taskId) || other.taskId == taskId)&&(identical(other.fileName, fileName) || other.fileName == fileName)&&(identical(other.contentType, contentType) || other.contentType == contentType)&&(identical(other.fileSize, fileSize) || other.fileSize == fileSize)&&(identical(other.uploadedBytes, uploadedBytes) || other.uploadedBytes == uploadedBytes)&&(identical(other.totalChunks, totalChunks) || other.totalChunks == totalChunks)&&(identical(other.uploadedChunks, uploadedChunks) || other.uploadedChunks == uploadedChunks)&&(identical(other.status, status) || other.status == status)&&(identical(other.createdAt, createdAt) || other.createdAt == createdAt)&&(identical(other.updatedAt, updatedAt) || other.updatedAt == updatedAt)&&(identical(other.type, type) || other.type == type)&&(identical(other.transmissionProgress, transmissionProgress) || other.transmissionProgress == transmissionProgress)&&(identical(other.errorMessage, errorMessage) || other.errorMessage == errorMessage)&&(identical(other.result, result) || other.result == result)&&(identical(other.poolId, poolId) || other.poolId == poolId)&&(identical(other.bundleId, bundleId) || other.bundleId == bundleId)&&(identical(other.encryptPassword, encryptPassword) || other.encryptPassword == encryptPassword)&&(identical(other.expiredAt, expiredAt) || other.expiredAt == expiredAt)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,id,taskId,fileName,contentType,fileSize,uploadedBytes,totalChunks,uploadedChunks,status,createdAt,updatedAt,transmissionProgress,errorMessage,result,poolId,bundleId,encryptPassword,expiredAt); +int get hashCode => Object.hashAll([runtimeType,id,taskId,fileName,contentType,fileSize,uploadedBytes,totalChunks,uploadedChunks,status,createdAt,updatedAt,type,transmissionProgress,errorMessage,result,poolId,bundleId,encryptPassword,expiredAt]); @override String toString() { - return 'UploadTask(id: $id, taskId: $taskId, fileName: $fileName, contentType: $contentType, fileSize: $fileSize, uploadedBytes: $uploadedBytes, totalChunks: $totalChunks, uploadedChunks: $uploadedChunks, status: $status, createdAt: $createdAt, updatedAt: $updatedAt, transmissionProgress: $transmissionProgress, errorMessage: $errorMessage, result: $result, poolId: $poolId, bundleId: $bundleId, encryptPassword: $encryptPassword, expiredAt: $expiredAt)'; + return 'UploadTask(id: $id, taskId: $taskId, fileName: $fileName, contentType: $contentType, fileSize: $fileSize, uploadedBytes: $uploadedBytes, totalChunks: $totalChunks, uploadedChunks: $uploadedChunks, status: $status, createdAt: $createdAt, updatedAt: $updatedAt, type: $type, transmissionProgress: $transmissionProgress, errorMessage: $errorMessage, result: $result, poolId: $poolId, bundleId: $bundleId, encryptPassword: $encryptPassword, expiredAt: $expiredAt)'; } @@ -289,7 +293,7 @@ abstract mixin class _$UploadTaskCopyWith<$Res> implements $UploadTaskCopyWith<$ factory _$UploadTaskCopyWith(_UploadTask value, $Res Function(_UploadTask) _then) = __$UploadTaskCopyWithImpl; @override @useResult $Res call({ - String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, UploadTaskStatus status, DateTime createdAt, DateTime updatedAt, double? transmissionProgress, String? errorMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt + String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, UploadTaskStatus status, DateTime createdAt, DateTime updatedAt, String type, double? transmissionProgress, String? errorMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt }); @@ -306,7 +310,7 @@ class __$UploadTaskCopyWithImpl<$Res> /// Create a copy of UploadTask /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? taskId = null,Object? fileName = null,Object? contentType = null,Object? fileSize = null,Object? uploadedBytes = null,Object? totalChunks = null,Object? uploadedChunks = null,Object? status = null,Object? createdAt = null,Object? updatedAt = null,Object? transmissionProgress = freezed,Object? errorMessage = freezed,Object? result = freezed,Object? poolId = freezed,Object? bundleId = freezed,Object? encryptPassword = freezed,Object? expiredAt = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? id = null,Object? taskId = null,Object? fileName = null,Object? contentType = null,Object? fileSize = null,Object? uploadedBytes = null,Object? totalChunks = null,Object? uploadedChunks = null,Object? status = null,Object? createdAt = null,Object? updatedAt = null,Object? type = null,Object? transmissionProgress = freezed,Object? errorMessage = freezed,Object? result = freezed,Object? poolId = freezed,Object? bundleId = freezed,Object? encryptPassword = freezed,Object? expiredAt = freezed,}) { return _then(_UploadTask( id: null == id ? _self.id : id // ignore: cast_nullable_to_non_nullable as String,taskId: null == taskId ? _self.taskId : taskId // ignore: cast_nullable_to_non_nullable @@ -319,7 +323,8 @@ as int,uploadedChunks: null == uploadedChunks ? _self.uploadedChunks : uploadedC as int,status: null == status ? _self.status : status // ignore: cast_nullable_to_non_nullable as UploadTaskStatus,createdAt: null == createdAt ? _self.createdAt : createdAt // ignore: cast_nullable_to_non_nullable as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore: cast_nullable_to_non_nullable -as DateTime,transmissionProgress: freezed == transmissionProgress ? _self.transmissionProgress : transmissionProgress // ignore: cast_nullable_to_non_nullable +as DateTime,type: null == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String,transmissionProgress: freezed == transmissionProgress ? _self.transmissionProgress : transmissionProgress // ignore: cast_nullable_to_non_nullable as double?,errorMessage: freezed == errorMessage ? _self.errorMessage : errorMessage // ignore: cast_nullable_to_non_nullable as String?,result: freezed == result ? _self.result : result // ignore: cast_nullable_to_non_nullable as SnCloudFile?,poolId: freezed == poolId ? _self.poolId : poolId // ignore: cast_nullable_to_non_nullable diff --git a/lib/models/upload_task.g.dart b/lib/models/upload_task.g.dart index fa215ec9..57f517be 100644 --- a/lib/models/upload_task.g.dart +++ b/lib/models/upload_task.g.dart @@ -18,6 +18,7 @@ _UploadTask _$UploadTaskFromJson(Map json) => _UploadTask( status: $enumDecode(_$UploadTaskStatusEnumMap, json['status']), createdAt: DateTime.parse(json['created_at'] as String), updatedAt: DateTime.parse(json['updated_at'] as String), + type: json['type'] as String, transmissionProgress: (json['transmission_progress'] as num?)?.toDouble(), errorMessage: json['error_message'] as String?, result: @@ -43,6 +44,7 @@ Map _$UploadTaskToJson(_UploadTask instance) => 'status': _$UploadTaskStatusEnumMap[instance.status]!, 'created_at': instance.createdAt.toIso8601String(), 'updated_at': instance.updatedAt.toIso8601String(), + 'type': instance.type, 'transmission_progress': instance.transmissionProgress, 'error_message': instance.errorMessage, 'result': instance.result?.toJson(), diff --git a/lib/pods/chat/messages_notifier.g.dart b/lib/pods/chat/messages_notifier.g.dart index 75cfe18f..cf099923 100644 --- a/lib/pods/chat/messages_notifier.g.dart +++ b/lib/pods/chat/messages_notifier.g.dart @@ -6,7 +6,7 @@ part of 'messages_notifier.dart'; // RiverpodGenerator // ************************************************************************** -String _$messagesNotifierHash() => r'b1d5d583199941d55dfdc707e1a22eec9616b7f1'; +String _$messagesNotifierHash() => r'c009eb8598e8b5fbcece2d0b5213b2e434edb3b2'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/pods/upload_tasks.dart b/lib/pods/upload_tasks.dart index 22e19fc7..558e08ad 100644 --- a/lib/pods/upload_tasks.dart +++ b/lib/pods/upload_tasks.dart @@ -101,6 +101,7 @@ class UploadTasksNotifier extends StateNotifier> { status: UploadTaskStatus.pending, createdAt: DateTime.now(), updatedAt: DateTime.now(), + type: 'FileUpload', poolId: metadata['poolId'] as String?, bundleId: metadata['bundleId'] as String?, encryptPassword: metadata['encryptPassword'] as String?, @@ -128,6 +129,7 @@ class UploadTasksNotifier extends StateNotifier> { status: UploadTaskStatus.pending, createdAt: DateTime.now(), updatedAt: DateTime.now(), + type: 'FileUpload', ); state = [...state, uploadTask]; @@ -390,6 +392,7 @@ class EnhancedFileUploader extends FileUploader { status: UploadTaskStatus.completed, createdAt: DateTime.now(), updatedAt: DateTime.now(), + type: 'FileUpload', poolId: poolId, bundleId: bundleId, encryptPassword: encryptPassword, diff --git a/lib/widgets/upload_overlay.dart b/lib/widgets/upload_overlay.dart index b4d8b330..ed92a812 100644 --- a/lib/widgets/upload_overlay.dart +++ b/lib/widgets/upload_overlay.dart @@ -541,119 +541,177 @@ class _UploadTaskTileState extends State } Widget _buildExpandedDetails(BuildContext context) { - final transmissionProgress = widget.task.transmissionProgress ?? 0.0; - return Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: Theme.of(context).colorScheme.surfaceContainerHighest, borderRadius: BorderRadius.circular(6), ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Server Processing Progress - Text( - 'Server Processing', - style: Theme.of(context).textTheme.bodySmall?.copyWith( - fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.primary, - ), - ), - const SizedBox(height: 2), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - '${(widget.task.progress * 100).toStringAsFixed(1)}%', - style: Theme.of( - context, - ).textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w600), - ), - Text( - '${widget.task.uploadedChunks}/${widget.task.totalChunks} chunks', - style: Theme.of(context).textTheme.bodySmall, - ), - ], - ), - const SizedBox(height: 4), - LinearProgressIndicator( - value: widget.task.progress, - backgroundColor: Theme.of(context).colorScheme.surface, - valueColor: AlwaysStoppedAnimation( - Theme.of(context).colorScheme.primary, - ), - ), + child: switch (widget.task.type) { + 'FileUpload' => _buildFileUploadDetails(context), + _ => _buildGenericTaskDetails(context), + }, + ); + } - const SizedBox(height: 8), + Widget _buildFileUploadDetails(BuildContext context) { + final transmissionProgress = widget.task.transmissionProgress ?? 0.0; - // File Transmission Progress - Text( - 'File Transmission', - style: Theme.of(context).textTheme.bodySmall?.copyWith( - fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.secondary, + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Server Processing Progress + Text( + 'Server Processing', + style: Theme.of(context).textTheme.bodySmall?.copyWith( + fontWeight: FontWeight.w600, + color: Theme.of(context).colorScheme.primary, + ), + ), + const SizedBox(height: 2), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${(widget.task.progress * 100).toStringAsFixed(1)}%', + style: Theme.of( + context, + ).textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w600), ), - ), - const SizedBox(height: 2), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - '${(transmissionProgress * 100).toStringAsFixed(1)}%', - style: Theme.of( - context, - ).textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w600), - ), - Text( - '${_formatFileSize((transmissionProgress * widget.task.fileSize).toInt())} / ${_formatFileSize(widget.task.fileSize)}', - style: Theme.of(context).textTheme.bodySmall, - ), - ], - ), - const SizedBox(height: 4), - LinearProgressIndicator( - value: transmissionProgress, - backgroundColor: Theme.of(context).colorScheme.surface, - valueColor: AlwaysStoppedAnimation( - Theme.of(context).colorScheme.secondary, + Text( + '${widget.task.uploadedChunks}/${widget.task.totalChunks} chunks', + style: Theme.of(context).textTheme.bodySmall, ), + ], + ), + const SizedBox(height: 4), + LinearProgressIndicator( + value: widget.task.progress, + backgroundColor: Theme.of(context).colorScheme.surface, + valueColor: AlwaysStoppedAnimation( + Theme.of(context).colorScheme.primary, ), + ), - const SizedBox(height: 4), + const SizedBox(height: 8), - // Speed and ETA - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ + // File Transmission Progress + Text( + 'File Transmission', + style: Theme.of(context).textTheme.bodySmall?.copyWith( + fontWeight: FontWeight.w600, + color: Theme.of(context).colorScheme.secondary, + ), + ), + const SizedBox(height: 2), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${(transmissionProgress * 100).toStringAsFixed(1)}%', + style: Theme.of( + context, + ).textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w600), + ), + Text( + '${_formatFileSize((transmissionProgress * widget.task.fileSize).toInt())} / ${_formatFileSize(widget.task.fileSize)}', + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + const SizedBox(height: 4), + LinearProgressIndicator( + value: transmissionProgress, + backgroundColor: Theme.of(context).colorScheme.surface, + valueColor: AlwaysStoppedAnimation( + Theme.of(context).colorScheme.secondary, + ), + ), + + const SizedBox(height: 4), + + // Speed and ETA + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + _formatBytesPerSecond(widget.task), + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), + if (widget.task.status == UploadTaskStatus.inProgress) Text( - _formatBytesPerSecond(widget.task), + 'ETA: ${_formatDuration(widget.task.estimatedTimeRemaining)}', style: Theme.of(context).textTheme.bodySmall?.copyWith( color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), - if (widget.task.status == UploadTaskStatus.inProgress) - Text( - 'ETA: ${_formatDuration(widget.task.estimatedTimeRemaining)}', - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: Theme.of(context).colorScheme.onSurfaceVariant, - ), - ), - ], - ), + ], + ), - // Error message if failed - if (widget.task.errorMessage != null) ...[ - const SizedBox(height: 4), + // Error message if failed + if (widget.task.errorMessage != null) ...[ + const SizedBox(height: 4), + Text( + widget.task.errorMessage!, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: Theme.of(context).colorScheme.error, + ), + ), + ], + ], + ); + } + + Widget _buildGenericTaskDetails(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Generic task progress + Text( + 'Progress', + style: Theme.of(context).textTheme.bodySmall?.copyWith( + fontWeight: FontWeight.w600, + color: Theme.of(context).colorScheme.primary, + ), + ), + const SizedBox(height: 2), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ Text( - widget.task.errorMessage!, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: Theme.of(context).colorScheme.error, - ), + '${(widget.task.progress * 100).toStringAsFixed(1)}%', + style: Theme.of( + context, + ).textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w600), + ), + Text( + widget.task.status.name, + style: Theme.of(context).textTheme.bodySmall, ), ], + ), + const SizedBox(height: 4), + LinearProgressIndicator( + value: widget.task.progress, + backgroundColor: Theme.of(context).colorScheme.surface, + valueColor: AlwaysStoppedAnimation( + Theme.of(context).colorScheme.primary, + ), + ), + + // Error message if failed + if (widget.task.errorMessage != null) ...[ + const SizedBox(height: 4), + Text( + widget.task.errorMessage!, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: Theme.of(context).colorScheme.error, + ), + ), ], - ), + ], ); }