Untitled

 avatar
unknown
plain_text
20 days ago
12 kB
0
Indexable
import 'package:Buildeffective/src/model/dashboard_property_list_response.dart';
import 'package:Buildeffective/src/model/property_building_response.dart';
import 'package:Buildeffective/src/model/property_info_response.dart';
import 'package:Buildeffective/src/model/spaces_response.dart';
import 'package:Buildeffective/src/screens/product_aggregation_screen/product_aggregation_common_widgets/select_building_dropdown_widget.dart';
import 'package:Buildeffective/src/screens/product_aggregation_screen/product_aggregation_common_widgets/select_space_zone_widget.dart';
import 'package:Buildeffective/src/screens/product_aggregation_screen/product_aggregation_screens/component/category_product_screen.dart';
import 'package:Buildeffective/src/screens/product_aggregation_screen/product_aggregation_screens/component/product_space_widget.dart';
import 'package:Buildeffective/src/screens/product_aggregation_screen/product_aggregation_viewmodels/product_aggregation_viewmodel.dart';
import 'package:Buildeffective/src/screens/product_screen/product_viewmodels/product_screen_viewmodel.dart';
import 'package:Buildeffective/src/screens/space_property_list/space_viewmodel.dart';
import 'package:Buildeffective/src/screens/splash/splash_screen.dart';
import 'package:Buildeffective/src/ui_component/app_loader.dart';
import 'package:Buildeffective/src/ui_component/common_appbar.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/get.dart';
import 'package:get_it/get_it.dart';
import 'package:nb_utils/nb_utils.dart';

class ProductCategoryScreen extends StatefulWidget {
  final MyProperty currentPropertyData;
  final OwnProperty? ownProperty;

  const ProductCategoryScreen({Key? key, required this.currentPropertyData, this.ownProperty}) : super(key: key);

  @override
  State<ProductCategoryScreen> createState() => _ProductCategoryScreenState();
}

class _ProductCategoryScreenState extends State<ProductCategoryScreen> with TickerProviderStateMixin {
  late SpaceViewModel spaceViewModel;

  late ProductAggregationViewModel productAggregationViewModel;
  late ProductScreenViewModel productScreenViewModel;

  late TabController _tabController;

  @override
  void initState() {
    super.initState();
    init();
  }

  void init() async {
    _tabController = TabController(length: 2, vsync: this);
    registerViewModels();
    getData();
  }

  @override
  void setState(fn) {
    if (mounted) super.setState(fn);
  }

  void getData({String? unitId}) async {
    if (spaceViewModel.spaceZoneListModel == null) {
      await spaceViewModel.getSpaceZoneList({"property_slug": widget.currentPropertyData.slug.validate()});
    }

    spaceViewModel.getSpaceInfoListData();

    productAggregationViewModel.showProductAggregationApiState = ApiState.running;
    String tempUnitId;

    if (spaceViewModel.spaceInfoList.validate().isEmpty && unitId.validate().isNotEmpty) {
      tempUnitId = unitId ?? widget.ownProperty!.firstUnitSlug.validate();
    } else {
      PropertyBuildingDatum firstValue = spaceViewModel.spaceInfoList[0];
      PropertyBuildingDatum? valueFromList = spaceViewModel.spaceInfoList.firstWhereOrNull((element) => element.buildingName == spaceViewModel.propertyType);

      var finalPropertyDatum = valueFromList ?? firstValue;
      tempUnitId = unitId ?? finalPropertyDatum.units!.first.slug.validate();
    }

    String selectedSpaceZoneId = spaceViewModel.selectedSpaceZoneId.validate();

    await Future.wait(
      [
        productAggregationViewModel.showProductAggregationSpaceData(unitId: tempUnitId, spaceZoneId: selectedSpaceZoneId),
        productAggregationViewModel.showProductListFinishesListData(unitId: tempUnitId, spaceZoneId: selectedSpaceZoneId),
        productAggregationViewModel.showProductAggregationCategoryData(unitId: tempUnitId, spaceZoneId: selectedSpaceZoneId),
      ],
    );

    productAggregationViewModel.showProductAggregationApiState = ApiState.success;
    spaceViewModel.isFullScreenLoader = false;
  }

  Future<void> registerViewModels() async {
    if (!GetIt.instance.isRegistered<SpaceViewModel>()) {
      spaceViewModel = SpaceViewModel();
      RegisterInGetIt<SpaceViewModel>(spaceViewModel);
    } else {
      spaceViewModel = GetIt.instance<SpaceViewModel>();
    }
    if (GetIt.instance.isRegistered<ProductAggregationViewModel>()) {
      productAggregationViewModel = GetIt.instance<ProductAggregationViewModel>();
    } else {
      productAggregationViewModel = ProductAggregationViewModel();
      RegisterInGetIt<ProductAggregationViewModel>(productAggregationViewModel);
    }
    if (GetIt.instance.isRegistered<ProductScreenViewModel>()) {
      productScreenViewModel = GetIt.instance<ProductScreenViewModel>();
    } else {
      productScreenViewModel = ProductScreenViewModel();
      RegisterInGetIt<ProductScreenViewModel>(productScreenViewModel);
    }
  }

  Widget buildBuildingWidget() {
    return SelectBuildingDropdownWidget(
      leftWidget: Text('Building', style: BETextStyles.LinkStyleWithWhiteColor),
      onBuildingSelect: (building) {
        getData(unitId: building.units!.first.slug.validate());
      },
    );
  }

  Widget buildSpaceZoneWidget() {
    return SelectSpaceZoneWidget(
      onSpaceZoneSelect: (newSpaceZone) {
        getData();
      },
      productAggregationViewModel: productAggregationViewModel,
      handleLoader: true,
    );
  }

  @override
  void dispose() {
    spaceViewModel.isFullScreenLoader = false;
    try {
      if (GetIt.instance.isRegistered<UnitSpacesFloorWise>(instanceName: "unit_space")) GetIt.instance.unregister<UnitSpacesFloorWise>(instanceName: "unit_space");
      GetIt.instance.unregister<ProductAggregationViewModel>();
      GetIt.instance.unregister<ProductScreenViewModel>();
    } catch (e) {}
    super.dispose();
  }

  //
  @override
  Widget build(BuildContext context) {
    return Observer(
      builder: (context) {
        bool loader = (spaceViewModel.isFullScreenLoader == true && (spaceViewModel.getSpaceListZoneApiState == ApiState.running || productAggregationViewModel.showProductAggregationApiState == ApiState.running || productAggregationViewModel.productHoldings == null));
        return Scaffold(
          backgroundColor: loader ? BEColors.white : BEColors.darkBlue,
          appBar: AppAppBar(
            title: "Dashboard",
            needBackButton: true,
            fullName: "",
            titleWidget: productAggregationViewModel.isSearchVisible
                ? AppTextField(
                    controller: productAggregationViewModel.searchCont,
                    onChanged: (p0) async {
                      productAggregationViewModel.getAreaSearchValue(p0);
                    },
                    textFieldType: TextFieldType.NAME,
                    onFieldSubmitted: (p0) {
                      if (p0.validate().isEmpty && productAggregationViewModel.isSearchVisible) {
                        productAggregationViewModel.searchCont.clear();
                        productAggregationViewModel.searchText = "";
                      }
                      if (p0.isEmpty) {
                        productAggregationViewModel.setSearchVisible(!productAggregationViewModel.isSearchVisible);
                      }
                    },
                    decoration: InputDecoration(
                      border: InputBorder.none,
                      hintText: "Type Here...",
                      alignLabelWithHint: true,
                      hintStyle: BETextStyles.TabStyleWithSecondGrayColor,
                      enabledBorder: InputBorder.none,
                    ),
                    autoFocus: true,
                  )
                : Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text("Products", style: BETextStyles.H6StyleWithDarkBlueColor),
                      4.height,
                      Text(widget.currentPropertyData.name.validate().capitalizeEachWord(), style: BETextStyles.InfoTextStylesWithSecondGrayColor),
                    ],
                  ),
            actions: [
              IconButton(
                onPressed: () {
                  if (productAggregationViewModel.isSearchVisible) {
                    productAggregationViewModel.searchCont.clear();
                    productAggregationViewModel.searchText = "";
                  }
                  productAggregationViewModel.setSearchVisible(!productAggregationViewModel.isSearchVisible);
                },
                icon: Observer(
                  builder: (context) {
                    return SvgPicture.asset(
                      productAggregationViewModel.isSearchVisible ? ResImages.ic_close : ResImages.ic_search_dashboard,
                      color: Colors.black,
                    );
                  },
                ),
              ),
            ],
          ),
          body: AppLoader(
            isLoading: loader,
            child: Column(
              children: [
                ColoredBox(
                  color: BEColors.darkBlue,
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      buildBuildingWidget(),
                      buildSpaceZoneWidget(),
                    ],
                  ),
                ),
                Column(
                  mainAxisSize: MainAxisSize.min,
                  children: [
                    Theme(
                      data: ThemeData(useMaterial3: true),
                      child: ColoredBox(
                        color: Colors.white,
                        child: TabBar(
                          indicatorWeight: 2,
                          labelColor: BEColors.primaryColor,
                          indicatorColor: BEColors.primaryColor,
                          unselectedLabelColor: ResColors.spaceListingTabBarColor,
                          controller: _tabController,
                          dividerHeight: 2,
                          dividerColor: Color(0XFFEBEDF0),
                          indicatorSize: TabBarIndicatorSize.tab,
                          tabAlignment: TabAlignment.fill,
                          tabs: List<Widget>.from(
                            ['By Spaces', 'By Categories'].map(
                              (element) => Tab(
                                child: Text(
                                  element,
                                  style: SplashScreen.isMobileDevice ? BETextStyles.LinkStyle : BETextStyles.BodyStyle,
                                ),
                              ),
                            ),
                          ),
                        ),
                      ),
                    ),
                    Observer(
                      builder: (context) {
                        return Ink(
                          color: Colors.white,
                          child: AppLoader(
                            isLoading: productAggregationViewModel.showProductAggregationApiState == ApiState.running,
                            child: TabBarView(
                              controller: _tabController,
                              children: [
                                ProductSpaceWidget(),
                                CategoryProductScreen(),
                              ],
                            ),
                          ),
                        ).expand();
                      },
                    ),
                  ],
                ).expand()
              ],
            ),
          ),
        );
      },
    );
  }
}
Leave a Comment