mirror of
https://github.com/foss42/apidash.git
synced 2025-08-06 13:51:20 +08:00
Refactor
This commit is contained in:
@ -1,4 +1,3 @@
|
|||||||
import 'package:collection/collection.dart';
|
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'settings_providers.dart';
|
import 'settings_providers.dart';
|
||||||
import 'ui_providers.dart';
|
import 'ui_providers.dart';
|
||||||
@ -9,7 +8,6 @@ import '../consts.dart';
|
|||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
final selectedIdStateProvider = StateProvider<String?>((ref) => null);
|
final selectedIdStateProvider = StateProvider<String?>((ref) => null);
|
||||||
final searchQueryProvider = StateProvider<String>((ref) => '');
|
|
||||||
|
|
||||||
final selectedRequestModelProvider = StateProvider<RequestModel?>((ref) {
|
final selectedRequestModelProvider = StateProvider<RequestModel?>((ref) {
|
||||||
final selectedId = ref.watch(selectedIdStateProvider);
|
final selectedId = ref.watch(selectedIdStateProvider);
|
||||||
@ -33,7 +31,7 @@ final StateNotifierProvider<CollectionStateNotifier, Map<String, RequestModel>?>
|
|||||||
class CollectionStateNotifier
|
class CollectionStateNotifier
|
||||||
extends StateNotifier<Map<String, RequestModel>?> {
|
extends StateNotifier<Map<String, RequestModel>?> {
|
||||||
CollectionStateNotifier(this.ref, this.hiveHandler) : super(null) {
|
CollectionStateNotifier(this.ref, this.hiveHandler) : super(null) {
|
||||||
var status = filterRequests(ref.read(searchQueryProvider.notifier).state);
|
var status = loadData();
|
||||||
Future.microtask(() {
|
Future.microtask(() {
|
||||||
if (status) {
|
if (status) {
|
||||||
ref.read(requestSequenceProvider.notifier).state = [
|
ref.read(requestSequenceProvider.notifier).state = [
|
||||||
@ -250,37 +248,6 @@ class CollectionStateNotifier
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool filterRequests(String query) {
|
|
||||||
if (query.isEmpty) {
|
|
||||||
|
|
||||||
loadData();
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
// Filter requests based on the query
|
|
||||||
final filteredRequests = state?.values.where((request) =>
|
|
||||||
request.name.toLowerCase().contains(query.toLowerCase())).toList();
|
|
||||||
|
|
||||||
|
|
||||||
if (filteredRequests != null && filteredRequests.isNotEmpty) {
|
|
||||||
|
|
||||||
Map<String, RequestModel> requestMap = {};
|
|
||||||
|
|
||||||
for (var request in filteredRequests) {
|
|
||||||
requestMap[request.id] = request;
|
|
||||||
}
|
|
||||||
|
|
||||||
state = requestMap;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
print("No matching requests found");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> saveData() async {
|
Future<void> saveData() async {
|
||||||
ref.read(saveDataStateProvider.notifier).state = true;
|
ref.read(saveDataStateProvider.notifier).state = true;
|
||||||
final saveResponse = ref.read(settingsProvider).saveResponses;
|
final saveResponse = ref.read(settingsProvider).saveResponses;
|
||||||
|
@ -23,3 +23,5 @@ final nameTextFieldFocusNodeProvider =
|
|||||||
});
|
});
|
||||||
return focusNode;
|
return focusNode;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
final searchQueryProvider = StateProvider<String>((ref) => '');
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:apidash/providers/providers.dart';
|
import 'package:apidash/providers/providers.dart';
|
||||||
@ -67,33 +66,44 @@ class CollectionPane extends ConsumerWidget {
|
|||||||
style: kTextStyleButton,
|
style: kTextStyleButton,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
kVSpacer10,
|
kVSpacer10,
|
||||||
SizedBox(
|
Container(
|
||||||
height:30,
|
height: 30,
|
||||||
child:SearchBar(
|
margin: const EdgeInsets.only(right: 8),
|
||||||
|
decoration: BoxDecoration(
|
||||||
onChanged: (value){
|
borderRadius: kBorderRadius8,
|
||||||
if(value.isNotEmpty){
|
border: Border.all(
|
||||||
ref.read(searchQueryProvider.notifier).state = value;
|
color: Theme.of(context).colorScheme.surfaceVariant,
|
||||||
ref.read(collectionStateNotifierProvider.notifier)
|
),
|
||||||
.filterRequests(value);
|
),
|
||||||
}
|
child: Row(
|
||||||
else{
|
children: [
|
||||||
|
kHSpacer5,
|
||||||
}
|
Icon(
|
||||||
|
Icons.filter_alt,
|
||||||
},
|
size: 18,
|
||||||
hintText: "search",
|
color: Theme.of(context).colorScheme.secondary,
|
||||||
leading: Icon(Icons.search),
|
),
|
||||||
textStyle: MaterialStateTextStyle.resolveWith((states) => TextStyle(fontSize: 15.0)),
|
kHSpacer5,
|
||||||
elevation: MaterialStateProperty.all(2.0),
|
Expanded(
|
||||||
)),
|
child: RawTextField(
|
||||||
|
style: Theme.of(context).textTheme.bodyMedium,
|
||||||
|
hintText: "Filter by name or URL",
|
||||||
|
onChanged: (value) {
|
||||||
|
if (value.trim().isNotEmpty) {
|
||||||
|
ref.read(searchQueryProvider.notifier).state = value;
|
||||||
|
print(value);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
kVSpacer10,
|
kVSpacer10,
|
||||||
|
|
||||||
const Expanded(
|
const Expanded(
|
||||||
child: RequestList(),
|
child: RequestList(),
|
||||||
),
|
),
|
||||||
@ -134,7 +144,7 @@ class _RequestListState extends ConsumerState<RequestList> {
|
|||||||
final alwaysShowCollectionPaneScrollbar = ref.watch(settingsProvider
|
final alwaysShowCollectionPaneScrollbar = ref.watch(settingsProvider
|
||||||
.select((value) => value.alwaysShowCollectionPaneScrollbar));
|
.select((value) => value.alwaysShowCollectionPaneScrollbar));
|
||||||
|
|
||||||
return requestItems.isNotEmpty?Scrollbar(
|
return Scrollbar(
|
||||||
controller: controller,
|
controller: controller,
|
||||||
thumbVisibility: alwaysShowCollectionPaneScrollbar ? true : null,
|
thumbVisibility: alwaysShowCollectionPaneScrollbar ? true : null,
|
||||||
radius: const Radius.circular(12),
|
radius: const Radius.circular(12),
|
||||||
@ -155,7 +165,6 @@ class _RequestListState extends ConsumerState<RequestList> {
|
|||||||
},
|
},
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
var id = requestSequence[index];
|
var id = requestSequence[index];
|
||||||
print(requestItems[id]!);
|
|
||||||
|
|
||||||
return ReorderableDragStartListener(
|
return ReorderableDragStartListener(
|
||||||
key: ValueKey(id),
|
key: ValueKey(id),
|
||||||
@ -170,7 +179,7 @@ class _RequestListState extends ConsumerState<RequestList> {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
):Text("data");
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,14 +94,39 @@ class JsonSearchField extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return TextField(
|
return RawTextField(
|
||||||
controller: controller,
|
controller: controller,
|
||||||
onChanged: onChanged,
|
onChanged: onChanged,
|
||||||
style: kCodeStyle,
|
style: kCodeStyle,
|
||||||
decoration: const InputDecoration(
|
hintText: 'Search..',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class RawTextField extends StatelessWidget {
|
||||||
|
const RawTextField({
|
||||||
|
super.key,
|
||||||
|
this.onChanged,
|
||||||
|
this.controller,
|
||||||
|
this.hintText,
|
||||||
|
this.style,
|
||||||
|
});
|
||||||
|
|
||||||
|
final void Function(String)? onChanged;
|
||||||
|
final TextEditingController? controller;
|
||||||
|
final String? hintText;
|
||||||
|
final TextStyle? style;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return TextField(
|
||||||
|
controller: controller,
|
||||||
|
onChanged: onChanged,
|
||||||
|
style: style,
|
||||||
|
decoration: InputDecoration(
|
||||||
isDense: true,
|
isDense: true,
|
||||||
border: InputBorder.none,
|
border: InputBorder.none,
|
||||||
hintText: 'Search..',
|
hintText: hintText,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user