Update providers

This commit is contained in:
Ankit Mahato
2023-04-13 10:53:48 +05:30
parent d4b707a212
commit 6db7f37211
11 changed files with 93 additions and 115 deletions

View File

@ -45,7 +45,7 @@ class App extends ConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final theme = ref.watch(themeStateProvider); final isDarkMode = ref.watch(darkModeProvider);
return MaterialApp( return MaterialApp(
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: ThemeData( theme: ThemeData(
@ -60,11 +60,7 @@ class App extends ConsumerWidget {
useMaterial3: true, useMaterial3: true,
brightness: Brightness.dark, brightness: Brightness.dark,
), ),
themeMode: theme != null themeMode: isDarkMode ? ThemeMode.dark : ThemeMode.light,
? theme
? ThemeMode.light
: ThemeMode.dark
: ThemeMode.system,
home: const HomePage(), home: const HomePage(),
); );
} }

View File

@ -6,43 +6,56 @@ import '../consts.dart';
const _uuid = Uuid(); const _uuid = Uuid();
final hiveHandler = HiveHandler();
final StateNotifierProvider<ThemeStateNotifier, bool> darkModeProvider =
StateNotifierProvider((ref) => ThemeStateNotifier(hiveHandler));
class ThemeStateNotifier extends StateNotifier<bool> {
ThemeStateNotifier(this.hiveHandler) : super(false) {
state = hiveHandler.getDarkMode() ?? false;
}
final HiveHandler hiveHandler;
Future<void> toggle() async {
state = !state;
await hiveHandler.setDarkMode(state);
}
}
final activeIdStateProvider = StateProvider<String?>((ref) => null); final activeIdStateProvider = StateProvider<String?>((ref) => null);
final sentRequestIdStateProvider = StateProvider<String?>((ref) => null); final sentRequestIdStateProvider = StateProvider<String?>((ref) => null);
final codePaneVisibleStateProvider = StateProvider<bool>((ref) => false); final codePaneVisibleStateProvider = StateProvider<bool>((ref) => false);
final saveDataStateProvider = StateProvider<bool>((ref) => false); final saveDataStateProvider = StateProvider<bool>((ref) => false);
final clearDataStateProvider = StateProvider<bool>((ref) => false); final clearDataStateProvider = StateProvider<bool>((ref) => false);
final StateNotifierProvider<ThemeStateNotifier, bool?> themeStateProvider = final activeRequestModelProvider = StateProvider<RequestModel?>((ref) {
StateNotifierProvider((ref) => ThemeStateNotifier()); final activeId = ref.watch(activeIdStateProvider);
final collection = ref.watch(collectionStateNotifierProvider);
class ThemeStateNotifier extends StateNotifier<bool?> { if (activeId == null || collection == null) {
ThemeStateNotifier() : super(false) { return null;
loadData(); } else {
final idIdx = collection.indexWhere((m) => m.id == activeId);
if (idIdx.isNegative) {
return null;
} else {
return collection[idIdx];
}
} }
});
final hiveHandler = HiveHandler();
Future<void> toggle() async {
state = !state!;
await hiveHandler.setTheme(state);
}
void loadData() {
state = hiveHandler.getTheme() ?? false;
}
}
final StateNotifierProvider<CollectionStateNotifier, List<RequestModel>?> final StateNotifierProvider<CollectionStateNotifier, List<RequestModel>?>
collectionStateNotifierProvider = collectionStateNotifierProvider =
StateNotifierProvider((ref) => CollectionStateNotifier()); StateNotifierProvider((ref) => CollectionStateNotifier(ref, hiveHandler));
class CollectionStateNotifier extends StateNotifier<List<RequestModel>?> { class CollectionStateNotifier extends StateNotifier<List<RequestModel>?> {
CollectionStateNotifier() : super(null) { CollectionStateNotifier(this.ref, this.hiveHandler) : super(null) {
loadData(); loadData();
} }
final Ref ref;
final HiveHandler hiveHandler;
final baseResponseModel = const ResponseModel(); final baseResponseModel = const ResponseModel();
final hiveHandler = HiveHandler();
List<String> getIds() => state!.map((e) => e.id).toList(); List<String> getIds() => state!.map((e) => e.id).toList();
int idxOfId(String id) => state!.indexWhere((element) => element.id == id); int idxOfId(String id) => state!.indexWhere((element) => element.id == id);
@ -115,6 +128,8 @@ class CollectionStateNotifier extends StateNotifier<List<RequestModel>?> {
} }
Future<void> sendRequest(String id) async { Future<void> sendRequest(String id) async {
ref.read(sentRequestIdStateProvider.notifier).update((state) => id);
ref.read(codePaneVisibleStateProvider.notifier).update((state) => false);
final idx = idxOfId(id); final idx = idxOfId(id);
RequestModel requestModel = getRequestModel(id); RequestModel requestModel = getRequestModel(id);
var responseRec = await request(requestModel); var responseRec = await request(requestModel);
@ -137,6 +152,7 @@ class CollectionStateNotifier extends StateNotifier<List<RequestModel>?> {
); );
} }
//print(newRequestModel); //print(newRequestModel);
ref.read(sentRequestIdStateProvider.notifier).update((state) => null);
state = [ state = [
...state!.sublist(0, idx), ...state!.sublist(0, idx),
newRequestModel, newRequestModel,

View File

@ -22,10 +22,7 @@ class _CodePaneState extends ConsumerState<CodePane> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final activeId = ref.watch(activeIdStateProvider); final activeRequestModel = ref.watch(activeRequestModelProvider);
final collection = ref.watch(collectionStateNotifierProvider)!;
final idIdx = collection.indexWhere((m) => m.id == activeId);
final requestModel = collection[idIdx];
var codeTheme = Theme.of(context).brightness == Brightness.light var codeTheme = Theme.of(context).brightness == Brightness.light
? kLightCodeTheme ? kLightCodeTheme
: kDarkCodeTheme; : kDarkCodeTheme;
@ -41,7 +38,7 @@ class _CodePaneState extends ConsumerState<CodePane> {
borderRadius: kBorderRadius8, borderRadius: kBorderRadius8,
); );
final code = dartHttpCodeGen.getCode(requestModel); final code = dartHttpCodeGen.getCode(activeRequestModel!);
if (code == null) { if (code == null) {
return const ErrorMessage( return const ErrorMessage(
message: "An error was encountered while generating code. $kRaiseIssue", message: "An error was encountered while generating code. $kRaiseIssue",

View File

@ -71,10 +71,8 @@ class _DropdownButtonBodyContentTypeState
Widget build(BuildContext context) { Widget build(BuildContext context) {
final surfaceColor = Theme.of(context).colorScheme.surface; final surfaceColor = Theme.of(context).colorScheme.surface;
final activeId = ref.watch(activeIdStateProvider); final activeId = ref.watch(activeIdStateProvider);
final collection = ref.read(collectionStateNotifierProvider)!; final requestBodyContentType = ref.watch(activeRequestModelProvider
final idIdx = collection.indexWhere((m) => m.id == activeId); .select((value) => value!.requestBodyContentType));
final requestBodyContentType = ref.watch(collectionStateNotifierProvider
.select((value) => value![idIdx].requestBodyContentType));
return DropdownButton<ContentType>( return DropdownButton<ContentType>(
focusColor: surfaceColor, focusColor: surfaceColor,
value: requestBodyContentType, value: requestBodyContentType,

View File

@ -15,12 +15,12 @@ class ResponseDetails extends ConsumerStatefulWidget {
class _ResponseDetailsState extends ConsumerState<ResponseDetails> { class _ResponseDetailsState extends ConsumerState<ResponseDetails> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final activeId = ref.watch(activeIdStateProvider); final responseStatus = ref.watch(
final collection = ref.read(collectionStateNotifierProvider)!; activeRequestModelProvider.select((value) => value?.responseStatus));
final idIdx = collection.indexWhere((m) => m.id == activeId); final message =
final responseStatus = collection[idIdx].responseStatus; ref.watch(activeRequestModelProvider.select((value) => value?.message));
final message = collection[idIdx].message; final responseModel = ref.watch(
final responseModel = collection[idIdx].responseModel; activeRequestModelProvider.select((value) => value?.responseModel));
return Column( return Column(
children: [ children: [
Padding( Padding(

View File

@ -22,10 +22,10 @@ class _ResponsePaneState extends ConsumerState<ResponsePane> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final activeId = ref.watch(activeIdStateProvider); final activeId = ref.watch(activeIdStateProvider);
final sentRequestId = ref.watch(sentRequestIdStateProvider); final sentRequestId = ref.watch(sentRequestIdStateProvider);
final collection = ref.read(collectionStateNotifierProvider)!; final responseStatus = ref.watch(
final idIdx = collection.indexWhere((m) => m.id == activeId); activeRequestModelProvider.select((value) => value?.responseStatus));
final responseStatus = collection[idIdx].responseStatus; final message =
final message = collection[idIdx].message; ref.watch(activeRequestModelProvider.select((value) => value?.message));
if (sentRequestId != null && sentRequestId == activeId) { if (sentRequestId != null && sentRequestId == activeId) {
return const SendingWidget(); return const SendingWidget();
} }

View File

@ -22,22 +22,20 @@ class _ResponseBodyState extends ConsumerState<ResponseBody> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final activeId = ref.watch(activeIdStateProvider); final activeRequestModel = ref.watch(activeRequestModelProvider);
final collection = ref.watch(collectionStateNotifierProvider)!; final responseModel = activeRequestModel?.responseModel;
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;
if (responseModel == null) { if (responseModel == null) {
return const ErrorMessage( return const ErrorMessage(
message: 'Error: No Response Data Found. $kUnexpectedRaiseIssue'); message: 'Error: No Response Data Found. $kUnexpectedRaiseIssue');
} }
var mediaType = responseModel.mediaType;
if (mediaType == null) { if (mediaType == null) {
return ErrorMessage( return ErrorMessage(
message: message:
'Unknown Response content type - ${responseModel.contentType}. $kUnexpectedRaiseIssue'); 'Unknown Response content type - ${responseModel.contentType}. $kUnexpectedRaiseIssue');
} }
var body = responseModel.body;
var formattedBody = responseModel.formattedBody;
if (body == null) { if (body == null) {
return const ErrorMessage( return const ErrorMessage(
message: 'Response body is empty. $kUnexpectedRaiseIssue'); message: 'Response body is empty. $kUnexpectedRaiseIssue');
@ -58,7 +56,7 @@ class _ResponseBodyState extends ConsumerState<ResponseBody> {
} }
return BodySuccess( return BodySuccess(
key: Key("$activeId-response"), key: Key("${activeRequestModel!.id}-response"),
mediaType: mediaType, mediaType: mediaType,
options: options, options: options,
bytes: responseModel.bodyBytes!, bytes: responseModel.bodyBytes!,

View File

@ -21,12 +21,12 @@ class _ResponseHeadersState extends ConsumerState<ResponseHeaders> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final activeId = ref.watch(activeIdStateProvider); final requestHeaders = ref.watch(activeRequestModelProvider
final collection = ref.watch(collectionStateNotifierProvider)!; .select((value) => value?.responseModel?.requestHeaders)) ??
final idIdx = collection.indexWhere((m) => m.id == activeId); {};
final requestHeaders = final responseHeaders = ref.watch(activeRequestModelProvider
collection[idIdx].responseModel?.requestHeaders ?? {}; .select((value) => value?.responseModel?.headers)) ??
final responseHeaders = collection[idIdx].responseModel?.headers ?? {}; {};
return Padding( return Padding(
padding: kPh20v5, padding: kPh20v5,
child: ListView( child: ListView(

View File

@ -48,7 +48,7 @@ class RequestEditorPaneHome extends ConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final theme = ref.watch(themeStateProvider); final isDarkMode = ref.watch(darkModeProvider);
return Padding( return Padding(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
vertical: 40, vertical: 40,
@ -167,28 +167,16 @@ class RequestEditorPaneHome extends ConsumerWidget {
), ),
WidgetSpan( WidgetSpan(
alignment: PlaceholderAlignment.middle, alignment: PlaceholderAlignment.middle,
child: ElevatedButton( child: ElevatedButton.icon(
onPressed: () async => await ref onPressed: () async {
.read(themeStateProvider.notifier) await ref.read(darkModeProvider.notifier).toggle();
.toggle(), },
child: Row( icon: isDarkMode
children: [ ? const Icon(Icons.dark_mode)
theme != null : const Icon(Icons.light_mode),
? theme label: Text(
? const Icon(Icons.dark_mode) isDarkMode ? "Dark" : "Light",
: const Icon(Icons.light_mode) style: kTextStyleButton,
: const Icon(Icons.light_mode),
kHSpacer10,
Text.rich(
TextSpan(
text: theme != null
? theme
? "Dark"
: "Light"
: "Light",
),
),
],
), ),
), ),
), ),

View File

@ -73,10 +73,8 @@ class _DropdownButtonHTTPMethodState
Widget build(BuildContext context) { Widget build(BuildContext context) {
final surfaceColor = Theme.of(context).colorScheme.surface; final surfaceColor = Theme.of(context).colorScheme.surface;
final activeId = ref.watch(activeIdStateProvider); final activeId = ref.watch(activeIdStateProvider);
final collection = ref.read(collectionStateNotifierProvider)!; final method =
final idIdx = collection.indexWhere((m) => m.id == activeId); ref.watch(activeRequestModelProvider.select((value) => value?.method));
final method = ref.watch(collectionStateNotifierProvider
.select((value) => value![idIdx].method));
return DropdownButton<HTTPVerb>( return DropdownButton<HTTPVerb>(
focusColor: surfaceColor, focusColor: surfaceColor,
value: method, value: method,
@ -178,24 +176,10 @@ class _SendRequestButtonState extends ConsumerState<SendRequestButton> {
return FilledButton( return FilledButton(
onPressed: disable onPressed: disable
? null ? null
: () async { : () {
ref ref
.read(sentRequestIdStateProvider.notifier) .read(collectionStateNotifierProvider.notifier)
.update((state) => activeId); .sendRequest(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);
}, },
child: Row( child: Row(
children: [ children: [

View File

@ -1,31 +1,32 @@
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
// constants
const String kDataBox = "data"; const String kDataBox = "data";
const String kKeyDataBoxIds = "ids";
// sequence of ids const String kSettingsBox = "settings";
const String kDataBoxIds = "ids"; const String kKeySettingsBoxDarkMode = "darkMode";
// dark theme boolean
const String kDataBoxTheme = "theme";
Future<void> openBoxes() async { Future<void> openBoxes() async {
await Hive.initFlutter(); await Hive.initFlutter();
await Hive.openBox(kDataBox); await Hive.openBox(kDataBox);
await Hive.openBox(kSettingsBox);
} }
class HiveHandler { class HiveHandler {
late final Box dataBox; late final Box dataBox;
late final Box settingsBox;
HiveHandler() { HiveHandler() {
dataBox = Hive.box(kDataBox); dataBox = Hive.box(kDataBox);
settingsBox = Hive.box(kSettingsBox);
} }
dynamic getTheme() => dataBox.get(kDataBoxTheme); dynamic getDarkMode() => settingsBox.get(kKeySettingsBoxDarkMode);
Future<void> setTheme(bool? theme) => dataBox.put(kDataBoxTheme, theme); Future<void> setDarkMode(bool isDark) =>
settingsBox.put(kKeySettingsBoxDarkMode, isDark);
dynamic getIds() => dataBox.get(kDataBoxIds); dynamic getIds() => dataBox.get(kKeyDataBoxIds);
Future<void> setIds(List<String>? ids) => dataBox.put(kDataBoxIds, ids); Future<void> setIds(List<String>? ids) => dataBox.put(kKeyDataBoxIds, ids);
dynamic getRequestModel(String id) => dataBox.get(id); dynamic getRequestModel(String id) => dataBox.get(id);
Future<void> setRequestModel( Future<void> setRequestModel(
@ -41,7 +42,7 @@ class HiveHandler {
if (ids != null) { if (ids != null) {
ids = ids as List; ids = ids as List;
for (var key in dataBox.keys.toList()) { for (var key in dataBox.keys.toList()) {
if (key != kDataBoxIds && !ids.contains(key)) { if (key != kKeyDataBoxIds && !ids.contains(key)) {
await dataBox.delete(key); await dataBox.delete(key);
} }
} }