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