💄 Optimized attachment insert in article compose

This commit is contained in:
LittleSheep 2025-07-03 01:11:56 +08:00
parent ee72d79c93
commit 23321171f3
4 changed files with 26 additions and 10 deletions

View File

@ -375,7 +375,9 @@
"postContent": "Content",
"postSettings": "Settings",
"postPublisherUnselected": "Publisher Unspecified",
"postVisibility": "Visibility",
"postType": "Post Type",
"articleAttachmentHint": "Attachments must be uploaded and inserted into the article body to be visible.",
"postVisibility": "Post Visibility",
"postVisibilityPublic": "Public",
"postVisibilityFriends": "Friends Only",
"postVisibilityUnlisted": "Unlisted",

View File

@ -321,8 +321,15 @@ class ArticleComposeScreen extends HookConsumerWidget {
builder: (context, attachments, _) {
if (attachments.isEmpty) return const SizedBox.shrink();
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Gap(16),
Text(
'articleAttachmentHint'.tr(),
style: Theme.of(context).textTheme.bodySmall?.copyWith(
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
).padding(bottom: 8),
ValueListenableBuilder<Map<int, double>>(
valueListenable: state.attachmentProgress,
builder: (context, progressMap, _) {
@ -332,8 +339,8 @@ class ArticleComposeScreen extends HookConsumerWidget {
children: [
for (var idx = 0; idx < attachments.length; idx++)
SizedBox(
width: 120,
height: 120,
width: 280,
height: 280,
child: AttachmentPreview(
item: attachments[idx],
progress: progressMap[idx],
@ -358,7 +365,9 @@ class ArticleComposeScreen extends HookConsumerWidget {
delta,
);
},
onInsert: () => ComposeLogic.insertAttachment(
onInsert:
() => ComposeLogic.insertAttachment(
ref,
state,
idx,
),

View File

@ -106,7 +106,11 @@ class AttachmentPreview extends StatelessWidget {
style: TextStyle(color: Colors.white),
),
Gap(6),
Center(child: LinearProgressIndicator(value: progress)),
Center(
child: LinearProgressIndicator(
value: progress != null ? progress! / 100.0 : null,
),
),
],
),
),

View File

@ -474,13 +474,14 @@ class ComposeLogic {
state.attachments.value = clone;
}
static void insertAttachment(ComposeState state, int index) {
static void insertAttachment(WidgetRef ref, ComposeState state, int index) {
final attachment = state.attachments.value[index];
if (!attachment.isOnCloud) {
return;
}
final cloudFile = attachment.data as SnCloudFile;
final markdown = '![${cloudFile.name}](${cloudFile.id})';
final baseUrl = ref.read(serverUrlProvider);
final markdown = '![${cloudFile.name}]($baseUrl/files/${cloudFile.id})';
final controller = state.contentController;
final text = controller.text;
final selection = controller.selection;