import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:lottie/lottie.dart'; import 'package:taafee_mobile/common/const/const.dart'; import 'package:taafee_mobile/common/extensions/widget_extension.dart'; import 'package:taafee_mobile/common/widgets/gridview.dart'; import 'package:taafee_mobile/common/widgets/loader.dart'; import 'package:taafee_mobile/common/widgets/responsive_view.dart'; import 'package:taafee_mobile/common/widgets/rx_viewer.dart'; import 'package:taafee_mobile/common/widgets/text.dart'; import 'package:taafee_mobile/common/widgets/toast.dart'; import 'package:taafee_mobile/core/routing/routing_manager.dart'; import 'package:taafee_mobile/features/auth/business_logic_layer/auth_controller.dart'; import 'package:taafee_mobile/features/card/business_logic_layer/card_controller.dart'; // import 'package:taafee_mobile/features/card/data_layer/model/card_model.dart'; // import 'package:taafee_mobile/features/card/data_layer/source/card_service.dart'; import 'package:taafee_mobile/features/card/presentation_layer/widgets/card.dart'; import 'package:taafee_mobile/features/card/presentation_layer/widgets/random_card_widget.dart'; import 'package:taafee_mobile/features/category/business_logic_layer/category_controller.dart'; import 'package:taafee_mobile/features/category/presentation_layer/widgets/category.dart'; import 'package:taafee_mobile/features/chat/business%20logic%20layer/chat_controller.dart'; import 'package:taafee_mobile/features/home/business_logic_layer/home_controller.dart'; import 'package:taafee_mobile/features/home/presentation_layer/widgets/appbar.dart'; import '../../../favorite/business_logic_layer/favorite_controller.dart'; // ignore: must_be_immutable class HomeScreen extends StatelessWidget { final HomeController homeController = Get.find(); final CategoryController categoryController = Get.find(); final CardController cardController = Get.find(); final ScrollController scrollController = ScrollController(); final ScrollController searchScrollController = ScrollController(); final AuthController authController = Get.find(); final ChatController chatController = Get.find(); final FavoriteController favoriteController = Get.find(); HomeScreen({super.key}); Future load() async { await Future.wait([ if (favoriteController.getFavoriteState.result.isEmpty) favoriteController.getFavorites(), if (categoryController.categoryState.result.isEmpty) categoryController.getCategories(onConnectionError: (e) { Toast.showToast('no_internert_connection'.tr); }), if (cardController.cardState.result.data.isEmpty) cardController.getCards(onConnectionError: (e) { Toast.showToast('no_internert_connection'.tr); }) ]); } Future refresh() async { cardController.cardState.result.clear(); categoryController.categoryState.result.clear(); await load(); } void moreDate() { scrollController.addListener(() { if (scrollController.position.atEdge && scrollController.offset != 0) { if (homeController.isUserSearching.value) { homeController.search(); } else { cardController.getCards(); } } }); } TextEditingController textEditingController = TextEditingController(); @override Widget build(BuildContext context) { Future.delayed(const Duration(microseconds: 1), () async { homeController.readUser(); }); load(); moreDate(); return Scaffold( backgroundColor: AppColors.backGroundColor, body: Obx( () => RefreshIndicator( onRefresh: () async { await refresh(); }, child: SingleChildScrollView( controller: scrollController, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ AppBarWidget( textEditingController: textEditingController, ), (homeController.isUserSearching.value) ? searchResults() : Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ BoldTextWidget( "categories".tr, color: AppColors.textColor, fontSize: (Responsive.isTablet() ? 18 : 16), ), RegularTextWidget("see_all".tr).onTap(() { RoutingManager.to(RouteName.categoryScreen); }) ], ).paddingSymmetric( horizontal: Responsive.isTablet() ? 30 : 20, vertical: 20), RxViewer( width: 150, height: 150, rxFuture: categoryController.categoryState, child: () => GridViewWidget( mainAxisExtent: Responsive.isTablet() ? 90 : null, count: Responsive.isTablet() ? 4 : 3, itemCount: Responsive.isTablet() ? ((categoryController .categoryState.result.length < 8) ? categoryController .categoryState.result.length : 8) : ((categoryController .categoryState.result.length < 6) ? categoryController .categoryState.result.length : 6), child: (index) => CategoryWidget( categoryController .categoryState.result[index]), ).paddingSymmetric( horizontal: Responsive.isTablet() ? 25 : 0, ), ), BoldTextWidget( "latest_add".tr, fontSize: (Responsive.isTablet() ? 18 : 16), color: AppColors.textColor, ).paddingSymmetric( horizontal: Responsive.isTablet() ? 30 : 20, vertical: 10), Obx( () { if (cardController.cardState.loading && cardController .cardState.result.isFirstPage) { return Loader( width: 150, height: 150, ).center(); } else if (cardController.cardState.hasError) { return Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Lottie.asset( 'assets/animations/Wifi.json', repeat: false, width: 120, ).paddingAll(5), RegularTextWidget( 'you_have_no_internet_connection'.tr, textAlign: TextAlign.center, color: AppColors.textColor, fontSize: 18.0, ), SizedBox( height: Get.height, ), ], ).center(); } else { return Obx(() { return ResponsiveView( mainAxisExtent: Responsive.isTablet() ? 200 : 158, itemCount: cardController .cardState.result.data.length, childBuilder: (index) { return Obx(() { return RandomCardWidget( cardController .cardState.result.data[index], ); }); }); }); } }, ), if (cardController.cardState.loading && !cardController.cardState.result.isFirstPage) Loader( width: 40, height: 40, ), ], ).paddingSymmetric( horizontal: Responsive.isTablet() ? 16 : 8), ], ), ), ), )).makeSafeArea(); } RxViewer searchResults() { return RxViewer( // width: Get.width * 0.5, height: Get.height * 0.5, withPagination: true, errorWidget: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ BoldTextWidget( 'search_results'.tr, fontSize: 18, color: AppColors.textColor, ) .align(alignment: Alignment.topLeft) .padding(const EdgeInsets.only( left: 16, )), SvgPicture.asset( "assets/icons/x.svg", ).onTap(() { textEditingController.clear(); homeController.changeUserSearchingState(false); homeController.searchState.result.clear(); }), ], ).paddingOnly(top: 24, bottom: 16, right: 18), SizedBox( height: Get.height * 0.08, ), Lottie.asset( 'assets/animations/Wifi.json', repeat: false, width: 120, ).paddingAll(5), RegularTextWidget( 'you_have_no_internet_connection'.tr, color: AppColors.textColor, fontSize: 18.0, ) ], ).paddingSymmetric(horizontal: (Responsive.isTablet()) ? 40 : 0).center(), rxFuture: homeController.searchState, child: () => (homeController.searchState.result.data.isNotEmpty) ? Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ BoldTextWidget( 'search_results'.tr, fontSize: 18, color: AppColors.textColor, ) .align(alignment: Alignment.topLeft) .padding(EdgeInsets.only( left: Responsive.isTablet() ? 40 : 16, )), SvgPicture.asset( "assets/icons/x.svg", ).onTap(() { textEditingController.clear(); homeController.searchState.result.clear(); homeController.changeUserSearchingState(false); }).paddingOnly(right: Responsive.isTablet() ? 40 : 0), ], ).paddingOnly(top: 24, bottom: 16, right: 18), Obx(() { return ResponsiveView( mainAxisExtent: 180, itemCount: homeController.searchState.result.length, childBuilder: (index) => CardWidget( homeController.searchState.result.data[index]), ); }), ], ).paddingSymmetric(horizontal: (Responsive.isTablet()) ? 40 : 0) : Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ BoldTextWidget( 'search_results'.tr, fontSize: 18, color: AppColors.textColor, ) .align(alignment: Alignment.topLeft) .padding(const EdgeInsets.only( left: 16, )), SvgPicture.asset( "assets/icons/x.svg", ).onTap(() { textEditingController.clear(); homeController.searchState.result.clear(); homeController.changeUserSearchingState(false); }), ], ).paddingOnly(top: 24, bottom: 16, right: 18), SizedBox( height: Get.height * 0.08, ), SizedBox( width: 120, height: 120, child: Lottie.asset( 'assets/animations/folder.json', repeat: false, )), RegularTextWidget( 'no_results_found'.tr, color: AppColors.textColor, fontSize: 18.0, ) ], ).paddingSymmetric(horizontal: (Responsive.isTablet()) ? 40 : 0), ); } }