diff --git a/lib/screens/posts/post_editor.dart b/lib/screens/posts/post_editor.dart index 113f42b..d281783 100644 --- a/lib/screens/posts/post_editor.dart +++ b/lib/screens/posts/post_editor.dart @@ -8,6 +8,7 @@ import 'package:solian/controllers/post_editor_controller.dart'; import 'package:solian/exts.dart'; import 'package:solian/models/post.dart'; import 'package:solian/models/realm.dart'; +import 'package:solian/providers/attachment_uploader.dart'; import 'package:solian/providers/auth.dart'; import 'package:solian/router.dart'; import 'package:solian/theme.dart'; @@ -56,6 +57,14 @@ class _PostPublishScreenState extends State { if (auth.isAuthorized.isFalse) return; if (_editorController.isEmpty) return; + final AttachmentUploaderController uploader = Get.find(); + if (uploader.queueOfUpload.any( + ((x) => x.usage == 'i.attachment' && x.isUploading), + )) { + context.showErrorDialog('attachmentUploadInProgress'.tr); + return; + } + setState(() => _isBusy = true); final client = auth.configureClient('interactive'); @@ -92,15 +101,16 @@ class _PostPublishScreenState extends State { } } - void cancelAction() { + void _cancelAction() { _editorController.localClear(); AppRouter.instance.pop(); } Post? get _editTo => _editorController.editTo.value; + Post? get _replyTo => _editorController.replyTo.value; + Post? get _repostTo => _editorController.repostTo.value; - Realm? get _realm => _editorController.realmZone.value; @override void initState() { @@ -114,7 +124,7 @@ class _PostPublishScreenState extends State { Widget build(BuildContext context) { final notifyBannerActions = [ TextButton( - onPressed: cancelAction, + onPressed: _cancelAction, child: Text('cancel'.tr), ) ]; diff --git a/lib/services.dart b/lib/services.dart index 42253c0..ab41ad8 100644 --- a/lib/services.dart +++ b/lib/services.dart @@ -1,7 +1,7 @@ import 'package:get/get.dart'; abstract class ServiceFinder { - static const bool devFlag = false; + static const bool devFlag = true; static const String dealerUrl = devFlag ? 'http://localhost:8442' : 'https://api.sn.solsynth.dev'; diff --git a/lib/translations/en_us.dart b/lib/translations/en_us.dart index fded378..ff55d03 100644 --- a/lib/translations/en_us.dart +++ b/lib/translations/en_us.dart @@ -160,6 +160,7 @@ const i18nEnglish = { 'attachmentAutoUpload': 'Auto Upload', 'attachmentUploadQueue': 'Upload Queue', 'attachmentUploadQueueStart': 'Start All', + 'attachmentUploadInProgress': 'There are attachments being uploaded. Please wait until all attachments have been uploaded before proceeding...', 'attachmentAttached': 'Exists Files', 'attachmentUploadBlocked': 'Upload blocked, there is currently a task in progress...', 'attachmentAdd': 'Attach attachments', diff --git a/lib/translations/zh_cn.dart b/lib/translations/zh_cn.dart index 2636635..95c22f0 100644 --- a/lib/translations/zh_cn.dart +++ b/lib/translations/zh_cn.dart @@ -149,6 +149,7 @@ const i18nSimplifiedChinese = { 'attachmentAutoUpload': '自动上传', 'attachmentUploadQueue': '上传队列', 'attachmentUploadQueueStart': '整队上传', + 'attachmentUploadInProgress': '有附件正在上传,请等待所有附件上传完毕后再进行操作……', 'attachmentAttached': '已附附件', 'attachmentUploadBlocked': '上传受阻,当前已有任务进行中……', 'attachmentAdd': '附加附件', diff --git a/lib/widgets/attachments/attachment_editor.dart b/lib/widgets/attachments/attachment_editor.dart index d8166cd..db40ef6 100644 --- a/lib/widgets/attachments/attachment_editor.dart +++ b/lib/widgets/attachments/attachment_editor.dart @@ -455,11 +455,12 @@ class _AttachmentEditorPopupState extends State { const SizedBox(width: 10), Obx(() { if (_uploadController.isUploading.value) { - return const SizedBox( + return SizedBox( width: 18, height: 18, child: CircularProgressIndicator( strokeWidth: 2.5, + value: _uploadController.progressOfUpload.value, ), ); } diff --git a/lib/widgets/chat/chat_message_input.dart b/lib/widgets/chat/chat_message_input.dart index 275f171..02876e5 100644 --- a/lib/widgets/chat/chat_message_input.dart +++ b/lib/widgets/chat/chat_message_input.dart @@ -5,9 +5,11 @@ import 'package:solian/exts.dart'; import 'package:solian/models/account.dart'; import 'package:solian/models/channel.dart'; import 'package:solian/models/event.dart'; +import 'package:solian/providers/attachment_uploader.dart'; import 'package:solian/providers/auth.dart'; import 'package:solian/widgets/attachments/attachment_editor.dart'; import 'package:solian/widgets/chat/chat_event.dart'; +import 'package:badges/badges.dart' as badges; import 'package:uuid/uuid.dart'; class ChatMessageInput extends StatefulWidget { @@ -80,6 +82,14 @@ class _ChatMessageInputState extends State { final prof = auth.userProfile.value!; if (auth.isAuthorized.isFalse) return; + final AttachmentUploaderController uploader = Get.find(); + if (uploader.queueOfUpload.any( + ((x) => x.usage == 'm.attachment' && x.isUploading), + )) { + context.showErrorDialog('attachmentUploadInProgress'.tr); + return; + } + Response resp; final mentionedUserNames = _findMentionedUsers(_textController.text); @@ -259,7 +269,18 @@ class _ChatMessageInputState extends State { ), ), IconButton( - icon: const Icon(Icons.attach_file), + icon: badges.Badge( + badgeContent: Text( + _attachments.length.toString(), + style: const TextStyle(color: Colors.white), + ), + showBadge: _attachments.isNotEmpty, + position: badges.BadgePosition.topEnd( + top: -12, + end: -8, + ), + child: const Icon(Icons.file_present_rounded), + ), color: Colors.teal, onPressed: () => _editAttachments(), ),