From 5deb910fa447a6592da2b6f009f78f74dda95d4e Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sat, 22 Nov 2025 18:42:12 +0800 Subject: [PATCH] :recycle: Refactored all ScaffoldMessager to use unifined snackbar API --- assets/i18n/en-US.json | 5 ++-- lib/screens/about.dart | 4 +--- lib/screens/creators/poll/poll_list.dart | 15 +++--------- lib/screens/creators/sites/site_list.dart | 17 +++---------- lib/widgets/alert.dart | 5 +--- lib/widgets/content/markdown.dart | 1 - lib/widgets/post/compose_embed_sheet.dart | 5 ++-- lib/widgets/post/compose_shared.dart | 7 +----- lib/widgets/sites/file_item.dart | 27 +++++---------------- lib/widgets/sites/file_upload_dialog.dart | 5 ++-- lib/widgets/sites/page_form.dart | 29 +++++++---------------- lib/widgets/sites/site_action_menu.dart | 12 +++------- lib/widgets/wallet/fund_envelope.dart | 15 +++--------- 13 files changed, 36 insertions(+), 111 deletions(-) diff --git a/assets/i18n/en-US.json b/assets/i18n/en-US.json index 1a4ba149..19be30e8 100644 --- a/assets/i18n/en-US.json +++ b/assets/i18n/en-US.json @@ -1340,5 +1340,6 @@ "orCreateWith": "Or\ncreate with", "unindexedFiles": "Unindexed files", "folder": "Folder", - "clearCompleted": "Clear Completed" -} + "clearCompleted": "Clear Completed", + "contentCantEmpty": "Content cannot be empty" +} \ No newline at end of file diff --git a/lib/screens/about.dart b/lib/screens/about.dart index 182602a6..2c1c02ea 100644 --- a/lib/screens/about.dart +++ b/lib/screens/about.dart @@ -384,9 +384,7 @@ class _AboutScreenState extends ConsumerState { icon: const Icon(Symbols.content_copy, size: 16), onPressed: () { Clipboard.setData(ClipboardData(text: value)); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('copiedToClipboard'.tr())), - ); + showSnackBar('copiedToClipboard'.tr()); }, padding: EdgeInsets.zero, constraints: const BoxConstraints(), diff --git a/lib/screens/creators/poll/poll_list.dart b/lib/screens/creators/poll/poll_list.dart index e30576e6..16202e4c 100644 --- a/lib/screens/creators/poll/poll_list.dart +++ b/lib/screens/creators/poll/poll_list.dart @@ -5,6 +5,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/poll.dart'; import 'package:island/pods/network.dart'; import 'package:island/screens/poll/poll_editor.dart'; +import 'package:island/widgets/alert.dart'; import 'package:island/widgets/app_scaffold.dart'; import 'package:island/widgets/poll/poll_feedback.dart'; import 'package:material_symbols_icons/symbols.dart'; @@ -234,19 +235,9 @@ class _CreatorPollItem extends HookConsumerWidget { '/sphere/polls/${pollWithStats.id}', ); ref.invalidate(pollListNotifierProvider(pubName)); - if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('Poll deleted successfully'), - ), - ); - } + showSnackBar('Poll deleted successfully'); } catch (e) { - if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Failed to delete poll')), - ); - } + showErrorAlert(e); } } }, diff --git a/lib/screens/creators/sites/site_list.dart b/lib/screens/creators/sites/site_list.dart index b1331edd..f55e27df 100644 --- a/lib/screens/creators/sites/site_list.dart +++ b/lib/screens/creators/sites/site_list.dart @@ -7,6 +7,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/publication_site.dart'; import 'package:island/pods/network.dart'; import 'package:island/screens/creators/sites/site_edit.dart'; +import 'package:island/widgets/alert.dart'; import 'package:island/widgets/app_scaffold.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -224,21 +225,9 @@ class _CreatorSiteItem extends HookConsumerWidget { final client = ref.read(apiClientProvider); await client.delete('/zone/sites/${site.id}'); ref.invalidate(siteListNotifierProvider(pubName)); - if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('Site deleted successfully'), - ), - ); - } + showSnackBar('Site deleted successfully'); } catch (e) { - if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('Failed to delete site'), - ), - ); - } + showErrorAlert(e); } } }, diff --git a/lib/widgets/alert.dart b/lib/widgets/alert.dart index 48001f32..757a53fe 100644 --- a/lib/widgets/alert.dart +++ b/lib/widgets/alert.dart @@ -29,14 +29,11 @@ void showSnackBar(String message, {SnackBarAction? action}) { ), ), ), + curve: Curves.easeInOut, snackBarPosition: SnackBarPosition.bottom, ); } -void clearSnackBar(BuildContext context) { - ScaffoldMessenger.of(context).clearSnackBars(); -} - OverlayEntry? _loadingOverlay; GlobalKey<_FadeOverlayState> _loadingOverlayKey = GlobalKey(); diff --git a/lib/widgets/content/markdown.dart b/lib/widgets/content/markdown.dart index 217fb1eb..0c62c006 100644 --- a/lib/widgets/content/markdown.dart +++ b/lib/widgets/content/markdown.dart @@ -166,7 +166,6 @@ class MarkdownTextContent extends HookConsumerWidget { label: 'copyToClipboard'.tr(), onPressed: () { Clipboard.setData(ClipboardData(text: href)); - clearSnackBar(context); }, ), ); diff --git a/lib/widgets/post/compose_embed_sheet.dart b/lib/widgets/post/compose_embed_sheet.dart index 480644e9..a9da1c23 100644 --- a/lib/widgets/post/compose_embed_sheet.dart +++ b/lib/widgets/post/compose_embed_sheet.dart @@ -6,6 +6,7 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/post.dart'; +import 'package:island/widgets/alert.dart'; import 'package:island/widgets/content/sheet.dart'; import 'package:island/widgets/post/compose_shared.dart'; import 'package:material_symbols_icons/symbols.dart'; @@ -56,9 +57,7 @@ class ComposeEmbedSheet extends HookConsumerWidget { void saveEmbedView() { final uri = uriController.text.trim(); if (uri.isEmpty) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('embedUriRequired'.tr()))); + showSnackBar('embedUriRequired'.tr()); return; } diff --git a/lib/widgets/post/compose_shared.dart b/lib/widgets/post/compose_shared.dart index e4e180a4..44b51305 100644 --- a/lib/widgets/post/compose_shared.dart +++ b/lib/widgets/post/compose_shared.dart @@ -751,12 +751,7 @@ class ComposeLogic { return post; } catch (err) { - // Show error message if context is mounted - if (context.mounted) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('Error: $err'))); - } + showErrorAlert(err); rethrow; } finally { state.submitting.value = false; diff --git a/lib/widgets/sites/file_item.dart b/lib/widgets/sites/file_item.dart index 2705adce..39a9b0c6 100644 --- a/lib/widgets/sites/file_item.dart +++ b/lib/widgets/sites/file_item.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_code_editor/flutter_code_editor.dart'; import 'package:flutter_highlight/themes/monokai-sublime.dart'; @@ -59,17 +60,9 @@ class FileItem extends HookConsumerWidget { filePath, ); - if (context.mounted) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('Downloaded to $filePath'))); - } + showSnackBar('Downloaded to $filePath'); } catch (e) { - if (context.mounted) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('Failed to download file: $e'))); - } + showErrorAlert(e); } } @@ -248,9 +241,7 @@ class FileEditorSheet extends HookConsumerWidget { final saveFile = useCallback(() async { if (codeController.text.trim().isEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Content cannot be empty')), - ); + showSnackBar('contentCantEmpty'.tr()); return; } @@ -263,17 +254,11 @@ class FileEditorSheet extends HookConsumerWidget { .updateFileContent(file.relativePath, codeController.text); if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('File saved successfully')), - ); + showSnackBar('File saved successfully'); Navigator.of(context).pop(); } } catch (e) { - if (context.mounted) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('Failed to save file: $e'))); - } + showErrorAlert(e); } finally { isSaving.value = false; } diff --git a/lib/widgets/sites/file_upload_dialog.dart b/lib/widgets/sites/file_upload_dialog.dart index 72810fd3..6e31d134 100644 --- a/lib/widgets/sites/file_upload_dialog.dart +++ b/lib/widgets/sites/file_upload_dialog.dart @@ -5,6 +5,7 @@ import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/publication_site.dart'; import 'package:island/pods/site_files.dart'; +import 'package:island/widgets/alert.dart'; import 'package:island/widgets/content/sheet.dart'; import 'package:material_symbols_icons/symbols.dart'; @@ -121,9 +122,7 @@ class FileUploadDialog extends HookConsumerWidget { (state) => state['status'] == 'completed', )) { if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('All files uploaded successfully')), - ); + showSnackBar('All files uploaded successfully'); onUploadComplete(); Navigator.of(context).pop(); } diff --git a/lib/widgets/sites/page_form.dart b/lib/widgets/sites/page_form.dart index aabff7b1..0e1fd8a0 100644 --- a/lib/widgets/sites/page_form.dart +++ b/lib/widgets/sites/page_form.dart @@ -4,6 +4,7 @@ import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/publication_site.dart'; import 'package:island/pods/site_pages.dart'; +import 'package:island/widgets/alert.dart'; import 'package:island/widgets/content/sheet.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:styled_widget/styled_widget.dart'; @@ -127,23 +128,15 @@ class PageForm extends HookConsumerWidget { } if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - page == null - ? 'Page created successfully' - : 'Page updated successfully', - ), - ), + showSnackBar( + page == null + ? 'Page created successfully' + : 'Page updated successfully', ); Navigator.pop(context); } } catch (e) { - if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Failed to save page: ${e.toString()}')), - ); - } + showErrorAlert(e); } finally { isLoading.value = false; } @@ -185,17 +178,11 @@ class PageForm extends HookConsumerWidget { await pagesNotifier.deletePage(page!.id); if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Page deleted successfully')), - ); + showSnackBar('Page deleted successfully'); Navigator.pop(context); } } catch (e) { - if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Failed to delete page')), - ); - } + showErrorAlert(e); } finally { isLoading.value = false; } diff --git a/lib/widgets/sites/site_action_menu.dart b/lib/widgets/sites/site_action_menu.dart index 9fea1e5f..ce44c04e 100644 --- a/lib/widgets/sites/site_action_menu.dart +++ b/lib/widgets/sites/site_action_menu.dart @@ -6,6 +6,7 @@ import 'package:island/models/publication_site.dart'; import 'package:island/pods/network.dart'; import 'package:island/screens/creators/sites/site_detail.dart'; import 'package:island/screens/creators/sites/site_edit.dart'; +import 'package:island/widgets/alert.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:styled_widget/styled_widget.dart'; @@ -85,18 +86,11 @@ class SiteActionMenu extends HookConsumerWidget { final client = ref.read(apiClientProvider); await client.delete('/zone/sites/${site.id}'); if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Site deleted successfully')), - ); - // Navigate back to list + showSnackBar('Site deleted successfully'); Navigator.of(context).pop(); } } catch (e) { - if (context.mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Failed to delete site')), - ); - } + showErrorAlert(e); } } break; diff --git a/lib/widgets/wallet/fund_envelope.dart b/lib/widgets/wallet/fund_envelope.dart index 31b73092..93f67a22 100644 --- a/lib/widgets/wallet/fund_envelope.dart +++ b/lib/widgets/wallet/fund_envelope.dart @@ -3,6 +3,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/wallet.dart'; import 'package:island/pods/network.dart'; import 'package:island/pods/userinfo.dart'; +import 'package:island/widgets/alert.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -244,20 +245,10 @@ class FundEnvelopeWidget extends HookConsumerWidget { if (dialogContext.mounted) { Navigator.of(dialogContext).pop(); - ScaffoldMessenger.of(dialogContext).showSnackBar( - SnackBar(content: Text('Fund claimed successfully!'.tr())), - ); + showSnackBar('Fund claimed successfully!'); } } catch (e) { - if (dialogContext.mounted) { - ScaffoldMessenger.of(dialogContext).showSnackBar( - SnackBar( - content: Text('Failed to claim fund: $e'), - backgroundColor: - Theme.of(dialogContext).colorScheme.error, - ), - ); - } + showErrorAlert(e); } }, ),