mirror of
https://github.com/foss42/apidash.git
synced 2025-05-28 20:27:04 +08:00
refactor providers
This commit is contained in:
@ -46,7 +46,7 @@ class RequestModel {
|
|||||||
id: id,
|
id: id,
|
||||||
method: method,
|
method: method,
|
||||||
url: url,
|
url: url,
|
||||||
name: name,
|
name: "$name (copy)",
|
||||||
description: description,
|
description: description,
|
||||||
requestHeaders: requestHeaders != null ? [...requestHeaders!] : null,
|
requestHeaders: requestHeaders != null ? [...requestHeaders!] : null,
|
||||||
requestParams: requestParams != null ? [...requestParams!] : null,
|
requestParams: requestParams != null ? [...requestParams!] : null,
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:apidash/providers/providers.dart';
|
import 'settings_providers.dart';
|
||||||
import 'package:apidash/models/models.dart';
|
import 'ui_providers.dart';
|
||||||
import 'package:apidash/services/services.dart'
|
import '../models/models.dart';
|
||||||
show hiveHandler, HiveHandler, request;
|
import '../services/services.dart' show hiveHandler, HiveHandler, request;
|
||||||
import 'package:apidash/utils/utils.dart' show uuid, collectionToHAR;
|
import '../utils/utils.dart' show uuid, collectionToHAR;
|
||||||
import 'package:apidash/consts.dart';
|
import '../consts.dart';
|
||||||
|
|
||||||
|
final activeIdStateProvider = StateProvider<String?>((ref) => null);
|
||||||
|
|
||||||
final activeRequestModelProvider = StateProvider<RequestModel?>((ref) {
|
final activeRequestModelProvider = StateProvider<RequestModel?>((ref) {
|
||||||
final activeId = ref.watch(activeIdStateProvider);
|
final activeId = ref.watch(activeIdStateProvider);
|
||||||
@ -12,81 +14,97 @@ final activeRequestModelProvider = StateProvider<RequestModel?>((ref) {
|
|||||||
if (activeId == null || collection == null) {
|
if (activeId == null || collection == null) {
|
||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
final idIdx = collection.indexWhere((m) => m.id == activeId);
|
return collection[activeId];
|
||||||
if (idIdx.isNegative) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
return collection[idIdx];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
final StateNotifierProvider<CollectionStateNotifier, List<RequestModel>?>
|
final requestSequenceProvider = StateProvider<List<String>>((ref) {
|
||||||
|
var ids = hiveHandler.getIds();
|
||||||
|
return ids ?? [];
|
||||||
|
});
|
||||||
|
|
||||||
|
final StateNotifierProvider<CollectionStateNotifier, Map<String, RequestModel>?>
|
||||||
collectionStateNotifierProvider =
|
collectionStateNotifierProvider =
|
||||||
StateNotifierProvider((ref) => CollectionStateNotifier(ref, hiveHandler));
|
StateNotifierProvider((ref) => CollectionStateNotifier(ref, hiveHandler));
|
||||||
|
|
||||||
class CollectionStateNotifier extends StateNotifier<List<RequestModel>?> {
|
class CollectionStateNotifier
|
||||||
|
extends StateNotifier<Map<String, RequestModel>?> {
|
||||||
CollectionStateNotifier(this.ref, this.hiveHandler) : super(null) {
|
CollectionStateNotifier(this.ref, this.hiveHandler) : super(null) {
|
||||||
loadData();
|
loadData();
|
||||||
Future.microtask(() =>
|
Future.microtask(() => ref.read(activeIdStateProvider.notifier).state =
|
||||||
ref.read(activeIdStateProvider.notifier).update((s) => state?[0].id));
|
ref.read(requestSequenceProvider)[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
final Ref ref;
|
final Ref ref;
|
||||||
final HiveHandler hiveHandler;
|
final HiveHandler hiveHandler;
|
||||||
final baseResponseModel = const ResponseModel();
|
final baseResponseModel = const ResponseModel();
|
||||||
|
|
||||||
List<String> getIds() => state!.map((e) => e.id).toList();
|
bool hasId(String id) => state?.keys.contains(id) ?? false;
|
||||||
int idxOfId(String id) => state!.indexWhere((element) => element.id == id);
|
|
||||||
|
|
||||||
RequestModel getRequestModel(String id) {
|
RequestModel? getRequestModel(String id) {
|
||||||
final idx = idxOfId(id);
|
return state?[id];
|
||||||
return state![idx];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void add() {
|
void add() {
|
||||||
|
final id = uuid.v1();
|
||||||
final newRequestModel = RequestModel(
|
final newRequestModel = RequestModel(
|
||||||
id: uuid.v1(),
|
id: id,
|
||||||
);
|
);
|
||||||
state = [newRequestModel, ...state!];
|
var map = {...state!};
|
||||||
|
map[id] = newRequestModel;
|
||||||
|
state = map;
|
||||||
ref
|
ref
|
||||||
.read(activeIdStateProvider.notifier)
|
.read(requestSequenceProvider.notifier)
|
||||||
.update((state) => newRequestModel.id);
|
.update((state) => [id, ...state]);
|
||||||
|
ref.read(activeIdStateProvider.notifier).state = newRequestModel.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void reorder(int oldIdx, int newIdx) {
|
void reorder(int oldIdx, int newIdx) {
|
||||||
final item = state!.removeAt(oldIdx);
|
var itemIds = ref.read(requestSequenceProvider);
|
||||||
state!.insert(newIdx, item);
|
final itemId = itemIds.removeAt(oldIdx);
|
||||||
|
itemIds.insert(newIdx, itemId);
|
||||||
|
ref.read(requestSequenceProvider.notifier).state = [...itemIds];
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove(String id) {
|
void remove(String id) {
|
||||||
int idx = idxOfId(id);
|
var itemIds = ref.read(requestSequenceProvider);
|
||||||
|
int idx = itemIds.indexOf(id);
|
||||||
|
itemIds.remove(id);
|
||||||
|
ref.read(requestSequenceProvider.notifier).state = [...itemIds];
|
||||||
|
|
||||||
String? newId;
|
String? newId;
|
||||||
if (idx == 0 && state!.length > 1) {
|
if (idx == 0 && itemIds.isNotEmpty) {
|
||||||
newId = state![1].id;
|
newId = itemIds[0];
|
||||||
} else if (state!.length > 2) {
|
} else if (itemIds.length > 1) {
|
||||||
newId = state![idx - 1].id;
|
newId = itemIds[idx - 1];
|
||||||
} else {
|
} else {
|
||||||
newId = null;
|
newId = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
state = [
|
ref.read(activeIdStateProvider.notifier).state = newId;
|
||||||
for (final model in state!)
|
|
||||||
if (model.id != id) model,
|
var map = {...state!};
|
||||||
];
|
map.remove(id);
|
||||||
ref.read(activeIdStateProvider.notifier).update((state) => newId);
|
state = map;
|
||||||
}
|
}
|
||||||
|
|
||||||
void duplicate(String id) {
|
void duplicate(String id) {
|
||||||
final idx = idxOfId(id);
|
final newId = uuid.v1();
|
||||||
final newModel = state![idx].duplicate(
|
|
||||||
id: uuid.v1(),
|
var itemIds = ref.read(requestSequenceProvider);
|
||||||
|
int idx = itemIds.indexOf(id);
|
||||||
|
|
||||||
|
final newModel = state![id]!.duplicate(
|
||||||
|
id: newId,
|
||||||
);
|
);
|
||||||
state = [
|
|
||||||
...state!.sublist(0, idx + 1),
|
itemIds.insert(idx + 1, newId);
|
||||||
newModel,
|
var map = {...state!};
|
||||||
...state!.sublist(idx + 1)
|
map[newId] = newModel;
|
||||||
];
|
state = map;
|
||||||
|
|
||||||
|
ref.read(requestSequenceProvider.notifier).state = [...itemIds];
|
||||||
|
ref.read(activeIdStateProvider.notifier).state = newId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void update(
|
void update(
|
||||||
@ -104,8 +122,7 @@ class CollectionStateNotifier extends StateNotifier<List<RequestModel>?> {
|
|||||||
String? message,
|
String? message,
|
||||||
ResponseModel? responseModel,
|
ResponseModel? responseModel,
|
||||||
}) {
|
}) {
|
||||||
final idx = idxOfId(id);
|
final newModel = state![id]!.copyWith(
|
||||||
final newModel = state![idx].copyWith(
|
|
||||||
method: method,
|
method: method,
|
||||||
url: url,
|
url: url,
|
||||||
name: name,
|
name: name,
|
||||||
@ -119,16 +136,18 @@ class CollectionStateNotifier extends StateNotifier<List<RequestModel>?> {
|
|||||||
message: message,
|
message: message,
|
||||||
responseModel: responseModel);
|
responseModel: responseModel);
|
||||||
//print(newModel);
|
//print(newModel);
|
||||||
state = [...state!.sublist(0, idx), newModel, ...state!.sublist(idx + 1)];
|
var map = {...state!};
|
||||||
|
map[id] = newModel;
|
||||||
|
state = map;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> sendRequest(String id) async {
|
Future<void> sendRequest(String id) async {
|
||||||
ref.read(sentRequestIdStateProvider.notifier).update((state) => id);
|
ref.read(sentRequestIdStateProvider.notifier).state = id;
|
||||||
ref.read(codePaneVisibleStateProvider.notifier).update((state) => false);
|
ref.read(codePaneVisibleStateProvider.notifier).state = false;
|
||||||
final defaultUriScheme =
|
final defaultUriScheme =
|
||||||
ref.read(settingsProvider.select((value) => value.defaultUriScheme));
|
ref.read(settingsProvider.select((value) => value.defaultUriScheme));
|
||||||
final idx = idxOfId(id);
|
|
||||||
RequestModel requestModel = getRequestModel(id);
|
RequestModel requestModel = state![id]!;
|
||||||
var responseRec =
|
var responseRec =
|
||||||
await request(requestModel, defaultUriScheme: defaultUriScheme);
|
await request(requestModel, defaultUriScheme: defaultUriScheme);
|
||||||
late final RequestModel newRequestModel;
|
late final RequestModel newRequestModel;
|
||||||
@ -150,38 +169,39 @@ class CollectionStateNotifier extends StateNotifier<List<RequestModel>?> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
//print(newRequestModel);
|
//print(newRequestModel);
|
||||||
ref.read(sentRequestIdStateProvider.notifier).update((state) => null);
|
ref.read(sentRequestIdStateProvider.notifier).state = null;
|
||||||
state = [
|
var map = {...state!};
|
||||||
...state!.sublist(0, idx),
|
map[id] = newRequestModel;
|
||||||
newRequestModel,
|
state = map;
|
||||||
...state!.sublist(idx + 1)
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> clearData() async {
|
Future<void> clearData() async {
|
||||||
ref.read(clearDataStateProvider.notifier).update((state) => true);
|
ref.read(clearDataStateProvider.notifier).state = true;
|
||||||
ref.read(activeIdStateProvider.notifier).update((state) => null);
|
ref.read(activeIdStateProvider.notifier).state = null;
|
||||||
await hiveHandler.clear();
|
await hiveHandler.clear();
|
||||||
ref.read(clearDataStateProvider.notifier).update((state) => false);
|
ref.read(clearDataStateProvider.notifier).state = false;
|
||||||
state = [];
|
ref.read(requestSequenceProvider.notifier).state = [];
|
||||||
|
state = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadData() {
|
void loadData() {
|
||||||
var ids = hiveHandler.getIds();
|
var ids = hiveHandler.getIds();
|
||||||
if (ids == null || ids.length == 0) {
|
if (ids == null || ids.length == 0) {
|
||||||
state = [
|
String newId = uuid.v1();
|
||||||
RequestModel(
|
state = {
|
||||||
id: uuid.v1(),
|
newId: RequestModel(
|
||||||
|
id: newId,
|
||||||
),
|
),
|
||||||
];
|
};
|
||||||
|
ref.read(requestSequenceProvider.notifier).state = [newId];
|
||||||
} else {
|
} else {
|
||||||
List<RequestModel> data = [];
|
Map<String, RequestModel> data = {};
|
||||||
for (var id in ids) {
|
for (var id in ids) {
|
||||||
var jsonModel = hiveHandler.getRequestModel(id);
|
var jsonModel = hiveHandler.getRequestModel(id);
|
||||||
if (jsonModel != null) {
|
if (jsonModel != null) {
|
||||||
var requestModel =
|
var requestModel =
|
||||||
RequestModel.fromJson(Map<String, dynamic>.from(jsonModel));
|
RequestModel.fromJson(Map<String, dynamic>.from(jsonModel));
|
||||||
data.add(requestModel);
|
data[id] = requestModel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
state = data;
|
state = data;
|
||||||
@ -189,23 +209,22 @@ class CollectionStateNotifier extends StateNotifier<List<RequestModel>?> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> saveData() async {
|
Future<void> saveData() async {
|
||||||
ref.read(saveDataStateProvider.notifier).update((state) => true);
|
ref.read(saveDataStateProvider.notifier).state = true;
|
||||||
final saveResponse =
|
final saveResponse = ref.read(settingsProvider).saveResponses;
|
||||||
ref.read(settingsProvider.select((value) => value.saveResponses));
|
final ids = ref.read(requestSequenceProvider);
|
||||||
final ids = getIds();
|
|
||||||
await hiveHandler.setIds(ids);
|
await hiveHandler.setIds(ids);
|
||||||
for (var e in state!) {
|
for (var id in ids) {
|
||||||
await hiveHandler.setRequestModel(
|
await hiveHandler.setRequestModel(
|
||||||
e.id,
|
id,
|
||||||
e.toJson(includeResponse: saveResponse),
|
state?[id]?.toJson(includeResponse: saveResponse),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
await hiveHandler.removeUnused();
|
await hiveHandler.removeUnused();
|
||||||
ref.read(saveDataStateProvider.notifier).update((state) => false);
|
ref.read(saveDataStateProvider.notifier).state = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Map<String, dynamic>> exportDataToHAR() async {
|
Future<Map<String, dynamic>> exportDataToHAR() async {
|
||||||
var result = await collectionToHAR(state);
|
var result = await collectionToHAR(state?.values.toList());
|
||||||
return result;
|
return result;
|
||||||
// return {
|
// return {
|
||||||
// "data": state!.map((e) => e.toJson(includeResponse: false)).toList()
|
// "data": state!.map((e) => e.toJson(includeResponse: false)).toList()
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
|
||||||
final navRailIndexStateProvider = StateProvider<int>((ref) => 0);
|
final navRailIndexStateProvider = StateProvider<int>((ref) => 0);
|
||||||
final activeIdStateProvider = StateProvider<String?>((ref) => null);
|
|
||||||
final activeIdEditStateProvider = StateProvider<String?>((ref) => null);
|
final activeIdEditStateProvider = 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);
|
||||||
|
Reference in New Issue
Block a user