mirror of
https://github.com/foss42/apidash.git
synced 2025-08-06 13:51:20 +08:00
Update providers
This commit is contained in:
@ -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(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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",
|
||||||
|
@ -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,
|
||||||
|
@ -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(
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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!,
|
||||||
|
@ -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(
|
||||||
|
@ -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",
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -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: [
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user