import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../application/checkout/checkout_form/checkout_form_bloc.dart'; import '../../../common/extension/extension.dart'; import '../../../common/theme/theme.dart'; import '../../../domain/product/product.dart'; import '../dialog/dialog.dart'; import '../image/image.dart'; import '../spaces/space.dart'; class OrderMenu extends StatefulWidget { final ProductQuantity data; const OrderMenu({super.key, required this.data}); @override State createState() => _OrderMenuState(); } class _OrderMenuState extends State { final _controller = TextEditingController(); @override void initState() { super.initState(); _controller.text = widget.data.notes; _controller.addListener(() { context.read().add( CheckoutFormEvent.updateLineNotes( widget.data.lineId, _controller.text, ), ); }); } @override void dispose() { _controller.dispose(); super.dispose(); } void _removeLine() { context.read().add( CheckoutFormEvent.removeLine(widget.data.lineId), ); } /// Koreksi salah timbang: ubah angka pada baris yang sama, bukan menambah /// baris baru. void _editWeight() { final bloc = context.read(); showDialog( context: context, builder: (context) => WeightInputDialog( product: widget.data.product, variant: widget.data.variant, initialWeight: widget.data.weight, onSubmit: (weight) => bloc.add( CheckoutFormEvent.updateItemWeight(widget.data.lineId, weight), ), ), ); } @override Widget build(BuildContext context) { return Column( children: [ Row( children: [ Flexible( child: ListTile( contentPadding: EdgeInsets.zero, leading: ClipRRect( borderRadius: const BorderRadius.all(Radius.circular(8.0)), child: AppNetworkImage( url: widget.data.product.imageUrl, width: 50.0, height: 50.0, fit: BoxFit.cover, ), ), title: Row( children: [ Expanded( child: Text( widget.data.product.name, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( fontSize: 14, fontWeight: FontWeight.bold, ), ), ), ], ), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( widget.data.isWeighted && widget.data.product.unitLabel.isNotEmpty ? '${widget.data.unitPrice.currencyFormatRp} / ${widget.data.product.unitLabel}' : widget.data.unitPrice.currencyFormatRp, ), if (widget.data.variant != null) Text(widget.data.variant?.name ?? ""), ], ), ), ), if (widget.data.isWeighted) _buildWeightControl() else _buildQuantityStepper(), const SpaceWidth(8), SizedBox( width: 80.0, child: Text( widget.data.lineTotal.currencyFormatRp, textAlign: TextAlign.right, style: const TextStyle( color: AppColor.primary, fontWeight: FontWeight.bold, ), ), ), ], ), const SpaceHeight(8.0), SizedBox( height: 40, child: Row( children: [ Flexible( child: TextFormField( cursorColor: AppColor.primary, controller: _controller, style: const TextStyle(fontSize: 12, color: AppColor.black), decoration: const InputDecoration( hintText: 'Catatan Pesanan', ), ), ), const SpaceWidth(16.0), GestureDetector( onTap: _removeLine, child: Container( height: 40, width: 40, decoration: BoxDecoration( color: AppColor.primary, borderRadius: BorderRadius.circular(8.0), ), child: const Icon( Icons.delete_outline, color: AppColor.white, ), ), ), ], ), ), ], ); } /// Baris berbobot tidak punya stepper — nilainya bukan cacah, dan angka 1 /// yang tersimpan di `quantity` akan terbaca seperti "satu ons". Widget _buildWeightControl() { return GestureDetector( onTap: _editWeight, child: Container( padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), decoration: BoxDecoration( color: AppColor.primary.withOpacity(0.08), borderRadius: BorderRadius.circular(8.0), border: Border.all(color: AppColor.primary.withOpacity(0.4)), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Text( widget.data.quantityLabel, style: const TextStyle( fontWeight: FontWeight.bold, color: AppColor.primary, ), ), const SpaceWidth(4), const Icon(Icons.edit_outlined, size: 14, color: AppColor.primary), ], ), ), ); } Widget _buildQuantityStepper() { return Row( children: [ GestureDetector( onTap: () { context.read().add( CheckoutFormEvent.removeItem( widget.data.product, widget.data.variant, ), ); }, child: Container( width: 30, height: 30, color: AppColor.white, child: const Icon(Icons.remove_circle, color: AppColor.primary), ), ), SizedBox( width: 30.0, child: Center(child: Text(widget.data.quantity.toString())), ), GestureDetector( onTap: () { context.read().add( CheckoutFormEvent.addItem( widget.data.product, widget.data.variant, ), ); }, child: Container( width: 30, height: 30, color: AppColor.white, child: const Icon(Icons.add_circle, color: AppColor.primary), ), ), ], ); } }