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
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(),
);
}

View File

@ -6,43 +6,56 @@ import '../consts.dart';
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 sentRequestIdStateProvider = StateProvider<String?>((ref) => null);
final codePaneVisibleStateProvider = StateProvider<bool>((ref) => false);
final saveDataStateProvider = StateProvider<bool>((ref) => false);
final clearDataStateProvider = StateProvider<bool>((ref) => false);
final StateNotifierProvider<ThemeStateNotifier, bool?> themeStateProvider =
StateNotifierProvider((ref) => ThemeStateNotifier());
class ThemeStateNotifier extends StateNotifier<bool?> {
ThemeStateNotifier() : super(false) {
loadData();
final activeRequestModelProvider = StateProvider<RequestModel?>((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<void> toggle() async {
state = !state!;
await hiveHandler.setTheme(state);
}
void loadData() {
state = hiveHandler.getTheme() ?? false;
}
}
});
final StateNotifierProvider<CollectionStateNotifier, List<RequestModel>?>
collectionStateNotifierProvider =
StateNotifierProvider((ref) => CollectionStateNotifier());
StateNotifierProvider((ref) => CollectionStateNotifier(ref, hiveHandler));
class CollectionStateNotifier extends StateNotifier<List<RequestModel>?> {
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<String> 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<List<RequestModel>?> {
}
Future<void> 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<List<RequestModel>?> {
);
}
//print(newRequestModel);
ref.read(sentRequestIdStateProvider.notifier).update((state) => null);
state = [
...state!.sublist(0, idx),
newRequestModel,

View File

@ -22,10 +22,7 @@ class _CodePaneState extends ConsumerState<CodePane> {
@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<CodePane> {
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",

View File

@ -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<ContentType>(
focusColor: surfaceColor,
value: requestBodyContentType,

View File

@ -15,12 +15,12 @@ class ResponseDetails extends ConsumerStatefulWidget {
class _ResponseDetailsState extends ConsumerState<ResponseDetails> {
@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(

View File

@ -22,10 +22,10 @@ class _ResponsePaneState extends ConsumerState<ResponsePane> {
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();
}

View File

@ -22,22 +22,20 @@ class _ResponseBodyState extends ConsumerState<ResponseBody> {
@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<ResponseBody> {
}
return BodySuccess(
key: Key("$activeId-response"),
key: Key("${activeRequestModel!.id}-response"),
mediaType: mediaType,
options: options,
bytes: responseModel.bodyBytes!,

View File

@ -21,12 +21,12 @@ class _ResponseHeadersState extends ConsumerState<ResponseHeaders> {
@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(

View File

@ -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,
),
),
),

View File

@ -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<HTTPVerb>(
focusColor: surfaceColor,
value: method,
@ -178,24 +176,10 @@ class _SendRequestButtonState extends ConsumerState<SendRequestButton> {
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: [

View File

@ -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<void> 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<void> setTheme(bool? theme) => dataBox.put(kDataBoxTheme, theme);
dynamic getDarkMode() => settingsBox.get(kKeySettingsBoxDarkMode);
Future<void> setDarkMode(bool isDark) =>
settingsBox.put(kKeySettingsBoxDarkMode, isDark);
dynamic getIds() => dataBox.get(kDataBoxIds);
Future<void> setIds(List<String>? ids) => dataBox.put(kDataBoxIds, ids);
dynamic getIds() => dataBox.get(kKeyDataBoxIds);
Future<void> setIds(List<String>? ids) => dataBox.put(kKeyDataBoxIds, ids);
dynamic getRequestModel(String id) => dataBox.get(id);
Future<void> 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);
}
}