import 'package:enaklo_pos/core/components/buttons.dart'; import 'package:enaklo_pos/core/components/spaces.dart'; import 'package:enaklo_pos/core/extensions/build_context_ext.dart'; import 'package:enaklo_pos/data/models/response/order_response_model.dart'; import 'package:enaklo_pos/presentation/home/bloc/order_form/order_form_bloc.dart'; import 'package:enaklo_pos/presentation/payment/pages/payment_page.dart'; import 'package:enaklo_pos/presentation/refund/pages/refund_page.dart'; import 'package:enaklo_pos/presentation/sales/blocs/order_loader/order_loader_bloc.dart'; import 'package:enaklo_pos/presentation/split_bill/pages/split_bill_page.dart'; import 'package:enaklo_pos/presentation/void/pages/void_page.dart'; import 'package:enaklo_pos/presentation/sales/widgets/sales_detail.dart'; import 'package:enaklo_pos/presentation/sales/widgets/sales_list_order.dart'; import 'package:enaklo_pos/presentation/sales/widgets/sales_order_information.dart'; import 'package:enaklo_pos/presentation/sales/widgets/sales_payment.dart'; import 'package:enaklo_pos/presentation/sales/widgets/sales_right_title.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../core/constants/colors.dart'; import '../widgets/sales_card.dart'; import '../widgets/sales_title.dart'; class SalesPage extends StatefulWidget { final String status; const SalesPage({super.key, required this.status}); @override State createState() => _SalesPageState(); } class _SalesPageState extends State { ScrollController scrollController = ScrollController(); DateTime startDate = DateTime.now(); DateTime endDate = DateTime.now(); Order? orderDetail; String searchQuery = ''; @override void initState() { context.read().add(OrderLoaderEvent.getByStatus( widget.status, dateFrom: startDate, dateTo: endDate)); super.initState(); } List _filterOrders(List orders) { if (searchQuery.isEmpty) { return orders; } return orders.where((order) { final customerName = order.orderNumber?.toLowerCase() ?? ""; final queryLower = searchQuery.toLowerCase(); return customerName.contains(queryLower); }).toList(); } @override Widget build(BuildContext context) { return SafeArea( child: Scaffold( backgroundColor: AppColors.background, body: Row( children: [ Expanded( flex: 2, child: NotificationListener( onNotification: (notification) { if (notification is ScrollEndNotification && scrollController.position.extentAfter == 0) { context.read().add( OrderLoaderEvent.loadMore(widget.status, dateFrom: startDate, dateTo: endDate)); return true; } return true; }, child: Material( color: AppColors.white, child: Column( children: [ SalesTitle( title: widget.status == 'pending' ? "Pending Pesanan" : "Daftar Pesanan", startDate: startDate, endDate: endDate, onChanged: (value) { setState(() { searchQuery = value; }); }, onDateRangeChanged: (start, end) { setState(() { startDate = start; endDate = end; }); context.read().add( OrderLoaderEvent.getByStatus(widget.status, dateFrom: startDate, dateTo: endDate)); }, ), Expanded( child: BlocBuilder( builder: (context, state) { return state.maybeWhen( orElse: () => const Center( child: CircularProgressIndicator(), ), loading: () => const Center( child: CircularProgressIndicator(), ), error: (message) => Center( child: Text( message, style: TextStyle( fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ), loaded: (orders, totalOrder, hasReachedMax, currentPage, isLoadingMore) { final filtered = _filterOrders(orders); if (filtered.isEmpty) { return Center( child: Text( "Belum ada transaksi saat ini. ", style: TextStyle( fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ); } else { return ListView.builder( itemCount: filtered.length, controller: scrollController, itemBuilder: (context, index) { return GestureDetector( onTap: () { setState(() { orderDetail = filtered[index]; }); context.read().add( OrderFormEvent.started( filtered[index])); }, child: SalesCard( order: orders[index], isActive: orders[index] == orderDetail, ), ); }, ); } }, ); }, ), ), ], ), ), ), ), Expanded( flex: 4, child: orderDetail == null ? Center( child: Text( "Belum ada order yang dipilih.", style: TextStyle( fontSize: 16.0, fontWeight: FontWeight.bold, ), ), ) : Column( children: [ SalesRightTitle( order: orderDetail, actionWidget: [ if (widget.status == 'pending') ...[ BlocBuilder( builder: (context, state) { return state.maybeWhen( orElse: () => Button.outlined( onPressed: () {}, label: 'Void', icon: Icon(Icons.undo), ), loaded: (order, selectedItems, totalVoidOrRefund, isAllSelected) => Button.outlined( onPressed: () { context.push(VoidPage( selectedOrder: order, )); // showDialog( // context: context, // builder: (context) => VoidDialog( // order: orderDetail!, // selectedItems: selectedItems, // ), // ); }, label: 'Void', icon: Icon(Icons.undo), ), ); }), SpaceWidth(8), Button.outlined( onPressed: () { context.push( SplitBillPage( order: orderDetail!, ), ); }, label: 'Split Bill', icon: Icon( Icons.calculate_outlined, ), ), SpaceWidth(8), Button.filled( width: 120, onPressed: () { context.push( PaymentPage( order: orderDetail!, ), ); }, label: 'Bayar', icon: Icon(Icons.payment, color: Colors.white), ), ], if (widget.status == 'completed') Button.outlined( onPressed: () { context.push(RefundPage( selectedOrder: orderDetail!, )); }, label: 'Refund', icon: Icon(Icons.autorenew), ), ], ), Expanded( child: SingleChildScrollView( padding: const EdgeInsets.all(16.0), child: Column( children: [ Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: SalesOrderInformation( order: orderDetail, ), ), SpaceWidth(16), Expanded( child: SalesDetail( order: orderDetail, ), ), ], ), SalesListOrder( order: orderDetail, ), SalesPayment( order: orderDetail, ), ], ), ), ) ], ), ), ], ), ), ); } }