From 6db7f37211333952f383acefcaeec7d27378dae2 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Thu, 13 Apr 2023 10:53:48 +0530 Subject: [PATCH] Update providers --- lib/main.dart | 8 +-- lib/providers/providers.dart | 58 ++++++++++++------- .../details_card/code_pane/code_pane.dart | 7 +-- .../request_pane/request_body.dart | 6 +- .../response_pane/response_details.dart | 12 ++-- .../response_pane/response_pane.dart | 8 +-- .../response_tabs/response_body.dart | 14 ++--- .../response_tabs/response_headers.dart | 12 ++-- .../home_page/editor_pane/editor_pane.dart | 34 ++++------- .../home_page/editor_pane/url_card.dart | 26 ++------- lib/services/hive_services.dart | 23 ++++---- 11 files changed, 93 insertions(+), 115 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 9c7c3dad..39ce1993 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -45,7 +45,7 @@ class App extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final theme = ref.watch(themeStateProvider); + final isDarkMode = ref.watch(darkModeProvider); return MaterialApp( debugShowCheckedModeBanner: false, theme: ThemeData( @@ -60,11 +60,7 @@ class App extends ConsumerWidget { useMaterial3: true, brightness: Brightness.dark, ), - themeMode: theme != null - ? theme - ? ThemeMode.light - : ThemeMode.dark - : ThemeMode.system, + themeMode: isDarkMode ? ThemeMode.dark : ThemeMode.light, home: const HomePage(), ); } diff --git a/lib/providers/providers.dart b/lib/providers/providers.dart index 1f8bca6b..931f6dcb 100644 --- a/lib/providers/providers.dart +++ b/lib/providers/providers.dart @@ -6,43 +6,56 @@ import '../consts.dart'; const _uuid = Uuid(); +final hiveHandler = HiveHandler(); + +final StateNotifierProvider darkModeProvider = + StateNotifierProvider((ref) => ThemeStateNotifier(hiveHandler)); + +class ThemeStateNotifier extends StateNotifier { + ThemeStateNotifier(this.hiveHandler) : super(false) { + state = hiveHandler.getDarkMode() ?? false; + } + final HiveHandler hiveHandler; + + Future toggle() async { + state = !state; + await hiveHandler.setDarkMode(state); + } +} + final activeIdStateProvider = StateProvider((ref) => null); final sentRequestIdStateProvider = StateProvider((ref) => null); final codePaneVisibleStateProvider = StateProvider((ref) => false); final saveDataStateProvider = StateProvider((ref) => false); final clearDataStateProvider = StateProvider((ref) => false); -final StateNotifierProvider themeStateProvider = - StateNotifierProvider((ref) => ThemeStateNotifier()); - -class ThemeStateNotifier extends StateNotifier { - ThemeStateNotifier() : super(false) { - loadData(); +final activeRequestModelProvider = StateProvider((ref) { + final activeId = ref.watch(activeIdStateProvider); + final collection = ref.watch(collectionStateNotifierProvider); + if (activeId == null || collection == null) { + return null; + } else { + final idIdx = collection.indexWhere((m) => m.id == activeId); + if (idIdx.isNegative) { + return null; + } else { + return collection[idIdx]; + } } - - final hiveHandler = HiveHandler(); - - Future toggle() async { - state = !state!; - await hiveHandler.setTheme(state); - } - - void loadData() { - state = hiveHandler.getTheme() ?? false; - } -} +}); final StateNotifierProvider?> collectionStateNotifierProvider = - StateNotifierProvider((ref) => CollectionStateNotifier()); + StateNotifierProvider((ref) => CollectionStateNotifier(ref, hiveHandler)); class CollectionStateNotifier extends StateNotifier?> { - CollectionStateNotifier() : super(null) { + CollectionStateNotifier(this.ref, this.hiveHandler) : super(null) { loadData(); } + final Ref ref; + final HiveHandler hiveHandler; final baseResponseModel = const ResponseModel(); - final hiveHandler = HiveHandler(); List getIds() => state!.map((e) => e.id).toList(); int idxOfId(String id) => state!.indexWhere((element) => element.id == id); @@ -115,6 +128,8 @@ class CollectionStateNotifier extends StateNotifier?> { } Future sendRequest(String id) async { + ref.read(sentRequestIdStateProvider.notifier).update((state) => id); + ref.read(codePaneVisibleStateProvider.notifier).update((state) => false); final idx = idxOfId(id); RequestModel requestModel = getRequestModel(id); var responseRec = await request(requestModel); @@ -137,6 +152,7 @@ class CollectionStateNotifier extends StateNotifier?> { ); } //print(newRequestModel); + ref.read(sentRequestIdStateProvider.notifier).update((state) => null); state = [ ...state!.sublist(0, idx), newRequestModel, diff --git a/lib/screens/home_page/editor_pane/details_card/code_pane/code_pane.dart b/lib/screens/home_page/editor_pane/details_card/code_pane/code_pane.dart index 58c71de3..78de1e5a 100644 --- a/lib/screens/home_page/editor_pane/details_card/code_pane/code_pane.dart +++ b/lib/screens/home_page/editor_pane/details_card/code_pane/code_pane.dart @@ -22,10 +22,7 @@ class _CodePaneState extends ConsumerState { @override Widget build(BuildContext context) { - final activeId = ref.watch(activeIdStateProvider); - final collection = ref.watch(collectionStateNotifierProvider)!; - final idIdx = collection.indexWhere((m) => m.id == activeId); - final requestModel = collection[idIdx]; + final activeRequestModel = ref.watch(activeRequestModelProvider); var codeTheme = Theme.of(context).brightness == Brightness.light ? kLightCodeTheme : kDarkCodeTheme; @@ -41,7 +38,7 @@ class _CodePaneState extends ConsumerState { borderRadius: kBorderRadius8, ); - final code = dartHttpCodeGen.getCode(requestModel); + final code = dartHttpCodeGen.getCode(activeRequestModel!); if (code == null) { return const ErrorMessage( message: "An error was encountered while generating code. $kRaiseIssue", diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_body.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_body.dart index 1baf49b8..2f890774 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_body.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_body.dart @@ -71,10 +71,8 @@ class _DropdownButtonBodyContentTypeState Widget build(BuildContext context) { final surfaceColor = Theme.of(context).colorScheme.surface; final activeId = ref.watch(activeIdStateProvider); - final collection = ref.read(collectionStateNotifierProvider)!; - final idIdx = collection.indexWhere((m) => m.id == activeId); - final requestBodyContentType = ref.watch(collectionStateNotifierProvider - .select((value) => value![idIdx].requestBodyContentType)); + final requestBodyContentType = ref.watch(activeRequestModelProvider + .select((value) => value!.requestBodyContentType)); return DropdownButton( focusColor: surfaceColor, value: requestBodyContentType, diff --git a/lib/screens/home_page/editor_pane/details_card/response_pane/response_details.dart b/lib/screens/home_page/editor_pane/details_card/response_pane/response_details.dart index 574a3f09..0db26229 100644 --- a/lib/screens/home_page/editor_pane/details_card/response_pane/response_details.dart +++ b/lib/screens/home_page/editor_pane/details_card/response_pane/response_details.dart @@ -15,12 +15,12 @@ class ResponseDetails extends ConsumerStatefulWidget { class _ResponseDetailsState extends ConsumerState { @override Widget build(BuildContext context) { - final activeId = ref.watch(activeIdStateProvider); - final collection = ref.read(collectionStateNotifierProvider)!; - final idIdx = collection.indexWhere((m) => m.id == activeId); - final responseStatus = collection[idIdx].responseStatus; - final message = collection[idIdx].message; - final responseModel = collection[idIdx].responseModel; + final responseStatus = ref.watch( + activeRequestModelProvider.select((value) => value?.responseStatus)); + final message = + ref.watch(activeRequestModelProvider.select((value) => value?.message)); + final responseModel = ref.watch( + activeRequestModelProvider.select((value) => value?.responseModel)); return Column( children: [ Padding( diff --git a/lib/screens/home_page/editor_pane/details_card/response_pane/response_pane.dart b/lib/screens/home_page/editor_pane/details_card/response_pane/response_pane.dart index 030bd438..d01f3356 100644 --- a/lib/screens/home_page/editor_pane/details_card/response_pane/response_pane.dart +++ b/lib/screens/home_page/editor_pane/details_card/response_pane/response_pane.dart @@ -22,10 +22,10 @@ class _ResponsePaneState extends ConsumerState { Widget build(BuildContext context) { final activeId = ref.watch(activeIdStateProvider); final sentRequestId = ref.watch(sentRequestIdStateProvider); - final collection = ref.read(collectionStateNotifierProvider)!; - final idIdx = collection.indexWhere((m) => m.id == activeId); - final responseStatus = collection[idIdx].responseStatus; - final message = collection[idIdx].message; + final responseStatus = ref.watch( + activeRequestModelProvider.select((value) => value?.responseStatus)); + final message = + ref.watch(activeRequestModelProvider.select((value) => value?.message)); if (sentRequestId != null && sentRequestId == activeId) { return const SendingWidget(); } diff --git a/lib/screens/home_page/editor_pane/details_card/response_pane/response_tabs/response_body.dart b/lib/screens/home_page/editor_pane/details_card/response_pane/response_tabs/response_body.dart index 2d936365..29ce5e53 100644 --- a/lib/screens/home_page/editor_pane/details_card/response_pane/response_tabs/response_body.dart +++ b/lib/screens/home_page/editor_pane/details_card/response_pane/response_tabs/response_body.dart @@ -22,22 +22,20 @@ class _ResponseBodyState extends ConsumerState { @override Widget build(BuildContext context) { - final activeId = ref.watch(activeIdStateProvider); - final collection = ref.watch(collectionStateNotifierProvider)!; - final idIdx = collection.indexWhere((m) => m.id == activeId); - final responseModel = collection[idIdx].responseModel; - var mediaType = responseModel?.mediaType; - var body = responseModel?.body; - var formattedBody = responseModel?.formattedBody; + final activeRequestModel = ref.watch(activeRequestModelProvider); + final responseModel = activeRequestModel?.responseModel; if (responseModel == null) { return const ErrorMessage( message: 'Error: No Response Data Found. $kUnexpectedRaiseIssue'); } + var mediaType = responseModel.mediaType; if (mediaType == null) { return ErrorMessage( message: 'Unknown Response content type - ${responseModel.contentType}. $kUnexpectedRaiseIssue'); } + var body = responseModel.body; + var formattedBody = responseModel.formattedBody; if (body == null) { return const ErrorMessage( message: 'Response body is empty. $kUnexpectedRaiseIssue'); @@ -58,7 +56,7 @@ class _ResponseBodyState extends ConsumerState { } return BodySuccess( - key: Key("$activeId-response"), + key: Key("${activeRequestModel!.id}-response"), mediaType: mediaType, options: options, bytes: responseModel.bodyBytes!, diff --git a/lib/screens/home_page/editor_pane/details_card/response_pane/response_tabs/response_headers.dart b/lib/screens/home_page/editor_pane/details_card/response_pane/response_tabs/response_headers.dart index 61e6c360..0639db16 100644 --- a/lib/screens/home_page/editor_pane/details_card/response_pane/response_tabs/response_headers.dart +++ b/lib/screens/home_page/editor_pane/details_card/response_pane/response_tabs/response_headers.dart @@ -21,12 +21,12 @@ class _ResponseHeadersState extends ConsumerState { @override Widget build(BuildContext context) { - final activeId = ref.watch(activeIdStateProvider); - final collection = ref.watch(collectionStateNotifierProvider)!; - final idIdx = collection.indexWhere((m) => m.id == activeId); - final requestHeaders = - collection[idIdx].responseModel?.requestHeaders ?? {}; - final responseHeaders = collection[idIdx].responseModel?.headers ?? {}; + final requestHeaders = ref.watch(activeRequestModelProvider + .select((value) => value?.responseModel?.requestHeaders)) ?? + {}; + final responseHeaders = ref.watch(activeRequestModelProvider + .select((value) => value?.responseModel?.headers)) ?? + {}; return Padding( padding: kPh20v5, child: ListView( diff --git a/lib/screens/home_page/editor_pane/editor_pane.dart b/lib/screens/home_page/editor_pane/editor_pane.dart index d1a407b2..1156bf40 100644 --- a/lib/screens/home_page/editor_pane/editor_pane.dart +++ b/lib/screens/home_page/editor_pane/editor_pane.dart @@ -48,7 +48,7 @@ class RequestEditorPaneHome extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final theme = ref.watch(themeStateProvider); + final isDarkMode = ref.watch(darkModeProvider); return Padding( padding: const EdgeInsets.symmetric( vertical: 40, @@ -167,28 +167,16 @@ class RequestEditorPaneHome extends ConsumerWidget { ), WidgetSpan( alignment: PlaceholderAlignment.middle, - child: ElevatedButton( - onPressed: () async => await ref - .read(themeStateProvider.notifier) - .toggle(), - child: Row( - children: [ - theme != null - ? theme - ? const Icon(Icons.dark_mode) - : const Icon(Icons.light_mode) - : const Icon(Icons.light_mode), - kHSpacer10, - Text.rich( - TextSpan( - text: theme != null - ? theme - ? "Dark" - : "Light" - : "Light", - ), - ), - ], + child: ElevatedButton.icon( + onPressed: () async { + await ref.read(darkModeProvider.notifier).toggle(); + }, + icon: isDarkMode + ? const Icon(Icons.dark_mode) + : const Icon(Icons.light_mode), + label: Text( + isDarkMode ? "Dark" : "Light", + style: kTextStyleButton, ), ), ), diff --git a/lib/screens/home_page/editor_pane/url_card.dart b/lib/screens/home_page/editor_pane/url_card.dart index c9792a52..51158758 100644 --- a/lib/screens/home_page/editor_pane/url_card.dart +++ b/lib/screens/home_page/editor_pane/url_card.dart @@ -73,10 +73,8 @@ class _DropdownButtonHTTPMethodState Widget build(BuildContext context) { final surfaceColor = Theme.of(context).colorScheme.surface; final activeId = ref.watch(activeIdStateProvider); - final collection = ref.read(collectionStateNotifierProvider)!; - final idIdx = collection.indexWhere((m) => m.id == activeId); - final method = ref.watch(collectionStateNotifierProvider - .select((value) => value![idIdx].method)); + final method = + ref.watch(activeRequestModelProvider.select((value) => value?.method)); return DropdownButton( focusColor: surfaceColor, value: method, @@ -178,24 +176,10 @@ class _SendRequestButtonState extends ConsumerState { return FilledButton( onPressed: disable ? null - : () async { + : () { ref - .read(sentRequestIdStateProvider.notifier) - .update((state) => activeId); - ref - .read(codePaneVisibleStateProvider.notifier) - .update((state) => false); - await Future.delayed( - const Duration(seconds: 0), - () async { - await ref - .read(collectionStateNotifierProvider.notifier) - .sendRequest(activeId!); - }, - ); - ref - .read(sentRequestIdStateProvider.notifier) - .update((state) => null); + .read(collectionStateNotifierProvider.notifier) + .sendRequest(activeId!); }, child: Row( children: [ diff --git a/lib/services/hive_services.dart b/lib/services/hive_services.dart index 415a4b55..3eba043d 100644 --- a/lib/services/hive_services.dart +++ b/lib/services/hive_services.dart @@ -1,31 +1,32 @@ import 'package:hive_flutter/hive_flutter.dart'; -// constants const String kDataBox = "data"; +const String kKeyDataBoxIds = "ids"; -// sequence of ids -const String kDataBoxIds = "ids"; - -// dark theme boolean -const String kDataBoxTheme = "theme"; +const String kSettingsBox = "settings"; +const String kKeySettingsBoxDarkMode = "darkMode"; Future openBoxes() async { await Hive.initFlutter(); await Hive.openBox(kDataBox); + await Hive.openBox(kSettingsBox); } class HiveHandler { late final Box dataBox; + late final Box settingsBox; HiveHandler() { dataBox = Hive.box(kDataBox); + settingsBox = Hive.box(kSettingsBox); } - dynamic getTheme() => dataBox.get(kDataBoxTheme); - Future setTheme(bool? theme) => dataBox.put(kDataBoxTheme, theme); + dynamic getDarkMode() => settingsBox.get(kKeySettingsBoxDarkMode); + Future setDarkMode(bool isDark) => + settingsBox.put(kKeySettingsBoxDarkMode, isDark); - dynamic getIds() => dataBox.get(kDataBoxIds); - Future setIds(List? ids) => dataBox.put(kDataBoxIds, ids); + dynamic getIds() => dataBox.get(kKeyDataBoxIds); + Future setIds(List? ids) => dataBox.put(kKeyDataBoxIds, ids); dynamic getRequestModel(String id) => dataBox.get(id); Future setRequestModel( @@ -41,7 +42,7 @@ class HiveHandler { if (ids != null) { ids = ids as List; for (var key in dataBox.keys.toList()) { - if (key != kDataBoxIds && !ids.contains(key)) { + if (key != kKeyDataBoxIds && !ids.contains(key)) { await dataBox.delete(key); } }