import 'package:fcs/domain/entities/fcs_shipment.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart'; import 'package:provider/provider.dart'; import '../../domain/entities/package.dart'; import '../../domain/entities/user.dart'; import '../main/util.dart'; import '../package/package_info.dart'; import '../widgets/continue_button.dart'; import '../widgets/local_title.dart'; import '../widgets/previous_button.dart'; import 'model/package_selection_model.dart'; import 'package_selection_result.dart'; typedef OnPrevious = Function(); typedef OnContinue = Function(); class PackageSelectionWidget extends StatefulWidget { final User sender; final User consignee; final FcsShipment shipment; final OnPrevious? onPrevious; final OnContinue? onContinue; const PackageSelectionWidget({ super.key, this.onPrevious, this.onContinue, required this.shipment, required this.sender, required this.consignee, }); @override State createState() => _PackageSelectionWidgetState(); } class _PackageSelectionWidgetState extends State { bool _isLoadMore = false; final _scrollController = ScrollController(); bool _down = true; @override void initState() { _init(); super.initState(); _scrollController.addListener(() { setState(() { _down = _scrollController.position.userScrollDirection == ScrollDirection.forward; }); }); } _init() { var packageModel = context.read(); packageModel.refresh( shipmentId: widget.shipment.id!, consigneeId: widget.consignee.id!, senderId: widget.sender.id!, ); if (mounted) { setState(() {}); } } Future _loadMoreData() async { if (_isLoadMore) return; var model = context.read(); if (model.ended) return; setState(() { _isLoadMore = true; }); await model.loadMoreData( shipmentId: widget.shipment.id!, consigneeId: widget.consignee.id!, senderId: widget.sender.id!, ); setState(() { _isLoadMore = false; }); } @override Widget build(BuildContext context) { var model = context.watch(); List packages = model.packages; final senderBox = userDisplayBox(context, lableKey: "box.sender.title", icon: MaterialCommunityIcons.account_arrow_right, showLink: false, name: widget.sender.name ?? "", fcsID: widget.sender.fcsID ?? ""); final consigneeBox = userDisplayBox(context, showLink: false, lableKey: "box.consignee.title", icon: MaterialCommunityIcons.account_arrow_left, name: widget.consignee.name, fcsID: widget.consignee.fcsID); final userRow = Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded(flex: 2, child: consigneeBox), Flexible(child: senderBox) ], ); final continueBtn = ContinueButton( onTap: () { if (packages.isEmpty) { showMsgDialog(context, 'Error', "Please add the packages"); return false; } if (widget.onContinue != null) { widget.onContinue!(); } }, ); final previousBtn = PreviousButton(onTap: () { if (widget.onPrevious != null) { widget.onPrevious!(); } }); return Column( children: [ Expanded( child: Padding( padding: EdgeInsets.only(left: 10, right: 10), child: Column( children: [ AnimatedSwitcher( duration: const Duration(milliseconds: 300), transitionBuilder: (Widget child, Animation animation) => FadeTransition( opacity: animation, child: SizeTransition( sizeFactor: animation, axis: Axis.vertical, child: child, ), ), child: _down ? Column(children: [ const SizedBox(height: 8), userRow, LocalTitle( textKey: "box.select.package", topPadding: 5), const SizedBox(height: 10), ]) : const SizedBox(), ), Expanded( child: Padding( padding: const EdgeInsets.only(top: 10), child: PackageSelectionResult( controller: _scrollController, isLoadingMore: _isLoadMore, onLoadMore: _loadMoreData, onRefresh: () async { _init(); setState(() { _down = true; }); }, onTap: (a) { Navigator.push( context, CupertinoPageRoute( builder: (context) => PackageInfo(package: a)), ); }, ), ), ), ], ), ), ), widget.onContinue != null ? Padding( padding: const EdgeInsets.only(left: 15, right: 15, top: 10), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ previousBtn, continueBtn, ], ), ) : const SizedBox(), const SizedBox(height: 20) ], ); } }