feat: order range date filter

This commit is contained in:
efrilm 2025-08-19 11:42:26 +07:00
parent 590bb3329c
commit 5b91b5978f
9 changed files with 446 additions and 110 deletions

View File

@ -21,6 +21,9 @@ class OrderLoaderBloc extends Bloc<OrderLoaderEvent, OrderLoaderState> {
Emitter<OrderLoaderState> emit, Emitter<OrderLoaderState> emit,
) { ) {
return event.map( return event.map(
rangeDateChanged: (e) async {
emit(state.copyWith(dateFrom: e.dateFrom, dateTo: e.dateTo));
},
statusChanged: (e) async { statusChanged: (e) async {
emit(state.copyWith(status: e.status)); emit(state.copyWith(status: e.status));
}, },
@ -63,9 +66,11 @@ class OrderLoaderBloc extends Bloc<OrderLoaderEvent, OrderLoaderState> {
} }
final failureOrOrder = await _repository.get( final failureOrOrder = await _repository.get(
status: state.status, status: state.status == 'all' ? null : state.status,
page: state.page, page: state.page,
search: state.search, search: state.search,
dateFrom: state.dateFrom,
dateTo: state.dateTo,
); );
state = failureOrOrder.fold( state = failureOrOrder.fold(

View File

@ -19,18 +19,22 @@ final _privateConstructorUsedError = UnsupportedError(
mixin _$OrderLoaderEvent { mixin _$OrderLoaderEvent {
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(DateTime dateFrom, DateTime dateTo)
rangeDateChanged,
required TResult Function(String status) statusChanged, required TResult Function(String status) statusChanged,
required TResult Function(String search) searchChanged, required TResult Function(String search) searchChanged,
required TResult Function(bool isRefresh) fetched, required TResult Function(bool isRefresh) fetched,
}) => throw _privateConstructorUsedError; }) => throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult? Function(String status)? statusChanged, TResult? Function(String status)? statusChanged,
TResult? Function(String search)? searchChanged, TResult? Function(String search)? searchChanged,
TResult? Function(bool isRefresh)? fetched, TResult? Function(bool isRefresh)? fetched,
}) => throw _privateConstructorUsedError; }) => throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult Function(String status)? statusChanged, TResult Function(String status)? statusChanged,
TResult Function(String search)? searchChanged, TResult Function(String search)? searchChanged,
TResult Function(bool isRefresh)? fetched, TResult Function(bool isRefresh)? fetched,
@ -38,18 +42,21 @@ mixin _$OrderLoaderEvent {
}) => throw _privateConstructorUsedError; }) => throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult map<TResult extends Object?>({ TResult map<TResult extends Object?>({
required TResult Function(_RangeDateChanged value) rangeDateChanged,
required TResult Function(_StatusChanged value) statusChanged, required TResult Function(_StatusChanged value) statusChanged,
required TResult Function(_SearchChanged value) searchChanged, required TResult Function(_SearchChanged value) searchChanged,
required TResult Function(_Fetched value) fetched, required TResult Function(_Fetched value) fetched,
}) => throw _privateConstructorUsedError; }) => throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({ TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_RangeDateChanged value)? rangeDateChanged,
TResult? Function(_StatusChanged value)? statusChanged, TResult? Function(_StatusChanged value)? statusChanged,
TResult? Function(_SearchChanged value)? searchChanged, TResult? Function(_SearchChanged value)? searchChanged,
TResult? Function(_Fetched value)? fetched, TResult? Function(_Fetched value)? fetched,
}) => throw _privateConstructorUsedError; }) => throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult maybeMap<TResult extends Object?>({ TResult maybeMap<TResult extends Object?>({
TResult Function(_RangeDateChanged value)? rangeDateChanged,
TResult Function(_StatusChanged value)? statusChanged, TResult Function(_StatusChanged value)? statusChanged,
TResult Function(_SearchChanged value)? searchChanged, TResult Function(_SearchChanged value)? searchChanged,
TResult Function(_Fetched value)? fetched, TResult Function(_Fetched value)? fetched,
@ -79,6 +86,176 @@ class _$OrderLoaderEventCopyWithImpl<$Res, $Val extends OrderLoaderEvent>
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
} }
/// @nodoc
abstract class _$$RangeDateChangedImplCopyWith<$Res> {
factory _$$RangeDateChangedImplCopyWith(
_$RangeDateChangedImpl value,
$Res Function(_$RangeDateChangedImpl) then,
) = __$$RangeDateChangedImplCopyWithImpl<$Res>;
@useResult
$Res call({DateTime dateFrom, DateTime dateTo});
}
/// @nodoc
class __$$RangeDateChangedImplCopyWithImpl<$Res>
extends _$OrderLoaderEventCopyWithImpl<$Res, _$RangeDateChangedImpl>
implements _$$RangeDateChangedImplCopyWith<$Res> {
__$$RangeDateChangedImplCopyWithImpl(
_$RangeDateChangedImpl _value,
$Res Function(_$RangeDateChangedImpl) _then,
) : super(_value, _then);
/// Create a copy of OrderLoaderEvent
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({Object? dateFrom = null, Object? dateTo = null}) {
return _then(
_$RangeDateChangedImpl(
null == dateFrom
? _value.dateFrom
: dateFrom // ignore: cast_nullable_to_non_nullable
as DateTime,
null == dateTo
? _value.dateTo
: dateTo // ignore: cast_nullable_to_non_nullable
as DateTime,
),
);
}
}
/// @nodoc
class _$RangeDateChangedImpl implements _RangeDateChanged {
const _$RangeDateChangedImpl(this.dateFrom, this.dateTo);
@override
final DateTime dateFrom;
@override
final DateTime dateTo;
@override
String toString() {
return 'OrderLoaderEvent.rangeDateChanged(dateFrom: $dateFrom, dateTo: $dateTo)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$RangeDateChangedImpl &&
(identical(other.dateFrom, dateFrom) ||
other.dateFrom == dateFrom) &&
(identical(other.dateTo, dateTo) || other.dateTo == dateTo));
}
@override
int get hashCode => Object.hash(runtimeType, dateFrom, dateTo);
/// Create a copy of OrderLoaderEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$RangeDateChangedImplCopyWith<_$RangeDateChangedImpl> get copyWith =>
__$$RangeDateChangedImplCopyWithImpl<_$RangeDateChangedImpl>(
this,
_$identity,
);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function(DateTime dateFrom, DateTime dateTo)
rangeDateChanged,
required TResult Function(String status) statusChanged,
required TResult Function(String search) searchChanged,
required TResult Function(bool isRefresh) fetched,
}) {
return rangeDateChanged(dateFrom, dateTo);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult? Function(String status)? statusChanged,
TResult? Function(String search)? searchChanged,
TResult? Function(bool isRefresh)? fetched,
}) {
return rangeDateChanged?.call(dateFrom, dateTo);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult Function(String status)? statusChanged,
TResult Function(String search)? searchChanged,
TResult Function(bool isRefresh)? fetched,
required TResult orElse(),
}) {
if (rangeDateChanged != null) {
return rangeDateChanged(dateFrom, dateTo);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_RangeDateChanged value) rangeDateChanged,
required TResult Function(_StatusChanged value) statusChanged,
required TResult Function(_SearchChanged value) searchChanged,
required TResult Function(_Fetched value) fetched,
}) {
return rangeDateChanged(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_RangeDateChanged value)? rangeDateChanged,
TResult? Function(_StatusChanged value)? statusChanged,
TResult? Function(_SearchChanged value)? searchChanged,
TResult? Function(_Fetched value)? fetched,
}) {
return rangeDateChanged?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_RangeDateChanged value)? rangeDateChanged,
TResult Function(_StatusChanged value)? statusChanged,
TResult Function(_SearchChanged value)? searchChanged,
TResult Function(_Fetched value)? fetched,
required TResult orElse(),
}) {
if (rangeDateChanged != null) {
return rangeDateChanged(this);
}
return orElse();
}
}
abstract class _RangeDateChanged implements OrderLoaderEvent {
const factory _RangeDateChanged(
final DateTime dateFrom,
final DateTime dateTo,
) = _$RangeDateChangedImpl;
DateTime get dateFrom;
DateTime get dateTo;
/// Create a copy of OrderLoaderEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
_$$RangeDateChangedImplCopyWith<_$RangeDateChangedImpl> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc /// @nodoc
abstract class _$$StatusChangedImplCopyWith<$Res> { abstract class _$$StatusChangedImplCopyWith<$Res> {
factory _$$StatusChangedImplCopyWith( factory _$$StatusChangedImplCopyWith(
@ -149,6 +326,8 @@ class _$StatusChangedImpl implements _StatusChanged {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(DateTime dateFrom, DateTime dateTo)
rangeDateChanged,
required TResult Function(String status) statusChanged, required TResult Function(String status) statusChanged,
required TResult Function(String search) searchChanged, required TResult Function(String search) searchChanged,
required TResult Function(bool isRefresh) fetched, required TResult Function(bool isRefresh) fetched,
@ -159,6 +338,7 @@ class _$StatusChangedImpl implements _StatusChanged {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult? Function(String status)? statusChanged, TResult? Function(String status)? statusChanged,
TResult? Function(String search)? searchChanged, TResult? Function(String search)? searchChanged,
TResult? Function(bool isRefresh)? fetched, TResult? Function(bool isRefresh)? fetched,
@ -169,6 +349,7 @@ class _$StatusChangedImpl implements _StatusChanged {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult Function(String status)? statusChanged, TResult Function(String status)? statusChanged,
TResult Function(String search)? searchChanged, TResult Function(String search)? searchChanged,
TResult Function(bool isRefresh)? fetched, TResult Function(bool isRefresh)? fetched,
@ -183,6 +364,7 @@ class _$StatusChangedImpl implements _StatusChanged {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult map<TResult extends Object?>({ TResult map<TResult extends Object?>({
required TResult Function(_RangeDateChanged value) rangeDateChanged,
required TResult Function(_StatusChanged value) statusChanged, required TResult Function(_StatusChanged value) statusChanged,
required TResult Function(_SearchChanged value) searchChanged, required TResult Function(_SearchChanged value) searchChanged,
required TResult Function(_Fetched value) fetched, required TResult Function(_Fetched value) fetched,
@ -193,6 +375,7 @@ class _$StatusChangedImpl implements _StatusChanged {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({ TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_RangeDateChanged value)? rangeDateChanged,
TResult? Function(_StatusChanged value)? statusChanged, TResult? Function(_StatusChanged value)? statusChanged,
TResult? Function(_SearchChanged value)? searchChanged, TResult? Function(_SearchChanged value)? searchChanged,
TResult? Function(_Fetched value)? fetched, TResult? Function(_Fetched value)? fetched,
@ -203,6 +386,7 @@ class _$StatusChangedImpl implements _StatusChanged {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeMap<TResult extends Object?>({ TResult maybeMap<TResult extends Object?>({
TResult Function(_RangeDateChanged value)? rangeDateChanged,
TResult Function(_StatusChanged value)? statusChanged, TResult Function(_StatusChanged value)? statusChanged,
TResult Function(_SearchChanged value)? searchChanged, TResult Function(_SearchChanged value)? searchChanged,
TResult Function(_Fetched value)? fetched, TResult Function(_Fetched value)? fetched,
@ -297,6 +481,8 @@ class _$SearchChangedImpl implements _SearchChanged {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(DateTime dateFrom, DateTime dateTo)
rangeDateChanged,
required TResult Function(String status) statusChanged, required TResult Function(String status) statusChanged,
required TResult Function(String search) searchChanged, required TResult Function(String search) searchChanged,
required TResult Function(bool isRefresh) fetched, required TResult Function(bool isRefresh) fetched,
@ -307,6 +493,7 @@ class _$SearchChangedImpl implements _SearchChanged {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult? Function(String status)? statusChanged, TResult? Function(String status)? statusChanged,
TResult? Function(String search)? searchChanged, TResult? Function(String search)? searchChanged,
TResult? Function(bool isRefresh)? fetched, TResult? Function(bool isRefresh)? fetched,
@ -317,6 +504,7 @@ class _$SearchChangedImpl implements _SearchChanged {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult Function(String status)? statusChanged, TResult Function(String status)? statusChanged,
TResult Function(String search)? searchChanged, TResult Function(String search)? searchChanged,
TResult Function(bool isRefresh)? fetched, TResult Function(bool isRefresh)? fetched,
@ -331,6 +519,7 @@ class _$SearchChangedImpl implements _SearchChanged {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult map<TResult extends Object?>({ TResult map<TResult extends Object?>({
required TResult Function(_RangeDateChanged value) rangeDateChanged,
required TResult Function(_StatusChanged value) statusChanged, required TResult Function(_StatusChanged value) statusChanged,
required TResult Function(_SearchChanged value) searchChanged, required TResult Function(_SearchChanged value) searchChanged,
required TResult Function(_Fetched value) fetched, required TResult Function(_Fetched value) fetched,
@ -341,6 +530,7 @@ class _$SearchChangedImpl implements _SearchChanged {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({ TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_RangeDateChanged value)? rangeDateChanged,
TResult? Function(_StatusChanged value)? statusChanged, TResult? Function(_StatusChanged value)? statusChanged,
TResult? Function(_SearchChanged value)? searchChanged, TResult? Function(_SearchChanged value)? searchChanged,
TResult? Function(_Fetched value)? fetched, TResult? Function(_Fetched value)? fetched,
@ -351,6 +541,7 @@ class _$SearchChangedImpl implements _SearchChanged {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeMap<TResult extends Object?>({ TResult maybeMap<TResult extends Object?>({
TResult Function(_RangeDateChanged value)? rangeDateChanged,
TResult Function(_StatusChanged value)? statusChanged, TResult Function(_StatusChanged value)? statusChanged,
TResult Function(_SearchChanged value)? searchChanged, TResult Function(_SearchChanged value)? searchChanged,
TResult Function(_Fetched value)? fetched, TResult Function(_Fetched value)? fetched,
@ -447,6 +638,8 @@ class _$FetchedImpl implements _Fetched {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(DateTime dateFrom, DateTime dateTo)
rangeDateChanged,
required TResult Function(String status) statusChanged, required TResult Function(String status) statusChanged,
required TResult Function(String search) searchChanged, required TResult Function(String search) searchChanged,
required TResult Function(bool isRefresh) fetched, required TResult Function(bool isRefresh) fetched,
@ -457,6 +650,7 @@ class _$FetchedImpl implements _Fetched {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult? Function(String status)? statusChanged, TResult? Function(String status)? statusChanged,
TResult? Function(String search)? searchChanged, TResult? Function(String search)? searchChanged,
TResult? Function(bool isRefresh)? fetched, TResult? Function(bool isRefresh)? fetched,
@ -467,6 +661,7 @@ class _$FetchedImpl implements _Fetched {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult Function(String status)? statusChanged, TResult Function(String status)? statusChanged,
TResult Function(String search)? searchChanged, TResult Function(String search)? searchChanged,
TResult Function(bool isRefresh)? fetched, TResult Function(bool isRefresh)? fetched,
@ -481,6 +676,7 @@ class _$FetchedImpl implements _Fetched {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult map<TResult extends Object?>({ TResult map<TResult extends Object?>({
required TResult Function(_RangeDateChanged value) rangeDateChanged,
required TResult Function(_StatusChanged value) statusChanged, required TResult Function(_StatusChanged value) statusChanged,
required TResult Function(_SearchChanged value) searchChanged, required TResult Function(_SearchChanged value) searchChanged,
required TResult Function(_Fetched value) fetched, required TResult Function(_Fetched value) fetched,
@ -491,6 +687,7 @@ class _$FetchedImpl implements _Fetched {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({ TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_RangeDateChanged value)? rangeDateChanged,
TResult? Function(_StatusChanged value)? statusChanged, TResult? Function(_StatusChanged value)? statusChanged,
TResult? Function(_SearchChanged value)? searchChanged, TResult? Function(_SearchChanged value)? searchChanged,
TResult? Function(_Fetched value)? fetched, TResult? Function(_Fetched value)? fetched,
@ -501,6 +698,7 @@ class _$FetchedImpl implements _Fetched {
@override @override
@optionalTypeArgs @optionalTypeArgs
TResult maybeMap<TResult extends Object?>({ TResult maybeMap<TResult extends Object?>({
TResult Function(_RangeDateChanged value)? rangeDateChanged,
TResult Function(_StatusChanged value)? statusChanged, TResult Function(_StatusChanged value)? statusChanged,
TResult Function(_SearchChanged value)? searchChanged, TResult Function(_SearchChanged value)? searchChanged,
TResult Function(_Fetched value)? fetched, TResult Function(_Fetched value)? fetched,
@ -530,11 +728,13 @@ mixin _$OrderLoaderState {
List<Order> get orders => throw _privateConstructorUsedError; List<Order> get orders => throw _privateConstructorUsedError;
Option<OrderFailure> get failureOptionOrder => Option<OrderFailure> get failureOptionOrder =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
String? get status => throw _privateConstructorUsedError; String get status => throw _privateConstructorUsedError;
String? get search => throw _privateConstructorUsedError; String? get search => throw _privateConstructorUsedError;
bool get isFetching => throw _privateConstructorUsedError; bool get isFetching => throw _privateConstructorUsedError;
bool get hasReachedMax => throw _privateConstructorUsedError; bool get hasReachedMax => throw _privateConstructorUsedError;
int get page => throw _privateConstructorUsedError; int get page => throw _privateConstructorUsedError;
DateTime get dateFrom => throw _privateConstructorUsedError;
DateTime get dateTo => throw _privateConstructorUsedError;
/// Create a copy of OrderLoaderState /// Create a copy of OrderLoaderState
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@ -553,11 +753,13 @@ abstract class $OrderLoaderStateCopyWith<$Res> {
$Res call({ $Res call({
List<Order> orders, List<Order> orders,
Option<OrderFailure> failureOptionOrder, Option<OrderFailure> failureOptionOrder,
String? status, String status,
String? search, String? search,
bool isFetching, bool isFetching,
bool hasReachedMax, bool hasReachedMax,
int page, int page,
DateTime dateFrom,
DateTime dateTo,
}); });
} }
@ -578,11 +780,13 @@ class _$OrderLoaderStateCopyWithImpl<$Res, $Val extends OrderLoaderState>
$Res call({ $Res call({
Object? orders = null, Object? orders = null,
Object? failureOptionOrder = null, Object? failureOptionOrder = null,
Object? status = freezed, Object? status = null,
Object? search = freezed, Object? search = freezed,
Object? isFetching = null, Object? isFetching = null,
Object? hasReachedMax = null, Object? hasReachedMax = null,
Object? page = null, Object? page = null,
Object? dateFrom = null,
Object? dateTo = null,
}) { }) {
return _then( return _then(
_value.copyWith( _value.copyWith(
@ -594,10 +798,10 @@ class _$OrderLoaderStateCopyWithImpl<$Res, $Val extends OrderLoaderState>
? _value.failureOptionOrder ? _value.failureOptionOrder
: failureOptionOrder // ignore: cast_nullable_to_non_nullable : failureOptionOrder // ignore: cast_nullable_to_non_nullable
as Option<OrderFailure>, as Option<OrderFailure>,
status: freezed == status status: null == status
? _value.status ? _value.status
: status // ignore: cast_nullable_to_non_nullable : status // ignore: cast_nullable_to_non_nullable
as String?, as String,
search: freezed == search search: freezed == search
? _value.search ? _value.search
: search // ignore: cast_nullable_to_non_nullable : search // ignore: cast_nullable_to_non_nullable
@ -614,6 +818,14 @@ class _$OrderLoaderStateCopyWithImpl<$Res, $Val extends OrderLoaderState>
? _value.page ? _value.page
: page // ignore: cast_nullable_to_non_nullable : page // ignore: cast_nullable_to_non_nullable
as int, as int,
dateFrom: null == dateFrom
? _value.dateFrom
: dateFrom // ignore: cast_nullable_to_non_nullable
as DateTime,
dateTo: null == dateTo
? _value.dateTo
: dateTo // ignore: cast_nullable_to_non_nullable
as DateTime,
) )
as $Val, as $Val,
); );
@ -632,11 +844,13 @@ abstract class _$$OrderLoaderStateImplCopyWith<$Res>
$Res call({ $Res call({
List<Order> orders, List<Order> orders,
Option<OrderFailure> failureOptionOrder, Option<OrderFailure> failureOptionOrder,
String? status, String status,
String? search, String? search,
bool isFetching, bool isFetching,
bool hasReachedMax, bool hasReachedMax,
int page, int page,
DateTime dateFrom,
DateTime dateTo,
}); });
} }
@ -656,11 +870,13 @@ class __$$OrderLoaderStateImplCopyWithImpl<$Res>
$Res call({ $Res call({
Object? orders = null, Object? orders = null,
Object? failureOptionOrder = null, Object? failureOptionOrder = null,
Object? status = freezed, Object? status = null,
Object? search = freezed, Object? search = freezed,
Object? isFetching = null, Object? isFetching = null,
Object? hasReachedMax = null, Object? hasReachedMax = null,
Object? page = null, Object? page = null,
Object? dateFrom = null,
Object? dateTo = null,
}) { }) {
return _then( return _then(
_$OrderLoaderStateImpl( _$OrderLoaderStateImpl(
@ -672,10 +888,10 @@ class __$$OrderLoaderStateImplCopyWithImpl<$Res>
? _value.failureOptionOrder ? _value.failureOptionOrder
: failureOptionOrder // ignore: cast_nullable_to_non_nullable : failureOptionOrder // ignore: cast_nullable_to_non_nullable
as Option<OrderFailure>, as Option<OrderFailure>,
status: freezed == status status: null == status
? _value.status ? _value.status
: status // ignore: cast_nullable_to_non_nullable : status // ignore: cast_nullable_to_non_nullable
as String?, as String,
search: freezed == search search: freezed == search
? _value.search ? _value.search
: search // ignore: cast_nullable_to_non_nullable : search // ignore: cast_nullable_to_non_nullable
@ -692,6 +908,14 @@ class __$$OrderLoaderStateImplCopyWithImpl<$Res>
? _value.page ? _value.page
: page // ignore: cast_nullable_to_non_nullable : page // ignore: cast_nullable_to_non_nullable
as int, as int,
dateFrom: null == dateFrom
? _value.dateFrom
: dateFrom // ignore: cast_nullable_to_non_nullable
as DateTime,
dateTo: null == dateTo
? _value.dateTo
: dateTo // ignore: cast_nullable_to_non_nullable
as DateTime,
), ),
); );
} }
@ -703,11 +927,13 @@ class _$OrderLoaderStateImpl implements _OrderLoaderState {
const _$OrderLoaderStateImpl({ const _$OrderLoaderStateImpl({
required final List<Order> orders, required final List<Order> orders,
required this.failureOptionOrder, required this.failureOptionOrder,
this.status, required this.status,
this.search, this.search,
this.isFetching = false, this.isFetching = false,
this.hasReachedMax = false, this.hasReachedMax = false,
this.page = 1, this.page = 1,
required this.dateFrom,
required this.dateTo,
}) : _orders = orders; }) : _orders = orders;
final List<Order> _orders; final List<Order> _orders;
@ -721,7 +947,7 @@ class _$OrderLoaderStateImpl implements _OrderLoaderState {
@override @override
final Option<OrderFailure> failureOptionOrder; final Option<OrderFailure> failureOptionOrder;
@override @override
final String? status; final String status;
@override @override
final String? search; final String? search;
@override @override
@ -733,10 +959,14 @@ class _$OrderLoaderStateImpl implements _OrderLoaderState {
@override @override
@JsonKey() @JsonKey()
final int page; final int page;
@override
final DateTime dateFrom;
@override
final DateTime dateTo;
@override @override
String toString() { String toString() {
return 'OrderLoaderState(orders: $orders, failureOptionOrder: $failureOptionOrder, status: $status, search: $search, isFetching: $isFetching, hasReachedMax: $hasReachedMax, page: $page)'; return 'OrderLoaderState(orders: $orders, failureOptionOrder: $failureOptionOrder, status: $status, search: $search, isFetching: $isFetching, hasReachedMax: $hasReachedMax, page: $page, dateFrom: $dateFrom, dateTo: $dateTo)';
} }
@override @override
@ -753,7 +983,10 @@ class _$OrderLoaderStateImpl implements _OrderLoaderState {
other.isFetching == isFetching) && other.isFetching == isFetching) &&
(identical(other.hasReachedMax, hasReachedMax) || (identical(other.hasReachedMax, hasReachedMax) ||
other.hasReachedMax == hasReachedMax) && other.hasReachedMax == hasReachedMax) &&
(identical(other.page, page) || other.page == page)); (identical(other.page, page) || other.page == page) &&
(identical(other.dateFrom, dateFrom) ||
other.dateFrom == dateFrom) &&
(identical(other.dateTo, dateTo) || other.dateTo == dateTo));
} }
@override @override
@ -766,6 +999,8 @@ class _$OrderLoaderStateImpl implements _OrderLoaderState {
isFetching, isFetching,
hasReachedMax, hasReachedMax,
page, page,
dateFrom,
dateTo,
); );
/// Create a copy of OrderLoaderState /// Create a copy of OrderLoaderState
@ -784,11 +1019,13 @@ abstract class _OrderLoaderState implements OrderLoaderState {
const factory _OrderLoaderState({ const factory _OrderLoaderState({
required final List<Order> orders, required final List<Order> orders,
required final Option<OrderFailure> failureOptionOrder, required final Option<OrderFailure> failureOptionOrder,
final String? status, required final String status,
final String? search, final String? search,
final bool isFetching, final bool isFetching,
final bool hasReachedMax, final bool hasReachedMax,
final int page, final int page,
required final DateTime dateFrom,
required final DateTime dateTo,
}) = _$OrderLoaderStateImpl; }) = _$OrderLoaderStateImpl;
@override @override
@ -796,7 +1033,7 @@ abstract class _OrderLoaderState implements OrderLoaderState {
@override @override
Option<OrderFailure> get failureOptionOrder; Option<OrderFailure> get failureOptionOrder;
@override @override
String? get status; String get status;
@override @override
String? get search; String? get search;
@override @override
@ -805,6 +1042,10 @@ abstract class _OrderLoaderState implements OrderLoaderState {
bool get hasReachedMax; bool get hasReachedMax;
@override @override
int get page; int get page;
@override
DateTime get dateFrom;
@override
DateTime get dateTo;
/// Create a copy of OrderLoaderState /// Create a copy of OrderLoaderState
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.

View File

@ -2,6 +2,10 @@ part of 'order_loader_bloc.dart';
@freezed @freezed
class OrderLoaderEvent with _$OrderLoaderEvent { class OrderLoaderEvent with _$OrderLoaderEvent {
const factory OrderLoaderEvent.rangeDateChanged(
DateTime dateFrom,
DateTime dateTo,
) = _RangeDateChanged;
const factory OrderLoaderEvent.statusChanged(String status) = _StatusChanged; const factory OrderLoaderEvent.statusChanged(String status) = _StatusChanged;
const factory OrderLoaderEvent.searchChanged(String search) = _SearchChanged; const factory OrderLoaderEvent.searchChanged(String search) = _SearchChanged;
const factory OrderLoaderEvent.fetched({@Default(false) bool isRefresh}) = const factory OrderLoaderEvent.fetched({@Default(false) bool isRefresh}) =

View File

@ -5,13 +5,20 @@ class OrderLoaderState with _$OrderLoaderState {
const factory OrderLoaderState({ const factory OrderLoaderState({
required List<Order> orders, required List<Order> orders,
required Option<OrderFailure> failureOptionOrder, required Option<OrderFailure> failureOptionOrder,
String? status, required String status,
String? search, String? search,
@Default(false) bool isFetching, @Default(false) bool isFetching,
@Default(false) bool hasReachedMax, @Default(false) bool hasReachedMax,
@Default(1) int page, @Default(1) int page,
required DateTime dateFrom,
required DateTime dateTo,
}) = _OrderLoaderState; }) = _OrderLoaderState;
factory OrderLoaderState.initial() => factory OrderLoaderState.initial() => OrderLoaderState(
OrderLoaderState(orders: [], failureOptionOrder: none()); orders: [],
failureOptionOrder: none(),
dateFrom: DateTime.now().subtract(const Duration(days: 30)),
dateTo: DateTime.now(),
status: 'all',
);
} }

View File

@ -6,5 +6,7 @@ abstract class IOrderRepository {
int limit = 10, int limit = 10,
String? status, String? status,
String? search, String? search,
required DateTime dateFrom,
required DateTime dateTo,
}); });
} }

View File

@ -5,6 +5,7 @@ import 'package:injectable/injectable.dart';
import '../../../common/api/api_client.dart'; import '../../../common/api/api_client.dart';
import '../../../common/api/api_failure.dart'; import '../../../common/api/api_failure.dart';
import '../../../common/extension/extension.dart';
import '../../../common/function/app_function.dart'; import '../../../common/function/app_function.dart';
import '../../../common/url/api_path.dart'; import '../../../common/url/api_path.dart';
import '../../../domain/order/order.dart'; import '../../../domain/order/order.dart';
@ -22,9 +23,16 @@ class OrderRemoteDataProvider {
int limit = 10, int limit = 10,
String? status, String? status,
String? search, String? search,
required DateTime dateFrom,
required DateTime dateTo,
}) async { }) async {
try { try {
Map<String, dynamic> params = {'page': page, 'limit': limit}; Map<String, dynamic> params = {
'page': page,
'limit': limit,
'date_from': dateFrom.toServerDate,
'date_to': dateTo.toServerDate,
};
if (status != null && status.isNotEmpty) { if (status != null && status.isNotEmpty) {
params['status'] = status; params['status'] = status;

View File

@ -19,6 +19,8 @@ class OrderRepository implements IOrderRepository {
int limit = 20, int limit = 20,
String? status, String? status,
String? search, String? search,
required DateTime dateFrom,
required DateTime dateTo,
}) async { }) async {
try { try {
final result = await _dataProvider.fetch( final result = await _dataProvider.fetch(
@ -26,6 +28,8 @@ class OrderRepository implements IOrderRepository {
limit: limit, limit: limit,
status: status, status: status,
search: search, search: search,
dateFrom: dateFrom,
dateTo: dateTo,
); );
if (result.hasError) { if (result.hasError) {

View File

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
@ -11,7 +13,7 @@ import '../../../components/button/button.dart';
import '../../../components/spacer/spacer.dart'; import '../../../components/spacer/spacer.dart';
import '../../../components/widgets/empty_widget.dart'; import '../../../components/widgets/empty_widget.dart';
import '../../../router/app_router.gr.dart'; import '../../../router/app_router.gr.dart';
import 'widgets/status_tile.dart'; import 'widgets/filter_header_delegate.dart';
import 'widgets/order_tile.dart'; import 'widgets/order_tile.dart';
@RoutePage() @RoutePage()
@ -38,7 +40,6 @@ class _OrderPageState extends State<OrderPage> with TickerProviderStateMixin {
final ScrollController _scrollController = ScrollController(); final ScrollController _scrollController = ScrollController();
// Filter state // Filter state
String selectedFilter = 'All';
final List<String> filterOptions = ['All', 'Completed', 'Pending']; final List<String> filterOptions = ['All', 'Completed', 'Pending'];
@override @override
@ -79,13 +80,27 @@ class _OrderPageState extends State<OrderPage> with TickerProviderStateMixin {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
backgroundColor: AppColor.background, backgroundColor: AppColor.background,
body: BlocListener<OrderLoaderBloc, OrderLoaderState>( body: MultiBlocListener(
listeners: [
BlocListener<OrderLoaderBloc, OrderLoaderState>(
listenWhen: (p, c) => p.status != c.status, listenWhen: (p, c) => p.status != c.status,
listener: (context, state) { listener: (context, state) {
context.read<OrderLoaderBloc>().add( context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.fetched(isRefresh: true), OrderLoaderEvent.fetched(isRefresh: true),
); );
}, },
),
BlocListener<OrderLoaderBloc, OrderLoaderState>(
listenWhen: (previous, current) =>
previous.dateFrom != current.dateFrom ||
previous.dateTo != current.dateTo,
listener: (context, state) {
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.fetched(isRefresh: true),
);
},
),
],
child: BlocBuilder<OrderLoaderBloc, OrderLoaderState>( child: BlocBuilder<OrderLoaderBloc, OrderLoaderState>(
builder: (context, state) { builder: (context, state) {
return NotificationListener<ScrollNotification>( return NotificationListener<ScrollNotification>(
@ -120,60 +135,36 @@ class _OrderPageState extends State<OrderPage> with TickerProviderStateMixin {
// Pinned Filter Section // Pinned Filter Section
SliverPersistentHeader( SliverPersistentHeader(
pinned: true, pinned: true,
delegate: _FilterHeaderDelegate( delegate: FilterHeaderDelegate(
child: Container( backgroundColor: AppColor.background,
color: AppColor.background,
padding: EdgeInsets.fromLTRB( padding: EdgeInsets.fromLTRB(
AppValue.padding, AppValue.padding,
10, 10,
AppValue.padding, AppValue.padding,
10, 10,
), ),
child: Column( startDate: state.dateFrom,
crossAxisAlignment: CrossAxisAlignment.start, endDate: state.dateTo,
children: [ filterOptions: filterOptions,
SingleChildScrollView( selectedFilter: state.status,
scrollDirection: Axis.horizontal, onDateChanged: (startDate, endDate) {
child: Row( if (startDate != null && endDate != null) {
children: filterOptions.map((option) { log('Date changed');
final index = filterOptions.indexOf(option);
return Padding(
padding: EdgeInsets.only(
right: index < filterOptions.length - 1
? 8
: 0,
),
child: OrderStatusTile(
label: option,
isSelected: option == selectedFilter,
onSelected: (isSelected) {
if (isSelected) {
setState(() {
selectedFilter = option;
});
if (option.toLowerCase() == 'all') {
context.read<OrderLoaderBloc>().add( context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.statusChanged( OrderLoaderEvent.rangeDateChanged(
'', startDate,
endDate,
), ),
); );
} else {
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.statusChanged(
option.toLowerCase(),
),
);
}
} }
}, },
), onFilterChanged: (filter) {
final status = filter.toLowerCase();
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.statusChanged(status),
); );
}).toList(), },
),
),
],
),
),
), ),
), ),
@ -189,13 +180,13 @@ class _OrderPageState extends State<OrderPage> with TickerProviderStateMixin {
child: Column( child: Column(
children: [ children: [
// Show filtered transaction count // Show filtered transaction count
if (selectedFilter != 'All') if (state.status != 'all')
Padding( Padding(
padding: const EdgeInsets.only(bottom: 16), padding: const EdgeInsets.only(bottom: 16),
child: Row( child: Row(
children: [ children: [
Text( Text(
'${state.orders.length} ${selectedFilter.toLowerCase()} order${state.orders.length != 1 ? 's' : ''}', '${state.orders.length} ${state.status.toLowerCase()} order${state.orders.length != 1 ? 's' : ''}',
style: TextStyle( style: TextStyle(
color: AppColor.textSecondary, color: AppColor.textSecondary,
fontSize: 14, fontSize: 14,
@ -210,7 +201,7 @@ class _OrderPageState extends State<OrderPage> with TickerProviderStateMixin {
? EmptyWidget( ? EmptyWidget(
title: 'Order', title: 'Order',
message: message:
'No ${selectedFilter.toLowerCase()} orders found', 'No ${state.status.toLowerCase()} orders found',
) )
: ListView.builder( : ListView.builder(
itemCount: state.orders.length, itemCount: state.orders.length,
@ -247,28 +238,3 @@ class _OrderPageState extends State<OrderPage> with TickerProviderStateMixin {
} }
// Custom delegate for pinned filter header // Custom delegate for pinned filter header
class _FilterHeaderDelegate extends SliverPersistentHeaderDelegate {
final Widget child;
_FilterHeaderDelegate({required this.child});
@override
double get minExtent => 70; // Minimum height when collapsed
@override
double get maxExtent => 70; // Maximum height when expanded
@override
Widget build(
BuildContext context,
double shrinkOffset,
bool overlapsContent,
) {
return child;
}
@override
bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) {
return false;
}
}

View File

@ -0,0 +1,99 @@
import 'package:flutter/material.dart';
import '../../../../components/field/date_range_picker_field.dart';
import 'status_tile.dart';
class FilterHeaderDelegate extends SliverPersistentHeaderDelegate {
final Color backgroundColor;
final EdgeInsets padding;
final DateTime? startDate;
final DateTime? endDate;
final List<String> filterOptions;
final String selectedFilter;
final Function(DateTime?, DateTime?) onDateChanged;
final Function(String) onFilterChanged;
FilterHeaderDelegate({
required this.backgroundColor,
required this.padding,
required this.startDate,
required this.endDate,
required this.filterOptions,
required this.selectedFilter,
required this.onDateChanged,
required this.onFilterChanged,
});
@override
double get minExtent => 130;
@override
double get maxExtent => 130;
@override
Widget build(
BuildContext context,
double shrinkOffset,
bool overlapsContent,
) {
print('FilterHeaderDelegate build called'); // Debug log
return Container(
color: backgroundColor,
padding: padding,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: DateRangePickerField(
maxDate: DateTime.now(),
startDate: startDate,
endDate: endDate,
onChanged: (start, end) {
print(
'onChanged called in FilterHeaderDelegate: $start - $end',
); // Debug log
onDateChanged(start, end);
},
),
),
Expanded(
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children: filterOptions.asMap().entries.map((entry) {
final index = entry.key;
final option = entry.value;
return Padding(
padding: EdgeInsets.only(
right: index < filterOptions.length - 1 ? 8 : 0,
),
child: OrderStatusTile(
label: option,
isSelected: option == selectedFilter,
onSelected: (isSelected) {
if (isSelected) {
onFilterChanged(option);
}
},
),
);
}).toList(),
),
),
),
],
),
);
}
@override
bool shouldRebuild(covariant FilterHeaderDelegate oldDelegate) {
return oldDelegate.startDate != startDate ||
oldDelegate.endDate != endDate ||
oldDelegate.selectedFilter != selectedFilter ||
oldDelegate.filterOptions.length != filterOptions.length ||
oldDelegate.backgroundColor != backgroundColor;
}
}