From 0391893b32d5c75375ce828876e8f9fe1669d556 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Tue, 11 Nov 2025 00:00:09 +0800 Subject: [PATCH] :bug: Bug fixes in upload task tracking --- lib/models/drive_task.dart | 1 + lib/models/drive_task.freezed.dart | 39 +++++++++++++------------ lib/models/drive_task.g.dart | 2 ++ lib/pods/upload_tasks.dart | 47 ++++++++++++++++-------------- lib/widgets/upload_overlay.dart | 19 +++++++----- 5 files changed, 61 insertions(+), 47 deletions(-) diff --git a/lib/models/drive_task.dart b/lib/models/drive_task.dart index c6f6f9a4..8e963610 100644 --- a/lib/models/drive_task.dart +++ b/lib/models/drive_task.dart @@ -33,6 +33,7 @@ sealed class DriveTask with _$DriveTask { required String type, // Task type (e.g., 'FileUpload') double? transmissionProgress, // Local file upload progress (0.0-1.0) String? errorMessage, + String? statusMessage, SnCloudFile? result, String? poolId, String? bundleId, diff --git a/lib/models/drive_task.freezed.dart b/lib/models/drive_task.freezed.dart index 3f9752e8..19c7aac0 100644 --- a/lib/models/drive_task.freezed.dart +++ b/lib/models/drive_task.freezed.dart @@ -17,7 +17,7 @@ mixin _$DriveTask { String get id; String get taskId; String get fileName; String get contentType; int get fileSize; int get uploadedBytes; int get totalChunks; int get uploadedChunks; DriveTaskStatus 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; + String? get errorMessage; String? get statusMessage; SnCloudFile? get result; String? get poolId; String? get bundleId; String? get encryptPassword; String? get expiredAt; /// Create a copy of DriveTask /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -30,16 +30,16 @@ $DriveTaskCopyWith get copyWith => _$DriveTaskCopyWithImpl @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is DriveTask&&(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)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is DriveTask&&(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.statusMessage, statusMessage) || other.statusMessage == statusMessage)&&(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.hashAll([runtimeType,id,taskId,fileName,contentType,fileSize,uploadedBytes,totalChunks,uploadedChunks,status,createdAt,updatedAt,type,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,statusMessage,result,poolId,bundleId,encryptPassword,expiredAt]); @override String toString() { - return 'DriveTask(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)'; + return 'DriveTask(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, statusMessage: $statusMessage, result: $result, poolId: $poolId, bundleId: $bundleId, encryptPassword: $encryptPassword, expiredAt: $expiredAt)'; } @@ -50,7 +50,7 @@ abstract mixin class $DriveTaskCopyWith<$Res> { factory $DriveTaskCopyWith(DriveTask value, $Res Function(DriveTask) _then) = _$DriveTaskCopyWithImpl; @useResult $Res call({ - String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, DriveTaskStatus status, DateTime createdAt, DateTime updatedAt, String type, 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, DriveTaskStatus status, DateTime createdAt, DateTime updatedAt, String type, double? transmissionProgress, String? errorMessage, String? statusMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt }); @@ -67,7 +67,7 @@ class _$DriveTaskCopyWithImpl<$Res> /// Create a copy of DriveTask /// 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? type = 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? statusMessage = 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 @@ -83,6 +83,7 @@ as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore 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?,statusMessage: freezed == statusMessage ? _self.statusMessage : statusMessage // 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 as String?,bundleId: freezed == bundleId ? _self.bundleId : bundleId // ignore: cast_nullable_to_non_nullable @@ -182,10 +183,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, DriveTaskStatus 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; +@optionalTypeArgs TResult maybeWhen(TResult Function( String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, DriveTaskStatus status, DateTime createdAt, DateTime updatedAt, String type, double? transmissionProgress, String? errorMessage, String? statusMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt)? $default,{required TResult orElse(),}) {final _that = this; switch (_that) { case _DriveTask() 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.type,_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.statusMessage,_that.result,_that.poolId,_that.bundleId,_that.encryptPassword,_that.expiredAt);case _: return orElse(); } @@ -203,10 +204,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, DriveTaskStatus 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; +@optionalTypeArgs TResult when(TResult Function( String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, DriveTaskStatus status, DateTime createdAt, DateTime updatedAt, String type, double? transmissionProgress, String? errorMessage, String? statusMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt) $default,) {final _that = this; switch (_that) { case _DriveTask(): -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);} +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.statusMessage,_that.result,_that.poolId,_that.bundleId,_that.encryptPassword,_that.expiredAt);} } /// A variant of `when` that fallback to returning `null` /// @@ -220,10 +221,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, DriveTaskStatus 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; +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, DriveTaskStatus status, DateTime createdAt, DateTime updatedAt, String type, double? transmissionProgress, String? errorMessage, String? statusMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt)? $default,) {final _that = this; switch (_that) { case _DriveTask() 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.type,_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.statusMessage,_that.result,_that.poolId,_that.bundleId,_that.encryptPassword,_that.expiredAt);case _: return null; } @@ -235,7 +236,7 @@ return $default(_that.id,_that.taskId,_that.fileName,_that.contentType,_that.fil @JsonSerializable() class _DriveTask extends DriveTask { - const _DriveTask({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._(); + const _DriveTask({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.statusMessage, this.result, this.poolId, this.bundleId, this.encryptPassword, this.expiredAt}): super._(); factory _DriveTask.fromJson(Map json) => _$DriveTaskFromJson(json); @override final String id; @@ -254,6 +255,7 @@ class _DriveTask extends DriveTask { @override final double? transmissionProgress; // Local file upload progress (0.0-1.0) @override final String? errorMessage; +@override final String? statusMessage; @override final SnCloudFile? result; @override final String? poolId; @override final String? bundleId; @@ -273,16 +275,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _DriveTask&&(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)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _DriveTask&&(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.statusMessage, statusMessage) || other.statusMessage == statusMessage)&&(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.hashAll([runtimeType,id,taskId,fileName,contentType,fileSize,uploadedBytes,totalChunks,uploadedChunks,status,createdAt,updatedAt,type,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,statusMessage,result,poolId,bundleId,encryptPassword,expiredAt]); @override String toString() { - return 'DriveTask(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)'; + return 'DriveTask(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, statusMessage: $statusMessage, result: $result, poolId: $poolId, bundleId: $bundleId, encryptPassword: $encryptPassword, expiredAt: $expiredAt)'; } @@ -293,7 +295,7 @@ abstract mixin class _$DriveTaskCopyWith<$Res> implements $DriveTaskCopyWith<$Re factory _$DriveTaskCopyWith(_DriveTask value, $Res Function(_DriveTask) _then) = __$DriveTaskCopyWithImpl; @override @useResult $Res call({ - String id, String taskId, String fileName, String contentType, int fileSize, int uploadedBytes, int totalChunks, int uploadedChunks, DriveTaskStatus status, DateTime createdAt, DateTime updatedAt, String type, 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, DriveTaskStatus status, DateTime createdAt, DateTime updatedAt, String type, double? transmissionProgress, String? errorMessage, String? statusMessage, SnCloudFile? result, String? poolId, String? bundleId, String? encryptPassword, String? expiredAt }); @@ -310,7 +312,7 @@ class __$DriveTaskCopyWithImpl<$Res> /// Create a copy of DriveTask /// 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? type = 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? statusMessage = freezed,Object? result = freezed,Object? poolId = freezed,Object? bundleId = freezed,Object? encryptPassword = freezed,Object? expiredAt = freezed,}) { return _then(_DriveTask( 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 @@ -326,6 +328,7 @@ as DateTime,updatedAt: null == updatedAt ? _self.updatedAt : updatedAt // ignore 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?,statusMessage: freezed == statusMessage ? _self.statusMessage : statusMessage // 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 as String?,bundleId: freezed == bundleId ? _self.bundleId : bundleId // ignore: cast_nullable_to_non_nullable diff --git a/lib/models/drive_task.g.dart b/lib/models/drive_task.g.dart index 82e74e73..17f1d2e2 100644 --- a/lib/models/drive_task.g.dart +++ b/lib/models/drive_task.g.dart @@ -21,6 +21,7 @@ _DriveTask _$DriveTaskFromJson(Map json) => _DriveTask( type: json['type'] as String, transmissionProgress: (json['transmission_progress'] as num?)?.toDouble(), errorMessage: json['error_message'] as String?, + statusMessage: json['status_message'] as String?, result: json['result'] == null ? null @@ -47,6 +48,7 @@ Map _$DriveTaskToJson(_DriveTask instance) => 'type': instance.type, 'transmission_progress': instance.transmissionProgress, 'error_message': instance.errorMessage, + 'status_message': instance.statusMessage, 'result': instance.result?.toJson(), 'pool_id': instance.poolId, 'bundle_id': instance.bundleId, diff --git a/lib/pods/upload_tasks.dart b/lib/pods/upload_tasks.dart index 9e48f78e..4d41832a 100644 --- a/lib/pods/upload_tasks.dart +++ b/lib/pods/upload_tasks.dart @@ -92,20 +92,20 @@ class UploadTasksNotifier extends StateNotifier> { final uploadTask = DriveTask( id: DateTime.now().millisecondsSinceEpoch.toString(), taskId: taskId, - fileName: metadata['fileName'] as String, - contentType: metadata['contentType'] as String, - fileSize: metadata['fileSize'] as int, + fileName: metadata['file_name'] as String, + contentType: metadata['mime_type'] as String, + fileSize: metadata['file_size'] as int, uploadedBytes: 0, - totalChunks: metadata['totalChunks'] as int, + totalChunks: metadata['total_chunks'] as int, uploadedChunks: 0, status: DriveTaskStatus.pending, createdAt: DateTime.now(), updatedAt: DateTime.now(), type: 'FileUpload', - poolId: metadata['poolId'] as String?, + poolId: metadata['pool_id'] as String?, bundleId: metadata['bundleId'] as String?, - encryptPassword: metadata['encryptPassword'] as String?, - expiredAt: metadata['expiredAt'] as String?, + encryptPassword: metadata['encrypt_password'] as String?, + expiredAt: metadata['expired_at'] as String?, ); state = [...state, uploadTask]; @@ -117,19 +117,21 @@ class UploadTasksNotifier extends StateNotifier> { } else { talker.info('[UploadTasks] No metadata found, creating minimal task'); // Create minimal task if no metadata is stored + final params = data['parameters']; final uploadTask = DriveTask( id: DateTime.now().millisecondsSinceEpoch.toString(), taskId: taskId, - fileName: data['name'] as String? ?? 'Unknown file', - contentType: 'application/octet-stream', - fileSize: 0, - uploadedBytes: 0, - totalChunks: 0, - uploadedChunks: 0, + fileName: params['file_name'] as String? ?? 'Unknown file', + contentType: params['content_type'], + fileSize: params['file_size'], + uploadedBytes: + (params['chunk_size'] as int) * (params['chunks_uploaded'] as int), + totalChunks: params['chunks_count'], + uploadedChunks: params['chunks_uploaded'], status: DriveTaskStatus.pending, - createdAt: DateTime.now(), + createdAt: DateTime.tryParse(data['created_at']) ?? DateTime.now(), updatedAt: DateTime.now(), - type: 'FileUpload', + type: data['type'], ); state = [...state, uploadTask]; @@ -147,6 +149,7 @@ class UploadTasksNotifier extends StateNotifier> { if (task.taskId == taskId) { final uploadedBytes = (progress / 100.0 * task.fileSize).toInt(); return task.copyWith( + statusMessage: data['status'], uploadedBytes: uploadedBytes, status: DriveTaskStatus.inProgress, updatedAt: DateTime.now(), @@ -213,14 +216,14 @@ class UploadTasksNotifier extends StateNotifier> { String? expiredAt, }) { _pendingUploads[taskId] = { - 'fileName': fileName, - 'contentType': contentType, - 'fileSize': fileSize, - 'totalChunks': totalChunks, - 'poolId': poolId, + 'file_name': fileName, + 'mime_type': contentType, + 'file_size': fileSize, + 'total_chunks': totalChunks, + 'pool_id': poolId, 'bundleId': bundleId, - 'encryptPassword': encryptPassword, - 'expiredAt': expiredAt, + 'encrypt_password': encryptPassword, + 'expired_at': expiredAt, }; } diff --git a/lib/widgets/upload_overlay.dart b/lib/widgets/upload_overlay.dart index a442420f..7a8b0006 100644 --- a/lib/widgets/upload_overlay.dart +++ b/lib/widgets/upload_overlay.dart @@ -9,6 +9,7 @@ import 'package:island/pods/upload_tasks.dart'; import 'package:island/services/responsive.dart'; import 'package:material_symbols_icons/material_symbols_icons.dart'; import 'package:easy_localization/easy_localization.dart'; +import 'package:styled_widget/styled_widget.dart'; class UploadOverlay extends HookConsumerWidget { const UploadOverlay({super.key}); @@ -55,12 +56,14 @@ class UploadOverlay extends HookConsumerWidget { final isDesktop = isWideScreen(context); return Positioned( - bottom: 16 + MediaQuery.of(context).padding.bottom, + bottom: 0, left: isDesktop ? null : 0, right: isDesktop ? 24 : 0, child: SlideTransition( position: slideAnimation, - child: _UploadOverlayContent(activeTasks: activeTasks), + child: _UploadOverlayContent( + activeTasks: activeTasks, + ).padding(bottom: 16 + MediaQuery.of(context).padding.bottom), ), ); } @@ -98,10 +101,12 @@ class _UploadOverlayContent extends HookConsumerWidget { final isMobile = MediaQuery.of(context).size.width < 600; - return Positioned( - bottom: isMobile ? 16 : 24, - left: isMobile ? 16 : null, - right: isMobile ? 16 : 24, + return Padding( + padding: EdgeInsets.only( + bottom: isMobile ? 16 : 24, + left: isMobile ? 16 : 0, + right: isMobile ? 16 : 24, + ), child: GestureDetector( onTap: () => isExpanded.value = !isExpanded.value, child: AnimatedBuilder( @@ -562,7 +567,7 @@ class _UploadTaskTileState extends State children: [ // Server Processing Progress Text( - 'Server Processing', + widget.task.statusMessage ?? 'Processing', style: Theme.of(context).textTheme.bodySmall?.copyWith( fontWeight: FontWeight.w600, color: Theme.of(context).colorScheme.primary,