This commit is contained in:
Phuoc Nguyen
2025-10-27 09:33:00 +07:00
parent 380ad60ee5
commit 830ef7e2a2
7 changed files with 1408 additions and 1 deletions

View File

@@ -0,0 +1,154 @@
/// Providers: Orders
///
/// Riverpod providers for managing orders state.
library;
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:worker/core/database/models/enums.dart';
import 'package:worker/features/orders/data/datasources/orders_local_datasource.dart';
import 'package:worker/features/orders/data/models/order_model.dart';
part 'orders_provider.g.dart';
/// Orders Local Data Source Provider
@riverpod
OrdersLocalDataSource ordersLocalDataSource(Ref ref) {
return OrdersLocalDataSource();
}
/// Orders Provider
///
/// Provides list of all orders from local data source.
@riverpod
class Orders extends _$Orders {
@override
Future<List<OrderModel>> build() async {
return await ref.read(ordersLocalDataSourceProvider).getAllOrders();
}
/// Refresh orders
Future<void> refresh() async {
state = const AsyncValue.loading();
state = await AsyncValue.guard(() async {
return await ref.read(ordersLocalDataSourceProvider).getAllOrders();
});
}
}
/// Selected Order Status Provider
///
/// Tracks the currently selected order status filter.
/// null means "All" orders.
@riverpod
class SelectedOrderStatus extends _$SelectedOrderStatus {
@override
OrderStatus? build() {
return null; // Default: show all orders
}
/// Select a status filter
void selectStatus(OrderStatus? status) {
state = status;
}
/// Clear selection (show all)
void clearSelection() {
state = null;
}
}
/// Order Search Query Provider
///
/// Tracks the current search query for order numbers.
@riverpod
class OrderSearchQuery extends _$OrderSearchQuery {
@override
String build() {
return '';
}
/// Update search query
void updateQuery(String query) {
state = query;
}
/// Clear search query
void clearQuery() {
state = '';
}
}
/// Filtered Orders Provider
///
/// Filters orders by selected status and search query.
@riverpod
Future<List<OrderModel>> filteredOrders(Ref ref) async {
final ordersAsync = ref.watch(ordersProvider);
final selectedStatus = ref.watch(selectedOrderStatusProvider);
final searchQuery = ref.watch(orderSearchQueryProvider);
return ordersAsync.when(
data: (orders) {
var filtered = orders;
// Filter by status
if (selectedStatus != null) {
filtered = filtered
.where((order) => order.status == selectedStatus)
.toList();
}
// Filter by search query
if (searchQuery.isNotEmpty) {
filtered = filtered
.where(
(order) => order.orderNumber
.toLowerCase()
.contains(searchQuery.toLowerCase()),
)
.toList();
}
// Sort by creation date (newest first)
filtered.sort((a, b) => b.createdAt.compareTo(a.createdAt));
return filtered;
},
loading: () => [],
error: (error, stack) => [],
);
}
/// Orders Count by Status Provider
///
/// Returns count of orders for each status.
@riverpod
Future<Map<OrderStatus, int>> ordersCountByStatus(Ref ref) async {
final ordersAsync = ref.watch(ordersProvider);
return ordersAsync.when(
data: (orders) {
final counts = <OrderStatus, int>{};
for (final status in OrderStatus.values) {
counts[status] = orders.where((order) => order.status == status).length;
}
return counts;
},
loading: () => {},
error: (error, stack) => {},
);
}
/// Total Orders Count Provider
@riverpod
Future<int> totalOrdersCount(Ref ref) async {
final ordersAsync = ref.watch(ordersProvider);
return ordersAsync.when(
data: (orders) => orders.length,
loading: () => 0,
error: (error, stack) => 0,
);
}

View File

@@ -0,0 +1,402 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'orders_provider.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
/// Orders Local Data Source Provider
@ProviderFor(ordersLocalDataSource)
const ordersLocalDataSourceProvider = OrdersLocalDataSourceProvider._();
/// Orders Local Data Source Provider
final class OrdersLocalDataSourceProvider
extends
$FunctionalProvider<
OrdersLocalDataSource,
OrdersLocalDataSource,
OrdersLocalDataSource
>
with $Provider<OrdersLocalDataSource> {
/// Orders Local Data Source Provider
const OrdersLocalDataSourceProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'ordersLocalDataSourceProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$ordersLocalDataSourceHash();
@$internal
@override
$ProviderElement<OrdersLocalDataSource> $createElement(
$ProviderPointer pointer,
) => $ProviderElement(pointer);
@override
OrdersLocalDataSource create(Ref ref) {
return ordersLocalDataSource(ref);
}
/// {@macro riverpod.override_with_value}
Override overrideWithValue(OrdersLocalDataSource value) {
return $ProviderOverride(
origin: this,
providerOverride: $SyncValueProvider<OrdersLocalDataSource>(value),
);
}
}
String _$ordersLocalDataSourceHash() =>
r'5fb1c0b212ea6874bd42ae1f5b3f9f1db7197d7b';
/// Orders Provider
///
/// Provides list of all orders from local data source.
@ProviderFor(Orders)
const ordersProvider = OrdersProvider._();
/// Orders Provider
///
/// Provides list of all orders from local data source.
final class OrdersProvider
extends $AsyncNotifierProvider<Orders, List<OrderModel>> {
/// Orders Provider
///
/// Provides list of all orders from local data source.
const OrdersProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'ordersProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$ordersHash();
@$internal
@override
Orders create() => Orders();
}
String _$ordersHash() => r'7d2ae33e528260172495e8360f6879cb6e089766';
/// Orders Provider
///
/// Provides list of all orders from local data source.
abstract class _$Orders extends $AsyncNotifier<List<OrderModel>> {
FutureOr<List<OrderModel>> build();
@$mustCallSuper
@override
void runBuild() {
final created = build();
final ref =
this.ref as $Ref<AsyncValue<List<OrderModel>>, List<OrderModel>>;
final element =
ref.element
as $ClassProviderElement<
AnyNotifier<AsyncValue<List<OrderModel>>, List<OrderModel>>,
AsyncValue<List<OrderModel>>,
Object?,
Object?
>;
element.handleValue(ref, created);
}
}
/// Selected Order Status Provider
///
/// Tracks the currently selected order status filter.
/// null means "All" orders.
@ProviderFor(SelectedOrderStatus)
const selectedOrderStatusProvider = SelectedOrderStatusProvider._();
/// Selected Order Status Provider
///
/// Tracks the currently selected order status filter.
/// null means "All" orders.
final class SelectedOrderStatusProvider
extends $NotifierProvider<SelectedOrderStatus, OrderStatus?> {
/// Selected Order Status Provider
///
/// Tracks the currently selected order status filter.
/// null means "All" orders.
const SelectedOrderStatusProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'selectedOrderStatusProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$selectedOrderStatusHash();
@$internal
@override
SelectedOrderStatus create() => SelectedOrderStatus();
/// {@macro riverpod.override_with_value}
Override overrideWithValue(OrderStatus? value) {
return $ProviderOverride(
origin: this,
providerOverride: $SyncValueProvider<OrderStatus?>(value),
);
}
}
String _$selectedOrderStatusHash() =>
r'51834a8660a7f792e4075f76354e8a23a4fe9d7c';
/// Selected Order Status Provider
///
/// Tracks the currently selected order status filter.
/// null means "All" orders.
abstract class _$SelectedOrderStatus extends $Notifier<OrderStatus?> {
OrderStatus? build();
@$mustCallSuper
@override
void runBuild() {
final created = build();
final ref = this.ref as $Ref<OrderStatus?, OrderStatus?>;
final element =
ref.element
as $ClassProviderElement<
AnyNotifier<OrderStatus?, OrderStatus?>,
OrderStatus?,
Object?,
Object?
>;
element.handleValue(ref, created);
}
}
/// Order Search Query Provider
///
/// Tracks the current search query for order numbers.
@ProviderFor(OrderSearchQuery)
const orderSearchQueryProvider = OrderSearchQueryProvider._();
/// Order Search Query Provider
///
/// Tracks the current search query for order numbers.
final class OrderSearchQueryProvider
extends $NotifierProvider<OrderSearchQuery, String> {
/// Order Search Query Provider
///
/// Tracks the current search query for order numbers.
const OrderSearchQueryProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'orderSearchQueryProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$orderSearchQueryHash();
@$internal
@override
OrderSearchQuery create() => OrderSearchQuery();
/// {@macro riverpod.override_with_value}
Override overrideWithValue(String value) {
return $ProviderOverride(
origin: this,
providerOverride: $SyncValueProvider<String>(value),
);
}
}
String _$orderSearchQueryHash() => r'4f60c2a1ac8c0ce515bc807781fa3813e9934482';
/// Order Search Query Provider
///
/// Tracks the current search query for order numbers.
abstract class _$OrderSearchQuery extends $Notifier<String> {
String build();
@$mustCallSuper
@override
void runBuild() {
final created = build();
final ref = this.ref as $Ref<String, String>;
final element =
ref.element
as $ClassProviderElement<
AnyNotifier<String, String>,
String,
Object?,
Object?
>;
element.handleValue(ref, created);
}
}
/// Filtered Orders Provider
///
/// Filters orders by selected status and search query.
@ProviderFor(filteredOrders)
const filteredOrdersProvider = FilteredOrdersProvider._();
/// Filtered Orders Provider
///
/// Filters orders by selected status and search query.
final class FilteredOrdersProvider
extends
$FunctionalProvider<
AsyncValue<List<OrderModel>>,
List<OrderModel>,
FutureOr<List<OrderModel>>
>
with $FutureModifier<List<OrderModel>>, $FutureProvider<List<OrderModel>> {
/// Filtered Orders Provider
///
/// Filters orders by selected status and search query.
const FilteredOrdersProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'filteredOrdersProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$filteredOrdersHash();
@$internal
@override
$FutureProviderElement<List<OrderModel>> $createElement(
$ProviderPointer pointer,
) => $FutureProviderElement(pointer);
@override
FutureOr<List<OrderModel>> create(Ref ref) {
return filteredOrders(ref);
}
}
String _$filteredOrdersHash() => r'3bef3cc2b8c98297510134d10ceb5ef1618cc3a8';
/// Orders Count by Status Provider
///
/// Returns count of orders for each status.
@ProviderFor(ordersCountByStatus)
const ordersCountByStatusProvider = OrdersCountByStatusProvider._();
/// Orders Count by Status Provider
///
/// Returns count of orders for each status.
final class OrdersCountByStatusProvider
extends
$FunctionalProvider<
AsyncValue<Map<OrderStatus, int>>,
Map<OrderStatus, int>,
FutureOr<Map<OrderStatus, int>>
>
with
$FutureModifier<Map<OrderStatus, int>>,
$FutureProvider<Map<OrderStatus, int>> {
/// Orders Count by Status Provider
///
/// Returns count of orders for each status.
const OrdersCountByStatusProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'ordersCountByStatusProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$ordersCountByStatusHash();
@$internal
@override
$FutureProviderElement<Map<OrderStatus, int>> $createElement(
$ProviderPointer pointer,
) => $FutureProviderElement(pointer);
@override
FutureOr<Map<OrderStatus, int>> create(Ref ref) {
return ordersCountByStatus(ref);
}
}
String _$ordersCountByStatusHash() =>
r'3a656b9c70510f34702a636b9bda5a7b7660e6ff';
/// Total Orders Count Provider
@ProviderFor(totalOrdersCount)
const totalOrdersCountProvider = TotalOrdersCountProvider._();
/// Total Orders Count Provider
final class TotalOrdersCountProvider
extends $FunctionalProvider<AsyncValue<int>, int, FutureOr<int>>
with $FutureModifier<int>, $FutureProvider<int> {
/// Total Orders Count Provider
const TotalOrdersCountProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'totalOrdersCountProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$totalOrdersCountHash();
@$internal
@override
$FutureProviderElement<int> $createElement($ProviderPointer pointer) =>
$FutureProviderElement(pointer);
@override
FutureOr<int> create(Ref ref) {
return totalOrdersCount(ref);
}
}
String _$totalOrdersCountHash() => r'71f2e2f890b4e3d5a5beaa7bf06a0d78faf039cb';