Untitled
user_8529798
plain_text
9 months ago
11 kB
2
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);
},
);
});
});
}
}
Editor is loading...
Leave a Comment