import 'package:fcs/constants.dart'; import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/user_search/user_search.dart'; import 'package:fcs/pages/widgets/local_app_bar.dart'; import 'package:fcs/pages/widgets/local_radio_buttons.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/local_title.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:provider/provider.dart'; import '../main/util.dart'; import 'carton_package_form.dart'; import 'carton_info.dart'; import 'mix_carton/mix_carton_form.dart'; import 'model/package_selection_model.dart'; import 'widget/carton_row.dart'; class CartonEditor extends StatefulWidget { const CartonEditor({super.key}); @override _CartonEditorState createState() => _CartonEditorState(); } class _CartonEditorState extends State { List cartonTypes = [carton_from_packages, carton_mix_carton]; List cartons = []; bool isLoading = false; String? _selectedCartonType; User? _consignee; User? _sender; bool _hasPackages = true; @override void initState() { _init(); super.initState(); } _init() { _selectedCartonType = carton_from_packages; if (mounted) { setState(() {}); } } @override Widget build(BuildContext context) { bool isFromPackages = _selectedCartonType == carton_from_packages; final createBtn = Row( mainAxisAlignment: MainAxisAlignment.center, children: [ InkWell( onTap: () { Navigator.pop(context); }, child: Container( alignment: Alignment.bottomRight, height: 45, width: 130, decoration: BoxDecoration( color: primaryColor, borderRadius: BorderRadius.circular(5), ), child: TextButton( onPressed: null, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Flexible( child: LocalText(context, 'box.done.btn', color: Colors.white, fontSize: 15), ), const SizedBox(width: 5), const Icon( MaterialCommunityIcons.check_circle_outline, color: Colors.white, ), ], ), ), )), ], ); final cartonTypeBox = LocalRadioButtons( readOnly: false, values: cartonTypes, selectedValue: _selectedCartonType, callback: (String? v) { setState(() { _selectedCartonType = v; }); }); final cartonTitleBox = LocalTitle( textKey: cartons.isEmpty ? "box.shipment.boxes" : "box.cartion.count", translationVariables: cartons.isEmpty ? null : ["${cartons.length}"], trailing: Padding( padding: const EdgeInsets.only(right: 5), child: InkResponse( radius: 30, onTap: () async { //for packages if (isFromPackages) { if (_consignee == null) { showMsgDialog(context, "Error", "Please select consignee"); return; } if (_sender == null) { showMsgDialog(context, "Error", "Please select sender"); return; } if (!_hasPackages) { showMsgDialog( context, "Error", "No packages in consignee and sender"); return; } Carton? carton = await Navigator.push( context, CupertinoPageRoute( builder: (context) => CartonPackageForm( sender: _sender!, consignee: _consignee!))); if (carton != null) { setState(() { cartons.add(carton); }); } } // for mix cartion else { Carton? carton = await Navigator.push( context, CupertinoPageRoute( builder: (context) => const MixCartonForm())); if (carton != null) { setState(() { cartons.add(carton); }); } } }, child: Icon(Icons.add_circle, color: primaryColor), ), )); final consigneeBox = userSearchBox(context, lableKey: 'box.consignee.title', icon: MaterialCommunityIcons.account_arrow_left, user: _consignee, onSearch: () => searchUser(context, onUserSelect: (u) { setState(() { _consignee = u; }); _checkPackages(); }, popPage: true)); final senderBox = userSearchBox(context, lableKey: 'box.sender.title', icon: MaterialCommunityIcons.account_arrow_right, user: _sender, onSearch: () => searchUser(context, onUserSelect: (u) { setState(() { _sender = u; }); _checkPackages(); }, popPage: true)); return LocalProgress( inAsyncCall: isLoading, child: Scaffold( appBar: LocalAppBar( labelKey: "boxes.new", backgroundColor: Colors.white, arrowColor: primaryColor, labelColor: primaryColor), body: ListView( padding: EdgeInsets.only(left: 10, right: 10), shrinkWrap: true, children: [ LocalTitle(textKey: "box.select.carton_type"), cartonTypeBox, isFromPackages ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ LocalTitle(textKey: "box.select.sender_and_consignee"), Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Flexible(child: consigneeBox), Flexible(child: senderBox) ], ), !_hasPackages ? Padding( padding: const EdgeInsets.only(top: 5), child: Text("No packages in sender and consignee", style: TextStyle( color: dangerColor, fontSize: 13)), ) : const SizedBox() ], ) : Container(), cartonTitleBox, Column(children: _getCartons(context, cartons)), SizedBox(height: 20), createBtn, SizedBox(height: 20), ], ), ), ); } _checkPackages() async { if (_sender != null && _consignee != null) { var p = await context .read() .getPackagesBySenderAndConsigneeId( senderId: _sender!.id ?? "", consigneeId: _consignee!.id ?? ""); setState(() { _hasPackages = p.isNotEmpty; }); } } List _getCartons(BuildContext context, List cartons) { return cartons.map((c) { return InkWell( onTap: () async { Navigator.push( context, CupertinoPageRoute(builder: (context) => CartonInfo(carton: c)), ); }, child: CartonRow(carton: c)); }).toList(); } }