From 34555dd789058bcb103abf23b589733a9573c1f3 Mon Sep 17 00:00:00 2001 From: efrilm Date: Mon, 27 Oct 2025 21:57:25 +0700 Subject: [PATCH] order load more --- .../pages/order/widgets/order_left_panel.dart | 126 +++++++++++------- 1 file changed, 79 insertions(+), 47 deletions(-) diff --git a/lib/presentation/pages/order/widgets/order_left_panel.dart b/lib/presentation/pages/order/widgets/order_left_panel.dart index e37ca87..654e008 100644 --- a/lib/presentation/pages/order/widgets/order_left_panel.dart +++ b/lib/presentation/pages/order/widgets/order_left_panel.dart @@ -8,64 +8,96 @@ import '../../../components/error/order_loader_error_state_widget.dart'; import '../../../components/loader/loader_with_text.dart'; import 'order_title.dart'; -class OrderLeftPanel extends StatelessWidget { +class OrderLeftPanel extends StatefulWidget { final String status; final OrderLoaderState state; const OrderLeftPanel({super.key, required this.state, required this.status}); + @override + State createState() => _OrderLeftPanelState(); +} + +class _OrderLeftPanelState extends State { + ScrollController scrollController = ScrollController(); @override Widget build(BuildContext context) { - return Column( - children: [ - OrderTitle( - startDate: state.startDate, - endDate: state.endDate, - title: status == 'pending' ? "Pending Pesanan" : "Daftar Pesanan", - onChanged: (value) { - Future.delayed(const Duration(milliseconds: 800), () { + return NotificationListener( + onNotification: (notification) { + if (notification is ScrollEndNotification && + scrollController.position.extentAfter == 0) { + context.read().add( + OrderLoaderEvent.fetched(status: widget.status), + ); + return true; + } + + return true; + }, + child: Column( + children: [ + OrderTitle( + startDate: widget.state.startDate, + endDate: widget.state.endDate, + title: widget.status == 'pending' + ? "Pending Pesanan" + : "Daftar Pesanan", + onChanged: (value) { + Future.delayed(const Duration(milliseconds: 800), () { + context.read().add( + OrderLoaderEvent.searchChange(value), + ); + }); + }, + onDateRangeChanged: (start, end) { context.read().add( - OrderLoaderEvent.searchChange(value), + OrderLoaderEvent.dateTimeRangeChange(start!, end!), ); - }); - }, - onDateRangeChanged: (start, end) { - context.read().add( - OrderLoaderEvent.dateTimeRangeChange(start!, end!), - ); - }, - ), - Expanded( - child: state.failureOption.fold(() { - if (state.isFetching) { - return Center(child: LoaderWithText()); - } + }, + ), + Expanded( + child: widget.state.failureOption.fold( + () { + if (widget.state.isFetching) { + return Center(child: LoaderWithText()); + } - if (state.orders.isEmpty) { - return Center( - child: Text( - "Belum ada transaksi saat ini. ", - style: AppStyle.lg.copyWith(fontWeight: FontWeight.bold), - ), - ); - } - - return ListView.builder( - itemCount: state.orders.length, - itemBuilder: (context, index) => GestureDetector( - onTap: () { - context.read().add( - OrderLoaderEvent.setSelectedOrder(state.orders[index]), + if (widget.state.orders.isEmpty) { + return Center( + child: Text( + "Belum ada transaksi saat ini. ", + style: AppStyle.lg.copyWith(fontWeight: FontWeight.bold), + ), ); - }, - child: OrderCard( - order: state.orders[index], - isActive: state.orders[index] == state.selectedOrder, - ), + } + + return ListView.builder( + itemCount: widget.state.orders.length, + controller: scrollController, + itemBuilder: (context, index) => GestureDetector( + onTap: () { + context.read().add( + OrderLoaderEvent.setSelectedOrder( + widget.state.orders[index], + ), + ); + }, + child: OrderCard( + order: widget.state.orders[index], + isActive: + widget.state.orders[index] == + widget.state.selectedOrder, + ), + ), + ); + }, + (f) => OrderLoaderErrorStateWidget( + failure: f, + status: widget.status, ), - ); - }, (f) => OrderLoaderErrorStateWidget(failure: f, status: status)), - ), - ], + ), + ), + ], + ), ); } }