feat: order infinty scroll

This commit is contained in:
efrilm
2025-08-06 15:46:22 +07:00
parent be803bbe4f
commit 7ee7db225c
7 changed files with 764 additions and 132 deletions
+99 -82
View File
@@ -29,6 +29,7 @@ class SalesPage extends StatefulWidget {
}
class _SalesPageState extends State<SalesPage> {
ScrollController scrollController = ScrollController();
DateTime startDate = DateTime.now();
DateTime endDate = DateTime.now();
Order? orderDetail;
@@ -65,69 +66,82 @@ class _SalesPageState extends State<SalesPage> {
children: [
Expanded(
flex: 2,
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;
});
child: NotificationListener<ScrollNotification>(
onNotification: (notification) {
if (notification is ScrollEndNotification &&
scrollController.position.extentAfter == 0) {
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.loadMore(widget.status,
dateFrom: startDate, dateTo: endDate));
return true;
}
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.getByStatus(widget.status,
dateFrom: startDate, dateTo: endDate));
},
),
Expanded(
child: BlocBuilder<OrderLoaderBloc, OrderLoaderState>(
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,
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<OrderLoaderBloc>().add(
OrderLoaderEvent.getByStatus(widget.status,
dateFrom: startDate, dateTo: endDate));
},
),
Expanded(
child: BlocBuilder<OrderLoaderBloc, OrderLoaderState>(
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) {
final filtered = _filterOrders(orders);
if (filtered.isEmpty) {
return Center(
child: Text(
"Belum ada transaksi saat ini. ",
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 SingleChildScrollView(
child: Column(
children: List.generate(
filtered.length,
(index) => GestureDetector(
);
} else {
return ListView.builder(
itemCount: filtered.length,
controller: scrollController,
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
setState(() {
orderDetail = filtered[index];
@@ -141,17 +155,17 @@ class _SalesPageState extends State<SalesPage> {
isActive:
orders[index] == orderDetail,
),
),
),
),
);
}
},
);
},
);
},
);
}
},
);
},
),
),
),
],
],
),
),
),
),
@@ -202,18 +216,6 @@ class _SalesPageState extends State<SalesPage> {
);
}),
SpaceWidth(8),
Button.outlined(
onPressed: () {
context.push(
PaymentPage(
order: orderDetail!,
),
);
},
label: 'Bayar',
icon: Icon(Icons.payment),
),
SpaceWidth(8),
Button.outlined(
onPressed: () {
context.push(
@@ -223,7 +225,22 @@ class _SalesPageState extends State<SalesPage> {
);
},
label: 'Split Bill',
icon: Icon(Icons.payment),
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')