proxibuy_bussiness/lib/presentation/pages/reserve_manegment_page.dart

114 lines
3.9 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:async'; // اضافه کردن کتابخانه برای استفاده از Timer
import 'package:business_panel/presentation/home/bloc/home_bloc.dart';
import 'package:business_panel/presentation/widgets/active_discount_card.dart';
import 'package:business_panel/presentation/widgets/custom_app_bar_single.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:business_panel/gen/assets.gen.dart';
class ReserveManegmment extends StatefulWidget {
const ReserveManegmment({super.key});
@override
State<ReserveManegmment> createState() => _ReserveManegmmentState();
}
class _ReserveManegmmentState extends State<ReserveManegmment> {
final TextEditingController _searchController = TextEditingController();
Timer? _debounce;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) {
context.read<HomeBloc>().add(FetchDiscounts());
}
});
}
@override
void dispose() {
_searchController.dispose();
_debounce?.cancel(); // کنسل کردن تایمر برای جلوگیری از نشت حافظه
super.dispose();
}
void _onSearchChanged(String query) {
if (_debounce?.isActive ?? false) _debounce!.cancel();
_debounce = Timer(const Duration(milliseconds: 500), () {
if (mounted) {
context.read<HomeBloc>().add(SearchDiscounts(query: query));
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBarSingle(
page: "رزرو ها",
),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(16.0),
child: TextField(
controller: _searchController,
decoration: InputDecoration(
hintText: 'دنبال چی می‌گردی؟',
hintStyle: TextStyle(color: Color.fromARGB(255, 157, 157, 157)),
prefixIcon: Padding(
padding: const EdgeInsets.all(12.0),
child: SvgPicture.asset(
Assets.icons.riSearch2Line,
),
),
fillColor: Color.fromARGB(255, 244, 244, 244),
filled: true,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(50),
borderSide: BorderSide.none,
),
contentPadding: const EdgeInsets.symmetric(vertical: 0),
),
onChanged: _onSearchChanged, // استفاده از متد جدید
),
),
Expanded(
child: BlocBuilder<HomeBloc, HomeState>(
builder: (context, state) {
if (state is HomeError) {
return Center(child: Text('خطا: ${state.message}'));
}
if (state is HomeLoaded) {
if (state.discounts.isEmpty) {
return const Center(child: Text("هیچ تخفیفی با این مشخصات یافت نشد."));
}
return RefreshIndicator(
onRefresh: () async {
context.read<HomeBloc>().add(FetchDiscounts());
_searchController.clear();
},
child: ListView.builder(
padding: const EdgeInsets.symmetric(horizontal: 16),
itemCount: state.discounts.length,
itemBuilder: (context, index) {
final discount = state.discounts[index];
return ActiveDiscountCard(discount: discount);
},
),
);
}
return const Center(child: CircularProgressIndicator());
},
),
),
],
),
);
}
}