This commit is contained in:
Ankit Mahato
2024-03-24 01:18:28 +05:30
parent 459ab83eb2
commit 5a9dd7c07e
4 changed files with 66 additions and 63 deletions

View File

@ -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;

View File

@ -23,3 +23,5 @@ final nameTextFieldFocusNodeProvider =
}); });
return focusNode; return focusNode;
}); });
final searchQueryProvider = StateProvider<String>((ref) => '');

View File

@ -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(
color: Theme.of(context).colorScheme.surfaceVariant,
),
),
child: Row(
children: [
kHSpacer5,
Icon(
Icons.filter_alt,
size: 18,
color: Theme.of(context).colorScheme.secondary,
),
kHSpacer5,
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; ref.read(searchQueryProvider.notifier).state = value;
ref.read(collectionStateNotifierProvider.notifier) print(value);
.filterRequests(value);
} }
else{
}
}, },
hintText: "search", ),
leading: Icon(Icons.search), ),
textStyle: MaterialStateTextStyle.resolveWith((states) => TextStyle(fontSize: 15.0)), ],
elevation: MaterialStateProperty.all(2.0), ),
)), ),
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"); );
} }
} }

View File

@ -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,
), ),
); );
} }