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
|
||||
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(),
|
||||
);
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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",
|
||||
|
@ -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,
|
||||
|
@ -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(
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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!,
|
||||
|
@ -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(
|
||||
|
@ -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,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -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: [
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user