Untitled
import 'package:Buildeffective/src/screens/product_aggregation_screen/product_aggregation_common_widgets/expansion_widget_with_title_count.dart'; import 'package:Buildeffective/src/screens/product_aggregation_screen/product_aggregation_models/product_list_finish_heading_model.dart'; import 'package:Buildeffective/src/screens/product_aggregation_screen/product_aggregation_screens/product_aggregation_list_screen.dart'; import 'package:Buildeffective/src/screens/product_aggregation_screen/product_aggregation_viewmodels/product_aggregation_viewmodel.dart'; import 'package:Buildeffective/src/screens/product_screen/product_models/product_holdings_model.dart'; import 'package:Buildeffective/src/screens/space_property_list/space_viewmodel.dart'; import 'package:Buildeffective/src/ui_component/app_loader.dart'; import 'package:Buildeffective/src/utils/comman_methods.dart'; import 'package:Buildeffective/src/utils/res_colors.dart'; import 'package:Buildeffective/src/utils/res_images.dart'; import 'package:Buildeffective/src/utils/text_style.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get_it/get_it.dart'; import 'package:nb_utils/nb_utils.dart'; import '../../../../ui_component/sticky_header/widget.dart'; class CategoryProductScreen extends StatefulWidget { const CategoryProductScreen({Key? key}) : super(key: key); @override State<CategoryProductScreen> createState() => _CategoryProductScreenState(); } class _CategoryProductScreenState extends State<CategoryProductScreen> { int? selectedHeadingIndex = -1; int? loaderIndex = -1; final ScrollController scrollController = ScrollController(); late ProductAggregationViewModel productAggregationViewModel; late SpaceViewModel spaceViewModel; @override void initState() { super.initState(); init(); } void init() async { productAggregationViewModel = GetIt.instance<ProductAggregationViewModel>(); spaceViewModel = GetIt.instance<SpaceViewModel>(); } @override void setState(fn) { if (mounted) super.setState(fn); } void onTapHeading(CategoryHeadings data) async { if (data.isClicked) { return; } else { data.isClicked = true; } if (data.isFinishHeading == null) { productAggregationViewModel.getProductListData( productCategoryHeadingId: data.slug.validate(), spaceZoneId: spaceViewModel.selectedSpaceZoneId.validate(), unitId: spaceViewModel.unitID, ); await ProductAggregationListScreen( productListTitlePojo: ProductListTitlePojo( title: data.name.validate(), subTitle: "", slug: data.slug.validate(), appliedFramework: data.appliedFramework, ), ).launch(context, pageRouteAnimation: PageRouteAnimation.Slide); data.isClicked = false; } } void onChildOfHeadingTap({required NestedCategoryHeadings nestedData, required String name}) async { if (nestedData.isClicked) { return; } else { nestedData.isClicked = true; } await productAggregationViewModel.getProductListData( productCategoryHeadingId: nestedData.slug.validate(), spaceZoneId: spaceViewModel.selectedSpaceZoneId.validate(), unitId: spaceViewModel.unitID, ); loaderIndex = -1; await ProductAggregationListScreen( productListTitlePojo: ProductListTitlePojo( title: nestedData.name.validate(), subTitle: name, slug: nestedData.slug.validate(), appliedFramework: nestedData.appliedFramework.validate(), ), ).launch(context, pageRouteAnimation: PageRouteAnimation.Slide); nestedData.isClicked = false; } void onFinishHeadingTap({required ProductListFinishHeading data, required String name}) { productAggregationViewModel.getProductListData( productCategoryHeadingId: data.slug, spaceZoneId: spaceViewModel.selectedSpaceZoneId!, unitId: spaceViewModel.unitID, isUnitFinishProductsAggregation: true, ); ProductAggregationListScreen( productListTitlePojo: ProductListTitlePojo( title: data.aliasName!, subTitle: name, slug: data.slug!, isUnitFinishProductsAggregation: true, ), ).launch(context); } @override Widget build(BuildContext context) { return Observer(builder: (context) { if (productAggregationViewModel.productHoldings == null || productAggregationViewModel.productHoldings!.categoryHeadings.validate().isEmpty) { return NoDataWidget( title: "No Products available\n to add in this space", titleTextStyle: BETextStyles.BodyStyleWithDarkGrey3Color, imageWidget: SvgPicture.asset(ResImages.ic_empty_product_icon, color: BEColors.darkGrey, height: 58, width: 58), ); } return Observer(builder: (context) { String text = productAggregationViewModel.searchText.validate(); if (productAggregationViewModel.getCategorySearchResult(list: productAggregationViewModel.productHoldings!.categoryHeadings.validate()).isEmpty) { return NoDataWidget( title: "No Search Results Found", titleTextStyle: BETextStyles.BodyStyleWithDarkGrey3Color, imageWidget: SvgPicture.asset(ResImages.ic_empty_product_icon, color: BEColors.darkGrey, height: 58, width: 58), ); } return ListView.separated( controller: scrollController, padding: EdgeInsets.only(bottom: 20), shrinkWrap: true, itemCount: productAggregationViewModel.getCategorySearchResult(list: productAggregationViewModel.productHoldings!.categoryHeadings.validate()).length, itemBuilder: (context, index) { CategoryHeadings data = productAggregationViewModel.getCategorySearchResult(list: productAggregationViewModel.productHoldings!.categoryHeadings.validate())[index]; bool isSelected = text.validate().isEmpty ? selectedHeadingIndex == index : true; return StickyHeaderBuilder( content: isSelected ? data.isFinishHeading.validate() ? AnimatedListView( shrinkWrap: true, listAnimationType: ListAnimationType.FadeIn, fadeInConfiguration: FadeInConfiguration(curve: Curves.easeInOut, delay: 20.milliseconds), itemCount: productAggregationViewModel.getCategoryFinishSearchResult(list: productAggregationViewModel.showProductListFinishesList).length, itemBuilder: (context, nestedCatHeadingIndex) { ProductListFinishHeading nestedData = productAggregationViewModel.getCategoryFinishSearchResult(list: productAggregationViewModel.showProductListFinishesList)[nestedCatHeadingIndex]; return ExpansionWidgetWithTitleCount( isSelected: false, leftPadding: 16, hideArrowButton: true, onTap: () { onFinishHeadingTap(data: nestedData, name: data.name.validate()); }, verticalPadding: 8, title: nestedData.aliasName.validate(), ); }, ) : ListView.separated( shrinkWrap: true, itemCount: data.nestedCategoryHeadings!.length, itemBuilder: (context, nestedCatHeadingIndex) { NestedCategoryHeadings nestedData = data.nestedCategoryHeadings![nestedCatHeadingIndex]; return ColoredBox( color: Colors.white, child: Observer(builder: (context) { return Row( children: [ ExpansionWidgetWithTitleCount( isSelected: false, leftPadding: 16, hideArrowButton: true, onTap: productAggregationViewModel.showProductListApiState == ApiState.running ? null : () { loaderIndex = nestedCatHeadingIndex; setState(() => {}); onChildOfHeadingTap(nestedData: nestedData, name: data.name.validate()); }, verticalPadding: 8, title: nestedData.name.validate(), count: '${nestedData.productCount}', ).expand(), if (productAggregationViewModel.showProductListApiState == ApiState.running && loaderIndex == nestedCatHeadingIndex) ...{ BEAppLoader(width: 16, height: 16), 8.width, }, ], ); }), ).expand(); }, separatorBuilder: (BuildContext context, int index) => Divider(height: 0, indent: 50, thickness: 1), ) : Offstage(), builder: (BuildContext context, double stuckAmount) { return ColoredBox( color: Colors.white, child: ExpansionWidgetWithTitleCount( isSelected: isSelected, titleTextStyle: BETextStyles.TitleStyle600With14DarkBlueColor, hideArrowButton: data.nestedCategoryHeadings.isNullOrEmpty() && data.isFinishHeading == null, onTap: () { if (data.nestedCategoryHeadings.isNullOrEmpty() && data.isFinishHeading == null) { onTapHeading(data); return; } if (isSelected) { selectedHeadingIndex = -1; } else { selectedHeadingIndex = index; } setState(() {}); }, title: data.name.validate(), count: '${data.productCount}', ), ); }, ); }, separatorBuilder: (BuildContext context, int index) { return Divider(height: 0); }, ); }); }); } }
Leave a Comment