refactor: Enhance file attachment handling and UI components

- Updated the file attachment service to utilize a new LocalAttachment class, improving the management of file metadata such as display names.
- Refactored methods for picking and uploading files to accommodate the new LocalAttachment structure, ensuring consistent handling of file attributes.
- Improved the chat page to validate and manage file attachments more effectively, enhancing user experience during file uploads.
- Added functionality for image previews in the file attachment widget, allowing users to see selected images before sending.
- Introduced a remove button for attachments, improving usability by enabling users to easily discard unwanted files.
This commit is contained in:
cogwheel0
2025-10-19 13:50:54 +05:30
parent 1104661238
commit 2f8fd97022
8 changed files with 416 additions and 89 deletions

View File

@@ -127,6 +127,43 @@ class TaskQueueNotifier extends Notifier<List<OutboundTask>> {
await _save();
}
Future<void> cancelUploadsForFile(String filePath) async {
bool updated = false;
state = [
for (final task in state)
task.maybeMap(
uploadMedia: (upload) {
if ((upload.status == TaskStatus.queued ||
upload.status == TaskStatus.running) &&
upload.filePath == filePath) {
updated = true;
return upload.copyWith(
status: TaskStatus.cancelled,
completedAt: DateTime.now(),
);
}
return upload;
},
imageToDataUrl: (image) {
if ((image.status == TaskStatus.queued ||
image.status == TaskStatus.running) &&
image.filePath == filePath) {
updated = true;
return image.copyWith(
status: TaskStatus.cancelled,
completedAt: DateTime.now(),
);
}
return image;
},
orElse: () => task,
),
];
if (updated) {
await _save();
}
}
Future<void> cancelByConversation(String conversationId) async {
state = [
for (final t in state)

View File

@@ -107,6 +107,10 @@ class TaskWorker {
QueuedAttachmentStatus.failed => FileUploadStatus.failed,
QueuedAttachmentStatus.cancelled => FileUploadStatus.failed,
};
const imageExts = <String>{'.jpg', '.jpeg', '.png', '.gif', '.webp'};
final lowerName = task.fileName.toLowerCase();
final bool isImage =
existing.isImage ?? imageExts.any(lowerName.endsWith);
final newState = FileUploadState(
file: File(task.filePath),
fileName: task.fileName,
@@ -117,6 +121,7 @@ class TaskWorker {
status: status,
fileId: entry.fileId ?? existing.fileId,
error: entry.lastError,
isImage: isImage,
);
_ref
.read(attachedFilesProvider.notifier)
@@ -260,6 +265,7 @@ class TaskWorker {
progress: 0.0,
status: FileUploadStatus.uploading,
fileId: existing.fileId,
isImage: existing.isImage ?? true,
);
_ref
.read(attachedFilesProvider.notifier)

View File

@@ -482,7 +482,7 @@ class TweakcnThemes {
preview: const <Color>[
Color(0xFFC96442),
Color(0xFFE9E6DC),
Color(0xFF9C87F5),
Color(0xFF1A1915),
],
);
@@ -508,7 +508,7 @@ class TweakcnThemes {
preview: const <Color>[
Color(0xFFA1A1AA),
Color(0xFFF4F4F5),
Color(0xFF2563EB),
Color(0xFF404040),
],
);