From 782b3f1b087b885cb00e84714617090599969926 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sat, 6 Dec 2025 20:45:47 +0800 Subject: [PATCH] :bug: Fix article edit shows the post edit sheet --- lib/pods/article_list.dart | 1 - lib/screens/posts/post_search.dart | 11 +++ lib/widgets/post/compose_sheet.dart | 111 +++++++++++++++------------- 3 files changed, 69 insertions(+), 54 deletions(-) delete mode 100644 lib/pods/article_list.dart diff --git a/lib/pods/article_list.dart b/lib/pods/article_list.dart deleted file mode 100644 index 8b137891..00000000 --- a/lib/pods/article_list.dart +++ /dev/null @@ -1 +0,0 @@ - diff --git a/lib/screens/posts/post_search.dart b/lib/screens/posts/post_search.dart index af14dfe9..2322a577 100644 --- a/lib/screens/posts/post_search.dart +++ b/lib/screens/posts/post_search.dart @@ -6,6 +6,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/widgets/app_scaffold.dart'; import 'package:island/widgets/extended_refresh_indicator.dart'; import 'package:island/widgets/post/post_item.dart'; +import 'package:island/widgets/post/post_item_skeleton.dart'; import 'package:island/widgets/posts/post_filter.dart'; import 'package:gap/gap.dart'; import 'package:island/pods/post/post_list.dart'; @@ -140,6 +141,12 @@ class PostSearchScreen extends HookConsumerWidget { ).notifier, isSliver: true, isRefreshable: false, + footerSkeletonChild: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, + ), + child: const PostItemSkeleton(), + ), itemBuilder: (context, index, post) { return Card( margin: EdgeInsets.symmetric( @@ -261,6 +268,10 @@ class PostSearchScreen extends HookConsumerWidget { ).notifier, isSliver: true, isRefreshable: false, + footerSkeletonChild: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: const PostItemSkeleton(), + ), itemBuilder: (context, index, post) { return Center( child: ConstrainedBox( diff --git a/lib/widgets/post/compose_sheet.dart b/lib/widgets/post/compose_sheet.dart index 701edb2a..cfcbd2a5 100644 --- a/lib/widgets/post/compose_sheet.dart +++ b/lib/widgets/post/compose_sheet.dart @@ -1,6 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/file.dart'; import 'package:island/models/post.dart'; @@ -32,16 +33,21 @@ class PostComposeSheet extends HookConsumerWidget { SnPost? originalPost, PostComposeInitialState? initialState, }) { + // Check if editing an article + if (originalPost != null && originalPost.type == 1) { + context.pushNamed('articleEdit', pathParameters: {'id': originalPost.id}); + return Future.value(true); + } + return showModalBottomSheet( context: context, isScrollControlled: true, useRootNavigator: true, - builder: - (context) => PostComposeSheet( - originalPost: originalPost, - initialState: initialState, - isBottomSheet: true, - ), + builder: (context) => PostComposeSheet( + originalPost: originalPost, + initialState: initialState, + isBottomSheet: true, + ), ); } @@ -52,10 +58,9 @@ class PostComposeSheet extends HookConsumerWidget { final prompted = useState(false); // Fetch full post data if we're editing a post - final fullPostData = - originalPost != null - ? ref.watch(postProvider(originalPost!.id)) - : const AsyncValue.data(null); + final fullPostData = originalPost != null + ? ref.watch(postProvider(originalPost!.id)) + : const AsyncValue.data(null); // Use the full post data if available, otherwise fall back to originalPost final effectiveOriginalPost = fullPostData.when( @@ -115,7 +120,11 @@ class PostComposeSheet extends HookConsumerWidget { }, [drafts, prompted.value]); // Dispose state when widget is disposed - useEffect(() => () => ComposeLogic.dispose(state), []); + useEffect( + () => + () => ComposeLogic.dispose(state), + [], + ); // Helper methods for actions void showSettingsSheet() { @@ -145,22 +154,20 @@ class PostComposeSheet extends HookConsumerWidget { IconButton( onPressed: (state.submitting.value || state.currentPublisher.value == null) - ? null - : performSubmit, - icon: - state.submitting.value - ? SizedBox( - width: 24, - height: 24, - child: const CircularProgressIndicator(strokeWidth: 2), - ) - : Icon( - effectiveOriginalPost != null ? Symbols.edit : Symbols.upload, - ), - tooltip: - effectiveOriginalPost != null - ? 'postUpdate'.tr() - : 'postPublish'.tr(), + ? null + : performSubmit, + icon: state.submitting.value + ? SizedBox( + width: 24, + height: 24, + child: const CircularProgressIndicator(strokeWidth: 2), + ) + : Icon( + effectiveOriginalPost != null ? Symbols.edit : Symbols.upload, + ), + tooltip: effectiveOriginalPost != null + ? 'postUpdate'.tr() + : 'postPublish'.tr(), ), ]; @@ -192,29 +199,28 @@ class PostComposeSheet extends HookConsumerWidget { final restore = await showDialog( context: ref.context, useRootNavigator: true, - builder: - (context) => AlertDialog( - title: Text('restoreDraftTitle'.tr()), - content: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('restoreDraftMessage'.tr()), - const SizedBox(height: 16), - _buildCompactDraftPreview(context, latestDraft), - ], - ), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(false), - child: Text('no'.tr()), - ), - TextButton( - onPressed: () => Navigator.of(context).pop(true), - child: Text('yes'.tr()), - ), - ], + builder: (context) => AlertDialog( + title: Text('restoreDraftTitle'.tr()), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('restoreDraftMessage'.tr()), + const SizedBox(height: 16), + _buildCompactDraftPreview(context, latestDraft), + ], + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: Text('no'.tr()), ), + TextButton( + onPressed: () => Navigator.of(context).pop(true), + child: Text('yes'.tr()), + ), + ], + ), ); if (restore == true) { // Delete the old draft @@ -226,10 +232,9 @@ class PostComposeSheet extends HookConsumerWidget { description: latestDraft.description, content: latestDraft.content, visibility: latestDraft.visibility, - attachments: - latestDraft.attachments - .map((e) => UniversalFile.fromAttachment(e)) - .toList(), + attachments: latestDraft.attachments + .map((e) => UniversalFile.fromAttachment(e)) + .toList(), ); } }