import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:taafee_mobile/common/extensions/widget_extension.dart'; import 'package:taafee_mobile/common/widgets/rx_viewer.dart'; import 'package:taafee_mobile/core/routing/routing_manager.dart'; import 'package:taafee_mobile/features/category/business_logic_layer/category_controller.dart'; import 'package:taafee_mobile/features/home/business_logic_layer/home_controller.dart'; import '../../features/home/presentation_layer/widgets/search_bar.dart'; import '../../features/home/presentation_layer/widgets/search_category.dart'; import '../../features/home/presentation_layer/widgets/search_location.dart'; import '../const/const.dart'; import 'listview.dart'; import 'text.dart'; // ignore: must_be_immutable class SearchAreaWidget extends StatelessWidget { SearchAreaWidget({super.key, this.textEditingController}); final CategoryController categoryController = Get.find(); Timer? debouncer; final HomeController homeController = Get.find(); TextEditingController? textEditingController; void dialog(BuildContext context) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), contentPadding: EdgeInsets.zero, actionsPadding: EdgeInsets.zero, title: RegularTextWidget( "choose_city_please".tr, fontSize: 14, ), content: Container( decoration: BoxDecoration(borderRadius: BorderRadius.circular(8)), width: Get.width * .89, height: Get.height * .58, child: SingleChildScrollView( child: Column( children: [ SearchBarWidget( onChanged: (value) { if (debouncer?.isActive ?? false) { debouncer!.cancel(); } debouncer = Timer(const Duration(seconds: 1), () { homeController.getCities(value: value); }); }, onSearch: () {}, hint: "search_city_or_country_name".tr, ).paddingSymmetric(horizontal: 17, vertical: 20), RxViewer( width: 300, height: 300, color: AppColors.primeColor, rxFuture: homeController.cityState, child: () => ListViewWidget( itemCount: homeController.cityState.result.length, childBuilder: (index) { return SearchLocationWidget( homeController.cityState.result[index]) .onTap(() { homeController.searchModel.value.cityId = homeController.cityState.result[index].id; RoutingManager.back(); homeController.setCityName( homeController.cityState.result[index].name); homeController.search(); RoutingManager.back(); }); }), ) ], ), ), ), ); }); } void categoryDialog(BuildContext context) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( contentPadding: EdgeInsets.zero, actionsPadding: EdgeInsets.zero, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), title: RegularTextWidget( "choose_category_please".tr, fontSize: 14, ), content: Container( decoration: BoxDecoration(borderRadius: BorderRadius.circular(8)), width: Get.width * .89, height: Get.height * .58, child: SingleChildScrollView( child: Column( children: [ SearchBarWidget( onChanged: (value) { if (debouncer?.isActive ?? false) { debouncer!.cancel(); } debouncer = Timer(const Duration(seconds: 1), () { categoryController.searchCategories(value: value); }); }, onSearch: () {}, hint: 'search_category_name'.tr, ).paddingSymmetric(horizontal: 17, vertical: 20), RxViewer( width: 300, height: 300, color: AppColors.primeColor, rxFuture: categoryController.searchCategoriesState, child: () => ListViewWidget( itemCount: categoryController .searchCategoriesState.result.length, childBuilder: (index) { return SearchCategoryWidget( categoryModel: categoryController .searchCategoriesState.result[index], ).onTap(() { homeController.searchModel.value.categoryId = categoryController .searchCategoriesState.result[index].id; homeController.setCategoryName(categoryController .searchCategoriesState.result[index].name); homeController.searchState.result.clear(); homeController.search(); RoutingManager.back(); }); }), ) ], ), ), ), ); }); } @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.only(top: 5), width: Get.width * .89, height: Responsive.isTablet() ? 70 : 108, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(8), ), child: (Responsive.isTablet()) ? Row( children: [ SearchBarWidget( controller: textEditingController, onChanged: (value) async { if (debouncer?.isActive ?? false) debouncer!.cancel(); debouncer = Timer(const Duration(milliseconds: 1000), () { if (value == '') { homeController.searchModel.value.searchWords = value; homeController.searchState.result.clear(); homeController.changeUserSearchingState(false); } else { homeController.searchState.result.clear(); homeController.changeUserSearchingState(true); homeController.searchModel.value.searchWords = value; homeController.search(); } }); }, onSearch: () { homeController.searchState.result.clear(); homeController.changeUserSearchingState(true); homeController.search(); }) .paddingSymmetric(horizontal: 10) .paddingOnly( bottom: Responsive.isTablet() ? 8 : 0, ) .expanded(4), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( child: Row( children: [ Obx( () => RegularTextWidget( homeController.searchModel.value.cityName ?? "city".tr, color: Colors.black, fontSize: 14, ).paddingSymmetric(horizontal: 5), ), SvgPicture.asset("assets/icons/arrow.svg") ], ).onTap(() async { dialog(context); await homeController.getCities(); }), ), Container( child: Row( children: [ Obx( () => RegularTextWidget( homeController.searchModel.value.categoryName ?? "categories".tr, fontSize: 14, color: Colors.black, ).paddingSymmetric(horizontal: 5), ), SvgPicture.asset("assets/icons/arrow.svg") ], ).onTap(() async { categoryDialog(context); await categoryController.searchCategories(); }), ), Obx(() { return Visibility( visible: (homeController.searchModel.value.categoryId != null) || (homeController.searchModel.value.cityId != null) || (homeController.searchModel.value.searchWords != null), child: SvgPicture.asset('assets/icons/x.svg').onTap(() { homeController.clearSearchFilters(); textEditingController!.clear(); homeController.searchState.result.clear(); homeController.search(); }), ); }), Container( alignment: Alignment.center, width: 79, height: 38, decoration: BoxDecoration( color: AppColors.secondaryColor, borderRadius: BorderRadius.circular(30)), child: RegularTextWidget( "search".tr, fontSize: 14, color: Colors.white, ), ).onTap(() { homeController.searchState.result.clear(); homeController.changeUserSearchingState(true); homeController.search(); }), ], ) .paddingSymmetric( horizontal: Responsive.isTablet() ? 16 : 4, vertical: 8) .expanded(4) ], ) : Column( children: [ SearchBarWidget( controller: textEditingController, onChanged: (value) async { if (debouncer?.isActive ?? false) debouncer!.cancel(); debouncer = Timer(const Duration(milliseconds: 1000), () { if (value == '') { homeController.searchModel.value.searchWords = value; homeController.searchState.result.clear(); homeController.changeUserSearchingState(false); } else { homeController.searchState.result.clear(); homeController.changeUserSearchingState(true); homeController.searchModel.value.searchWords = value; homeController.search(); } }); }, onSearch: () { homeController.searchState.result.clear(); homeController.changeUserSearchingState(true); homeController.search(); }).paddingSymmetric(horizontal: 10), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( child: Row( children: [ Obx( () => RegularTextWidget( homeController.searchModel.value.cityName ?? "city".tr, fontSize: 14, color: Colors.black, ).paddingSymmetric(horizontal: 5), ), SvgPicture.asset("assets/icons/arrow.svg") ], ).onTap(() async { dialog(context); await homeController.getCities(); }), ), Container( child: Row( children: [ Obx( () => RegularTextWidget( homeController.searchModel.value.categoryName ?? "categories".tr, color: Colors.black, fontSize: 14, ).paddingSymmetric(horizontal: 5), ), SvgPicture.asset("assets/icons/arrow.svg") ], ).onTap(() async { categoryDialog(context); await categoryController.searchCategories(); }), ), Obx(() { return Visibility( visible: (homeController.searchModel.value.categoryId != null) || (homeController.searchModel.value.cityId != null) || (homeController.searchModel.value.searchWords != null), child: SvgPicture.asset('assets/icons/x.svg').onTap(() { homeController.clearSearchFilters(); textEditingController!.clear(); homeController.searchState.result.clear(); homeController.search(); }), ); }), Container( alignment: Alignment.center, width: 79, height: 38, decoration: BoxDecoration( color: AppColors.secondaryColor, borderRadius: BorderRadius.circular(30)), child: RegularTextWidget( "search".tr, fontSize: 14, color: Colors.white, ), ).onTap(() { homeController.searchState.result.clear(); homeController.changeUserSearchingState(true); homeController.search(); }), ], ).paddingSymmetric(horizontal: 10, vertical: 7) ], ), ); } }