// ignore_for_file: use_build_context_synchronously import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/entities/processing.dart'; import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/package/package_info.dart'; import 'package:fcs/pages/user_search/user_search.dart'; import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/local_app_bar.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 '../../domain/entities/fcs_shipment.dart'; import '../fcs_shipment/model/fcs_shipment_model.dart'; import '../widgets/local_dropdown.dart'; import 'model/processing_model.dart'; import 'package_editor.dart'; class ProcesingEditor extends StatefulWidget { const ProcesingEditor({super.key}); @override _ProcesingEditorState createState() => _ProcesingEditorState(); } class _ProcesingEditorState extends State { Processing processing = Processing(); bool _isLoading = false; User? _consignee; User? _sender; List packages = []; List _shipments = []; FcsShipment? _shipment; @override void initState() { _loadShipment(); super.initState(); } _loadShipment() async { var fcsShipments = await context.read().getActiveFcsShipments(); _shipments = fcsShipments; if (mounted) { setState(() {}); } } @override Widget build(BuildContext context) { final consigneeBox = userSearchBox(context, lableKey: 'box.consignee.title', icon: MaterialCommunityIcons.account_arrow_left, user: _consignee, onSearch: () => searchUser(context, onUserSelect: (u) { setState(() { _consignee = u; }); }, 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; }); }, popPage: true)); final fcsShipmentsBox = Container( padding: EdgeInsets.symmetric(vertical: 15), child: LocalDropdown( callback: (v) { setState(() { _shipment = v; }); }, labelKey: "box.shipment", iconData: Ionicons.ios_airplane, display: (u) => u.shipmentNumber, selectedValue: _shipment, values: _shipments, )); final packageTitleBox = Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Text("Packages (${packages.length})"), IconButton( icon: Icon( Icons.add_circle, color: primaryColor, ), onPressed: () async { if (_consignee == null) { showMsgDialog(context, "Error", "Please select consignee"); return; } if (_sender == null) { showMsgDialog(context, "Error", "Please select sender"); return; } if (_shipment == null) { showMsgDialog(context, "Error", "Please select shipment"); return; } Package? package = await Navigator.push( context, CupertinoPageRoute( builder: (context) => PackageEditor( sender: _sender!, consignee: _consignee!, shipment: _shipment!)), ); _addPackage(package); // _savePackage(_package); }), ], ); final createButton = fcsButton( context, getLocalString(context, 'processing.edit.complete.btn'), callack: _save, ); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: LocalAppBar( labelKey: "processing.create", backgroundColor: Colors.white, labelColor: primaryColor, arrowColor: primaryColor, ), body: Padding( padding: const EdgeInsets.only(left: 12.0, right: 12), child: ListView( children: [ SizedBox( height: 10, ), Row( children: [ Flexible(child: consigneeBox), Flexible(child: senderBox) ], ), const SizedBox(height: 10), fcsShipmentsBox, packageTitleBox, Column( crossAxisAlignment: CrossAxisAlignment.start, children: _getPackages(context, packages), ), SizedBox( height: 20, ), createButton, SizedBox(height: 10), ], ), ), )); } List _getPackages(BuildContext context, List packages) { return packages.map((p) { return InkWell( onTap: () async { Package? _package = await Navigator.of(context).push( CupertinoPageRoute( builder: (context) => PackageInfo(package: p))); _savePackage(_package!); }, child: DisplayText( labelTextKey: "processing.tracking.id", iconData: MaterialCommunityIcons.barcode_scan, text: p.trackingID, ), ); }).toList(); } _addPackage(Package? package) { if (package == null) return; packages.add(package); setState(() {}); } _savePackage(Package? package) { if (package == null) return; setState(() {}); } _save() async { setState(() { _isLoading = true; }); ProcessingModel processingModel = Provider.of(context, listen: false); try { await processingModel.createProcessing(processing); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } }