search logic added to desktop tenders

This commit is contained in:
amirrezaghabeli
2025-09-22 09:28:09 +03:30
parent 2e2718a92e
commit f70229ab30
9 changed files with 200 additions and 51 deletions
+35 -6
View File
@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:provider/provider.dart';
@@ -61,7 +63,9 @@ class _DesktopTendersPageState extends State<DesktopTendersPage> {
builder: (context, vm, child) {
if (vm.isLoading) {
return const Center(
child: CircularProgressIndicator(color: AppColors.jellyBean),
child: CircularProgressIndicator(
color: AppColors.jellyBean,
),
);
}
if (vm.errorMessage != null) {
@@ -105,18 +109,43 @@ class _DesktopTendersPageState extends State<DesktopTendersPage> {
}
}
class _SearchBox extends StatelessWidget {
class _SearchBox extends StatefulWidget {
const _SearchBox();
@override
State<_SearchBox> createState() => _SearchBoxState();
}
class _SearchBoxState extends State<_SearchBox> {
final TextEditingController _searchController = TextEditingController();
Timer? _debounceTimer;
@override
void dispose() {
_searchController.dispose();
_debounceTimer?.cancel();
super.dispose();
}
void _onSearchChanged(String query) {
_debounceTimer?.cancel();
_debounceTimer = Timer(const Duration(milliseconds: 500), () {
final viewModel = context.read<TendersViewModel>();
viewModel.searchTenders(query);
});
}
@override
Widget build(BuildContext context) {
return SizedBox(
height: 48.0.h(),
width: 680,
child: TextField(
style: TextStyle(fontSize: 16.0.sp(), color: AppColors.grey0),
controller: _searchController,
onChanged: _onSearchChanged,
style: TextStyle(fontSize: 16.0.sp(), color: AppColors.grey60),
decoration: InputDecoration(
hintText: 'Search',
hintText: TendersStrings.search,
hintStyle: TextStyle(fontSize: 16.0.sp(), color: AppColors.grey60),
prefixIcon: Padding(
padding: EdgeInsets.all(12.0.w()),
@@ -221,8 +250,8 @@ class _DesktopPagination extends StatelessWidget {
onTap: () async {
final selectedPage = await showDialog<int>(
context: context,
builder: (context) =>
PageSelectionDialog(totalPages: totalPages),
builder:
(context) => PageSelectionDialog(totalPages: totalPages),
);
if (selectedPage != null) {
onPageSelected(selectedPage);