diff --git a/lib/consts.dart b/lib/consts.dart index d03980f9..92f05c2b 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -473,3 +473,9 @@ const kMsgNoContent = "No content"; const kMsgUnknowContentType = "Unknown Response Content-Type"; // Workspace Selector const kMsgSelectWorkspace = "Create your workspace"; +// History Page +const kTitleClearHistory = 'Clear History'; +const kMsgClearHistory = + 'Clearing History is permanent. Do you want to continue?'; +const kMsgClearHistorySuccess = 'History cleared successfully'; +const kMsgClearHistoryError = 'Error clearing history'; diff --git a/lib/screens/history/history_widgets/his_sidebar_header.dart b/lib/screens/history/history_widgets/his_sidebar_header.dart index 970c3249..24dd2153 100644 --- a/lib/screens/history/history_widgets/his_sidebar_header.dart +++ b/lib/screens/history/history_widgets/his_sidebar_header.dart @@ -11,6 +11,7 @@ class HistorySidebarHeader extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final mobileScaffoldKey = ref.read(mobileScaffoldKeyStateProvider); + final sm = ScaffoldMessenger.of(context); return Padding( padding: kPe4, child: Row( @@ -28,10 +29,29 @@ class HistorySidebarHeader extends ConsumerWidget { color: Theme.of(context).brightness == Brightness.dark ? kColorDarkDanger : kColorLightDanger, - onPressed: () async { - await ref - .read(historyMetaStateNotifier.notifier) - .clearAllHistory(); + onPressed: () { + showOkCancelDialog( + context, + dialogTitle: kTitleClearHistory, + content: kMsgClearHistory, + onClickOk: () async { + sm.hideCurrentSnackBar(); + try { + await ref + .read(historyMetaStateNotifier.notifier) + .clearAllHistory(); + sm.showSnackBar(getSnackBar( + kMsgClearHistorySuccess, + )); + } catch (e) { + debugPrint("Clear History Stack: $e"); + sm.showSnackBar(getSnackBar( + kMsgClearHistoryError, + color: kColorRed, + )); + } + }, + ); }, ), ADIconButton( diff --git a/lib/widgets/dialog_ok_cancel.dart b/lib/widgets/dialog_ok_cancel.dart new file mode 100644 index 00000000..45a918ed --- /dev/null +++ b/lib/widgets/dialog_ok_cancel.dart @@ -0,0 +1,47 @@ +import 'package:apidash/consts.dart'; +import 'package:apidash_design_system/apidash_design_system.dart'; +import 'package:flutter/material.dart'; + +showOkCancelDialog( + BuildContext context, { + String? dialogTitle, + String? content, + String? buttonLabelOk, + VoidCallback? onClickOk, + String? buttonLabelCancel, + VoidCallback? onClickCancel, +}) { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text(dialogTitle ?? ""), + titleTextStyle: Theme.of(context).textTheme.titleLarge, + content: Container( + padding: kPt20, + width: 300, + child: Text(content ?? ""), + ), + actions: [ + TextButton( + onPressed: () { + onClickCancel?.call(); + if (context.mounted) { + Navigator.pop(context); + } + }, + child: Text(buttonLabelCancel ?? kLabelCancel), + ), + TextButton( + onPressed: () { + onClickOk?.call(); + if (context.mounted) { + Navigator.pop(context); + } + }, + child: Text(buttonLabelOk ?? kLabelOk), + ), + ], + ); + }); +} diff --git a/lib/widgets/widgets.dart b/lib/widgets/widgets.dart index 59b61f54..f6427604 100644 --- a/lib/widgets/widgets.dart +++ b/lib/widgets/widgets.dart @@ -16,6 +16,7 @@ export 'codegen_previewer.dart'; export 'dialog_about.dart'; export 'dialog_history_retention.dart'; export 'dialog_import.dart'; +export 'dialog_ok_cancel.dart'; export 'dialog_rename.dart'; export 'dialog_text.dart'; export 'drag_and_drop_area.dart'; diff --git a/packages/apidash_design_system/lib/widgets/snackbar.dart b/packages/apidash_design_system/lib/widgets/snackbar.dart index d85d65d6..434d7473 100644 --- a/packages/apidash_design_system/lib/widgets/snackbar.dart +++ b/packages/apidash_design_system/lib/widgets/snackbar.dart @@ -3,9 +3,11 @@ import 'package:flutter/material.dart'; SnackBar getSnackBar( String text, { bool small = true, + Color? color, }) { return SnackBar( width: small ? 300 : 500, + backgroundColor: color, behavior: SnackBarBehavior.floating, content: Text( text,