import 'dart:developer'; import 'package:car_provider_app/view_models/items_view_model.dart'; import 'package:car_provider_app/views/branch_management/schedule/widgets/chips_picker_item.dart'; import 'package:flutter/material.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/models/services_models/item_model.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/empty_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; import 'package:easy_localization/easy_localization.dart'; class SelectItemsSheet extends StatefulWidget { final int serviceId; final Function(List) onSelectItems; final List? list; const SelectItemsSheet({ super.key, required this.serviceId, required this.onSelectItems, this.list, }); @override State createState() => _SelectItemsSheetState(); } class _SelectItemsSheetState extends State { bool _loading = true; String? _error; @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) => _fetchItems()); } Future _fetchItems() async { if (!mounted) return; setState(() { _loading = true; _error = null; }); try { await context.read().getServiceItems( widget.serviceId, list: widget.list, ); } catch (e) { _error = e.toString(); } finally { if (mounted) setState(() => _loading = false); } } @override Widget build(BuildContext context) { return SizedBox( width: double.infinity, height: MediaQuery.of(context).size.height / 1.4, child: Column( children: [ Expanded( child: Consumer( builder: (_, itemsVM, child) { final items = itemsVM.serviceItems?.data; final selectedCount = items ?.where((element) => element.isUpdateOrSelected == true) .length ?? 0; return Padding( padding: const EdgeInsets.only(left: 20, right: 20, top: 6), child: Column( children: [ Row( children: [ Expanded( child: LocaleKeys.selectItems.tr().toText( fontSize: 24, isBold: true, ), ), Center( child: selectedCount.toString().toText( fontSize: 10, isBold: true, color: Colors.white, ), ).toContainer( borderRadius: 100, width: 24, height: 24, paddingAll: 0, backgroundColor: MyColors.darkPrimaryColor, ), ], ), 12.height, Expanded( child: _loading ? const Center(child: CircularProgressIndicator()) : _error != null ? Center( child: TextButton( onPressed: _fetchItems, child: Text('Failed to load items. Retry: $_error'), ), ) : items == null || items.isEmpty ? Center( child: EmptyWidget( text: LocaleKeys.noItemsToShow.tr(), ), ) : ListView.separated( itemBuilder: (context, index) { final item = items[index]; return CheckboxListTile( contentPadding: EdgeInsets.zero, controlAffinity: ListTileControlAffinity.leading, title: (item.name ?? '').toText(fontSize: 16), subtitle: item.price.toString().toText( fontSize: 14, color: MyColors.lightTextColor, ), value: item.isUpdateOrSelected ?? false, onChanged: (bool? value) { item.isUpdateOrSelected = value; log('Item selected: ${item.isUpdateOrSelected}'); itemsVM.notifyListeners(); }, ); }, separatorBuilder: (_, __) => const Divider(height: 1), itemCount: items.length, ), ), ], ), ); }, ), ), ShowFillButton( title: LocaleKeys.addSelectedItems.tr(), maxWidth: double.infinity, margin: const EdgeInsets.all(20), onPressed: () { if (_loading || _error != null) return; final itemsVM = context.read(); final selected = (itemsVM.serviceItems?.data ?? []) .where((element) => element.isUpdateOrSelected == true) .toList(); widget.onSelectItems(selected); Navigator.pop(context); }, ), ], ), ); } }