Untitled

 avatar
user_8529798
plain_text
11 days ago
11 kB
0
Indexable
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