diff --git a/lib/app.dart b/lib/app.dart index f60198af..70e95213 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -57,7 +57,7 @@ class _AppState extends ConsumerState with WindowListener { bool isPreventClose = await windowManager.isPreventClose(); if (isPreventClose) { if (ref.watch( - settingsProvider.select((value) => value.promptBeforeClosing))) { + settingsProvider.select((value) => value.promptBeforeClosing)) && ref.watch(hasUnsavedChangesProvider)) { showDialog( context: context, builder: (_) => AlertDialog( diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index 8f00b039..ec4d36f9 100644 --- a/lib/providers/collection_providers.dart +++ b/lib/providers/collection_providers.dart @@ -1,11 +1,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'settings_providers.dart'; -import 'ui_providers.dart'; +import 'package:http/http.dart' as http; + +import '../consts.dart'; import '../models/models.dart'; import '../services/services.dart' show hiveHandler, HiveHandler, request; import '../utils/utils.dart' show getNewUuid, collectionToHAR; -import '../consts.dart'; -import 'package:http/http.dart' as http; +import 'settings_providers.dart'; +import 'ui_providers.dart'; final selectedIdStateProvider = StateProvider((ref) => null); @@ -65,6 +66,7 @@ class CollectionStateNotifier .read(requestSequenceProvider.notifier) .update((state) => [id, ...state]); ref.read(selectedIdStateProvider.notifier).state = newRequestModel.id; + ref.read(hasUnsavedChangesProvider.notifier).state = true; } void reorder(int oldIdx, int newIdx) { @@ -72,6 +74,7 @@ class CollectionStateNotifier final itemId = itemIds.removeAt(oldIdx); itemIds.insert(newIdx, itemId); ref.read(requestSequenceProvider.notifier).state = [...itemIds]; + ref.read(hasUnsavedChangesProvider.notifier).state = true; } void remove(String id) { @@ -94,6 +97,7 @@ class CollectionStateNotifier var map = {...state!}; map.remove(id); state = map; + ref.read(hasUnsavedChangesProvider.notifier).state = true; } void clearResponse(String? id) { @@ -107,6 +111,7 @@ class CollectionStateNotifier var map = {...state!}; map[id] = newModel; state = map; + ref.read(hasUnsavedChangesProvider.notifier).state = true; } void duplicate(String id) { @@ -126,6 +131,7 @@ class CollectionStateNotifier ref.read(requestSequenceProvider.notifier).state = [...itemIds]; ref.read(selectedIdStateProvider.notifier).state = newId; + ref.read(hasUnsavedChangesProvider.notifier).state = true; } void update( @@ -167,6 +173,7 @@ class CollectionStateNotifier var map = {...state!}; map[id] = newModel; state = map; + ref.read(hasUnsavedChangesProvider.notifier).state = true; } Future sendRequest(String id) async { @@ -216,6 +223,7 @@ class CollectionStateNotifier map = {...state!}; map[id] = newRequestModel; state = map; + ref.read(hasUnsavedChangesProvider.notifier).state = true; } Future clearData() async { @@ -225,6 +233,7 @@ class CollectionStateNotifier ref.read(clearDataStateProvider.notifier).state = false; ref.read(requestSequenceProvider.notifier).state = []; state = {}; + ref.read(hasUnsavedChangesProvider.notifier).state = true; } bool loadData() { @@ -265,6 +274,7 @@ class CollectionStateNotifier } await hiveHandler.removeUnused(); ref.read(saveDataStateProvider.notifier).state = false; + ref.read(hasUnsavedChangesProvider.notifier).state = false; } Future> exportDataToHAR() async { diff --git a/lib/providers/ui_providers.dart b/lib/providers/ui_providers.dart index 62f83f70..e4b10677 100644 --- a/lib/providers/ui_providers.dart +++ b/lib/providers/ui_providers.dart @@ -6,6 +6,8 @@ final selectedIdEditStateProvider = StateProvider((ref) => null); final codePaneVisibleStateProvider = StateProvider((ref) => false); final saveDataStateProvider = StateProvider((ref) => false); final clearDataStateProvider = StateProvider((ref) => false); +final hasUnsavedChangesProvider = StateProvider((ref) => false); + // final nameTextFieldControllerProvider = // StateProvider.autoDispose((ref) { // TextEditingController controller = TextEditingController(text: ""); diff --git a/lib/screens/home_page/collection_pane.dart b/lib/screens/home_page/collection_pane.dart index 0ede2021..934c5b66 100644 --- a/lib/screens/home_page/collection_pane.dart +++ b/lib/screens/home_page/collection_pane.dart @@ -15,6 +15,7 @@ class CollectionPane extends ConsumerWidget { final overlayWidget = OverlayWidgetTemplate(context: context); final collection = ref.watch(collectionStateNotifierProvider); final savingData = ref.watch(saveDataStateProvider); + final hasUnsavedChanges = ref.watch(hasUnsavedChangesProvider); if (collection == null) { return const Center( child: CircularProgressIndicator(), @@ -31,7 +32,7 @@ class CollectionPane extends ConsumerWidget { alignment: WrapAlignment.spaceBetween, children: [ TextButton.icon( - onPressed: savingData + onPressed: (savingData || !hasUnsavedChanges) ? null : () async { overlayWidget.show(