diff --git a/lib/data/datasources/outlet_remote_data_source.dart b/lib/data/datasources/outlet_remote_data_source.dart index 96a3582..6d31658 100644 --- a/lib/data/datasources/outlet_remote_data_source.dart +++ b/lib/data/datasources/outlet_remote_data_source.dart @@ -40,4 +40,42 @@ class OutletRemoteDataSource { return const Left('Unexpected error occurred'); } } + + Future> currentOutlet() async { + try { + final authData = await AuthLocalDataSource().getAuthData(); + + if (authData.user?.outletId == null) { + return const Left('Kamu belum memiliki bergabung dengan outlet'); + } + + final url = + '${Variables.baseUrl}/api/v1/outlets/detail/${authData.user?.outletId}'; + + final response = await dio.get( + url, + queryParameters: { + 'organization_id': authData.user?.organizationId, + }, + options: Options( + headers: { + 'Authorization': 'Bearer ${authData.token}', + 'Accept': 'application/json', + }, + ), + ); + + if (response.statusCode == 200) { + return Right(OutletDetailResponse.fromMap(response.data)); + } else { + return const Left('Failed to get outlets'); + } + } on DioException catch (e) { + log("Dio error: ${e.message}"); + return Left(e.response?.data['message'] ?? 'Gagal mengambil outlet'); + } catch (e) { + log("Unexpected error: $e"); + return const Left('Unexpected error occurred'); + } + } } diff --git a/lib/main.dart b/lib/main.dart index 4e69051..1ed7136 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,6 +5,7 @@ import 'package:enaklo_pos/data/datasources/outlet_remote_data_source.dart'; import 'package:enaklo_pos/data/datasources/table_remote_datasource.dart'; import 'package:enaklo_pos/presentation/customer/bloc/customer_form/customer_form_bloc.dart'; import 'package:enaklo_pos/presentation/customer/bloc/customer_loader/customer_loader_bloc.dart'; +import 'package:enaklo_pos/presentation/home/bloc/current_outlet/current_outlet_bloc.dart'; import 'package:enaklo_pos/presentation/home/bloc/order_form/order_form_bloc.dart'; import 'package:enaklo_pos/presentation/home/bloc/outlet_loader/outlet_loader_bloc.dart'; import 'package:enaklo_pos/presentation/home/bloc/product_loader/product_loader_bloc.dart'; @@ -248,6 +249,9 @@ class _MyAppState extends State { BlocProvider( create: (context) => PaymentFormBloc(OrderRemoteDatasource()), ), + BlocProvider( + create: (context) => CurrentOutletBloc(OutletRemoteDataSource()), + ), ], child: MaterialApp( debugShowCheckedModeBanner: false, diff --git a/lib/presentation/home/bloc/current_outlet/current_outlet_bloc.dart b/lib/presentation/home/bloc/current_outlet/current_outlet_bloc.dart new file mode 100644 index 0000000..b60ec94 --- /dev/null +++ b/lib/presentation/home/bloc/current_outlet/current_outlet_bloc.dart @@ -0,0 +1,23 @@ +import 'package:bloc/bloc.dart'; +import 'package:enaklo_pos/data/datasources/outlet_remote_data_source.dart'; +import 'package:enaklo_pos/presentation/home/models/outlet_model.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'current_outlet_event.dart'; +part 'current_outlet_state.dart'; +part 'current_outlet_bloc.freezed.dart'; + +class CurrentOutletBloc extends Bloc { + final OutletRemoteDataSource _outletRemoteDataSource; + CurrentOutletBloc(this._outletRemoteDataSource) + : super(CurrentOutletState.initial()) { + on<_CurrentOutlet>((event, emit) async { + emit(const _Loading()); + final result = await _outletRemoteDataSource.currentOutlet(); + result.fold( + (l) => emit(_Error(l)), + (r) => emit(_Loaded(r.data!)), + ); + }); + } +} diff --git a/lib/presentation/home/bloc/current_outlet/current_outlet_bloc.freezed.dart b/lib/presentation/home/bloc/current_outlet/current_outlet_bloc.freezed.dart new file mode 100644 index 0000000..7229d76 --- /dev/null +++ b/lib/presentation/home/bloc/current_outlet/current_outlet_bloc.freezed.dart @@ -0,0 +1,784 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'current_outlet_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$CurrentOutletEvent { + @optionalTypeArgs + TResult when({ + required TResult Function() currentOutlet, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? currentOutlet, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? currentOutlet, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_CurrentOutlet value) currentOutlet, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_CurrentOutlet value)? currentOutlet, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_CurrentOutlet value)? currentOutlet, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CurrentOutletEventCopyWith<$Res> { + factory $CurrentOutletEventCopyWith( + CurrentOutletEvent value, $Res Function(CurrentOutletEvent) then) = + _$CurrentOutletEventCopyWithImpl<$Res, CurrentOutletEvent>; +} + +/// @nodoc +class _$CurrentOutletEventCopyWithImpl<$Res, $Val extends CurrentOutletEvent> + implements $CurrentOutletEventCopyWith<$Res> { + _$CurrentOutletEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of CurrentOutletEvent + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc +abstract class _$$CurrentOutletImplCopyWith<$Res> { + factory _$$CurrentOutletImplCopyWith( + _$CurrentOutletImpl value, $Res Function(_$CurrentOutletImpl) then) = + __$$CurrentOutletImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$CurrentOutletImplCopyWithImpl<$Res> + extends _$CurrentOutletEventCopyWithImpl<$Res, _$CurrentOutletImpl> + implements _$$CurrentOutletImplCopyWith<$Res> { + __$$CurrentOutletImplCopyWithImpl( + _$CurrentOutletImpl _value, $Res Function(_$CurrentOutletImpl) _then) + : super(_value, _then); + + /// Create a copy of CurrentOutletEvent + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc + +class _$CurrentOutletImpl implements _CurrentOutlet { + const _$CurrentOutletImpl(); + + @override + String toString() { + return 'CurrentOutletEvent.currentOutlet()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$CurrentOutletImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() currentOutlet, + }) { + return currentOutlet(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? currentOutlet, + }) { + return currentOutlet?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? currentOutlet, + required TResult orElse(), + }) { + if (currentOutlet != null) { + return currentOutlet(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_CurrentOutlet value) currentOutlet, + }) { + return currentOutlet(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_CurrentOutlet value)? currentOutlet, + }) { + return currentOutlet?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_CurrentOutlet value)? currentOutlet, + required TResult orElse(), + }) { + if (currentOutlet != null) { + return currentOutlet(this); + } + return orElse(); + } +} + +abstract class _CurrentOutlet implements CurrentOutletEvent { + const factory _CurrentOutlet() = _$CurrentOutletImpl; +} + +/// @nodoc +mixin _$CurrentOutletState { + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(Outlet outlet) loaded, + required TResult Function(String message) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(Outlet outlet)? loaded, + TResult? Function(String message)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(Outlet outlet)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CurrentOutletStateCopyWith<$Res> { + factory $CurrentOutletStateCopyWith( + CurrentOutletState value, $Res Function(CurrentOutletState) then) = + _$CurrentOutletStateCopyWithImpl<$Res, CurrentOutletState>; +} + +/// @nodoc +class _$CurrentOutletStateCopyWithImpl<$Res, $Val extends CurrentOutletState> + implements $CurrentOutletStateCopyWith<$Res> { + _$CurrentOutletStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of CurrentOutletState + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc +abstract class _$$InitialImplCopyWith<$Res> { + factory _$$InitialImplCopyWith( + _$InitialImpl value, $Res Function(_$InitialImpl) then) = + __$$InitialImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$InitialImplCopyWithImpl<$Res> + extends _$CurrentOutletStateCopyWithImpl<$Res, _$InitialImpl> + implements _$$InitialImplCopyWith<$Res> { + __$$InitialImplCopyWithImpl( + _$InitialImpl _value, $Res Function(_$InitialImpl) _then) + : super(_value, _then); + + /// Create a copy of CurrentOutletState + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc + +class _$InitialImpl implements _Initial { + const _$InitialImpl(); + + @override + String toString() { + return 'CurrentOutletState.initial()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$InitialImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(Outlet outlet) loaded, + required TResult Function(String message) error, + }) { + return initial(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(Outlet outlet)? loaded, + TResult? Function(String message)? error, + }) { + return initial?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(Outlet outlet)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return initial(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return initial?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (initial != null) { + return initial(this); + } + return orElse(); + } +} + +abstract class _Initial implements CurrentOutletState { + const factory _Initial() = _$InitialImpl; +} + +/// @nodoc +abstract class _$$LoadingImplCopyWith<$Res> { + factory _$$LoadingImplCopyWith( + _$LoadingImpl value, $Res Function(_$LoadingImpl) then) = + __$$LoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingImplCopyWithImpl<$Res> + extends _$CurrentOutletStateCopyWithImpl<$Res, _$LoadingImpl> + implements _$$LoadingImplCopyWith<$Res> { + __$$LoadingImplCopyWithImpl( + _$LoadingImpl _value, $Res Function(_$LoadingImpl) _then) + : super(_value, _then); + + /// Create a copy of CurrentOutletState + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc + +class _$LoadingImpl implements _Loading { + const _$LoadingImpl(); + + @override + String toString() { + return 'CurrentOutletState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(Outlet outlet) loaded, + required TResult Function(String message) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(Outlet outlet)? loaded, + TResult? Function(String message)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(Outlet outlet)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class _Loading implements CurrentOutletState { + const factory _Loading() = _$LoadingImpl; +} + +/// @nodoc +abstract class _$$LoadedImplCopyWith<$Res> { + factory _$$LoadedImplCopyWith( + _$LoadedImpl value, $Res Function(_$LoadedImpl) then) = + __$$LoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({Outlet outlet}); +} + +/// @nodoc +class __$$LoadedImplCopyWithImpl<$Res> + extends _$CurrentOutletStateCopyWithImpl<$Res, _$LoadedImpl> + implements _$$LoadedImplCopyWith<$Res> { + __$$LoadedImplCopyWithImpl( + _$LoadedImpl _value, $Res Function(_$LoadedImpl) _then) + : super(_value, _then); + + /// Create a copy of CurrentOutletState + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? outlet = null, + }) { + return _then(_$LoadedImpl( + null == outlet + ? _value.outlet + : outlet // ignore: cast_nullable_to_non_nullable + as Outlet, + )); + } +} + +/// @nodoc + +class _$LoadedImpl implements _Loaded { + const _$LoadedImpl(this.outlet); + + @override + final Outlet outlet; + + @override + String toString() { + return 'CurrentOutletState.loaded(outlet: $outlet)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedImpl && + (identical(other.outlet, outlet) || other.outlet == outlet)); + } + + @override + int get hashCode => Object.hash(runtimeType, outlet); + + /// Create a copy of CurrentOutletState + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + __$$LoadedImplCopyWithImpl<_$LoadedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(Outlet outlet) loaded, + required TResult Function(String message) error, + }) { + return loaded(outlet); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(Outlet outlet)? loaded, + TResult? Function(String message)? error, + }) { + return loaded?.call(outlet); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(Outlet outlet)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(outlet); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class _Loaded implements CurrentOutletState { + const factory _Loaded(final Outlet outlet) = _$LoadedImpl; + + Outlet get outlet; + + /// Create a copy of CurrentOutletState + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$LoadedImplCopyWith<_$LoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorImplCopyWith<$Res> { + factory _$$ErrorImplCopyWith( + _$ErrorImpl value, $Res Function(_$ErrorImpl) then) = + __$$ErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorImplCopyWithImpl<$Res> + extends _$CurrentOutletStateCopyWithImpl<$Res, _$ErrorImpl> + implements _$$ErrorImplCopyWith<$Res> { + __$$ErrorImplCopyWithImpl( + _$ErrorImpl _value, $Res Function(_$ErrorImpl) _then) + : super(_value, _then); + + /// Create a copy of CurrentOutletState + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorImpl implements _Error { + const _$ErrorImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'CurrentOutletState.error(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + /// Create a copy of CurrentOutletState + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + __$$ErrorImplCopyWithImpl<_$ErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(Outlet outlet) loaded, + required TResult Function(String message) error, + }) { + return error(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(Outlet outlet)? loaded, + TResult? Function(String message)? error, + }) { + return error?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(Outlet outlet)? loaded, + TResult Function(String message)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class _Error implements CurrentOutletState { + const factory _Error(final String message) = _$ErrorImpl; + + String get message; + + /// Create a copy of CurrentOutletState + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/presentation/home/bloc/current_outlet/current_outlet_event.dart b/lib/presentation/home/bloc/current_outlet/current_outlet_event.dart new file mode 100644 index 0000000..edf3abd --- /dev/null +++ b/lib/presentation/home/bloc/current_outlet/current_outlet_event.dart @@ -0,0 +1,6 @@ +part of 'current_outlet_bloc.dart'; + +@freezed +class CurrentOutletEvent with _$CurrentOutletEvent { + const factory CurrentOutletEvent.currentOutlet() = _CurrentOutlet; +} diff --git a/lib/presentation/home/bloc/current_outlet/current_outlet_state.dart b/lib/presentation/home/bloc/current_outlet/current_outlet_state.dart new file mode 100644 index 0000000..1fd936a --- /dev/null +++ b/lib/presentation/home/bloc/current_outlet/current_outlet_state.dart @@ -0,0 +1,9 @@ +part of 'current_outlet_bloc.dart'; + +@freezed +class CurrentOutletState with _$CurrentOutletState { + const factory CurrentOutletState.initial() = _Initial; + const factory CurrentOutletState.loading() = _Loading; + const factory CurrentOutletState.loaded(Outlet outlet) = _Loaded; + const factory CurrentOutletState.error(String message) = _Error; +} diff --git a/lib/presentation/home/bloc/outlet_loader/outlet_loader_bloc.dart b/lib/presentation/home/bloc/outlet_loader/outlet_loader_bloc.dart index 1755140..a742637 100644 --- a/lib/presentation/home/bloc/outlet_loader/outlet_loader_bloc.dart +++ b/lib/presentation/home/bloc/outlet_loader/outlet_loader_bloc.dart @@ -19,5 +19,13 @@ class OutletLoaderBloc extends Bloc { (r) => emit(_Loaded(r.data?.outlets ?? [])), ); }); + on<_CurrentOutlet>((event, emit) async { + emit(const _LoadingDetail()); + final result = await _outletRemoteDataSource.currentOutlet(); + result.fold( + (l) => emit(_ErrorDetail(l)), + (r) => emit(_LoadedDetail(r.data!)), + ); + }); } } diff --git a/lib/presentation/home/bloc/outlet_loader/outlet_loader_bloc.freezed.dart b/lib/presentation/home/bloc/outlet_loader/outlet_loader_bloc.freezed.dart index b1fcd7b..a13666e 100644 --- a/lib/presentation/home/bloc/outlet_loader/outlet_loader_bloc.freezed.dart +++ b/lib/presentation/home/bloc/outlet_loader/outlet_loader_bloc.freezed.dart @@ -19,32 +19,38 @@ mixin _$OutletLoaderEvent { @optionalTypeArgs TResult when({ required TResult Function() getOutlet, + required TResult Function() currentOutlet, }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? getOutlet, + TResult? Function()? currentOutlet, }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ TResult Function()? getOutlet, + TResult Function()? currentOutlet, required TResult orElse(), }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult map({ required TResult Function(_GetOutlet value) getOutlet, + required TResult Function(_CurrentOutlet value) currentOutlet, }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull({ TResult? Function(_GetOutlet value)? getOutlet, + TResult? Function(_CurrentOutlet value)? currentOutlet, }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeMap({ TResult Function(_GetOutlet value)? getOutlet, + TResult Function(_CurrentOutlet value)? currentOutlet, required TResult orElse(), }) => throw _privateConstructorUsedError; @@ -113,6 +119,7 @@ class _$GetOutletImpl implements _GetOutlet { @optionalTypeArgs TResult when({ required TResult Function() getOutlet, + required TResult Function() currentOutlet, }) { return getOutlet(); } @@ -121,6 +128,7 @@ class _$GetOutletImpl implements _GetOutlet { @optionalTypeArgs TResult? whenOrNull({ TResult? Function()? getOutlet, + TResult? Function()? currentOutlet, }) { return getOutlet?.call(); } @@ -129,6 +137,7 @@ class _$GetOutletImpl implements _GetOutlet { @optionalTypeArgs TResult maybeWhen({ TResult Function()? getOutlet, + TResult Function()? currentOutlet, required TResult orElse(), }) { if (getOutlet != null) { @@ -141,6 +150,7 @@ class _$GetOutletImpl implements _GetOutlet { @optionalTypeArgs TResult map({ required TResult Function(_GetOutlet value) getOutlet, + required TResult Function(_CurrentOutlet value) currentOutlet, }) { return getOutlet(this); } @@ -149,6 +159,7 @@ class _$GetOutletImpl implements _GetOutlet { @optionalTypeArgs TResult? mapOrNull({ TResult? Function(_GetOutlet value)? getOutlet, + TResult? Function(_CurrentOutlet value)? currentOutlet, }) { return getOutlet?.call(this); } @@ -157,6 +168,7 @@ class _$GetOutletImpl implements _GetOutlet { @optionalTypeArgs TResult maybeMap({ TResult Function(_GetOutlet value)? getOutlet, + TResult Function(_CurrentOutlet value)? currentOutlet, required TResult orElse(), }) { if (getOutlet != null) { @@ -170,6 +182,111 @@ abstract class _GetOutlet implements OutletLoaderEvent { const factory _GetOutlet() = _$GetOutletImpl; } +/// @nodoc +abstract class _$$CurrentOutletImplCopyWith<$Res> { + factory _$$CurrentOutletImplCopyWith( + _$CurrentOutletImpl value, $Res Function(_$CurrentOutletImpl) then) = + __$$CurrentOutletImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$CurrentOutletImplCopyWithImpl<$Res> + extends _$OutletLoaderEventCopyWithImpl<$Res, _$CurrentOutletImpl> + implements _$$CurrentOutletImplCopyWith<$Res> { + __$$CurrentOutletImplCopyWithImpl( + _$CurrentOutletImpl _value, $Res Function(_$CurrentOutletImpl) _then) + : super(_value, _then); + + /// Create a copy of OutletLoaderEvent + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc + +class _$CurrentOutletImpl implements _CurrentOutlet { + const _$CurrentOutletImpl(); + + @override + String toString() { + return 'OutletLoaderEvent.currentOutlet()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$CurrentOutletImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() getOutlet, + required TResult Function() currentOutlet, + }) { + return currentOutlet(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? getOutlet, + TResult? Function()? currentOutlet, + }) { + return currentOutlet?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? getOutlet, + TResult Function()? currentOutlet, + required TResult orElse(), + }) { + if (currentOutlet != null) { + return currentOutlet(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_GetOutlet value) getOutlet, + required TResult Function(_CurrentOutlet value) currentOutlet, + }) { + return currentOutlet(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_GetOutlet value)? getOutlet, + TResult? Function(_CurrentOutlet value)? currentOutlet, + }) { + return currentOutlet?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_GetOutlet value)? getOutlet, + TResult Function(_CurrentOutlet value)? currentOutlet, + required TResult orElse(), + }) { + if (currentOutlet != null) { + return currentOutlet(this); + } + return orElse(); + } +} + +abstract class _CurrentOutlet implements OutletLoaderEvent { + const factory _CurrentOutlet() = _$CurrentOutletImpl; +} + /// @nodoc mixin _$OutletLoaderState { @optionalTypeArgs @@ -178,6 +295,9 @@ mixin _$OutletLoaderState { required TResult Function() loading, required TResult Function(List outlets) loaded, required TResult Function(String message) error, + required TResult Function() loadingDetail, + required TResult Function(Outlet outlet) loadedDetail, + required TResult Function(String message) errorDetail, }) => throw _privateConstructorUsedError; @optionalTypeArgs @@ -186,6 +306,9 @@ mixin _$OutletLoaderState { TResult? Function()? loading, TResult? Function(List outlets)? loaded, TResult? Function(String message)? error, + TResult? Function()? loadingDetail, + TResult? Function(Outlet outlet)? loadedDetail, + TResult? Function(String message)? errorDetail, }) => throw _privateConstructorUsedError; @optionalTypeArgs @@ -194,6 +317,9 @@ mixin _$OutletLoaderState { TResult Function()? loading, TResult Function(List outlets)? loaded, TResult Function(String message)? error, + TResult Function()? loadingDetail, + TResult Function(Outlet outlet)? loadedDetail, + TResult Function(String message)? errorDetail, required TResult orElse(), }) => throw _privateConstructorUsedError; @@ -203,6 +329,9 @@ mixin _$OutletLoaderState { required TResult Function(_Loading value) loading, required TResult Function(_Loaded value) loaded, required TResult Function(_Error value) error, + required TResult Function(_LoadingDetail value) loadingDetail, + required TResult Function(_LoadedDetail value) loadedDetail, + required TResult Function(_ErrorDetail value) errorDetail, }) => throw _privateConstructorUsedError; @optionalTypeArgs @@ -211,6 +340,9 @@ mixin _$OutletLoaderState { TResult? Function(_Loading value)? loading, TResult? Function(_Loaded value)? loaded, TResult? Function(_Error value)? error, + TResult? Function(_LoadingDetail value)? loadingDetail, + TResult? Function(_LoadedDetail value)? loadedDetail, + TResult? Function(_ErrorDetail value)? errorDetail, }) => throw _privateConstructorUsedError; @optionalTypeArgs @@ -219,6 +351,9 @@ mixin _$OutletLoaderState { TResult Function(_Loading value)? loading, TResult Function(_Loaded value)? loaded, TResult Function(_Error value)? error, + TResult Function(_LoadingDetail value)? loadingDetail, + TResult Function(_LoadedDetail value)? loadedDetail, + TResult Function(_ErrorDetail value)? errorDetail, required TResult orElse(), }) => throw _privateConstructorUsedError; @@ -290,6 +425,9 @@ class _$InitialImpl implements _Initial { required TResult Function() loading, required TResult Function(List outlets) loaded, required TResult Function(String message) error, + required TResult Function() loadingDetail, + required TResult Function(Outlet outlet) loadedDetail, + required TResult Function(String message) errorDetail, }) { return initial(); } @@ -301,6 +439,9 @@ class _$InitialImpl implements _Initial { TResult? Function()? loading, TResult? Function(List outlets)? loaded, TResult? Function(String message)? error, + TResult? Function()? loadingDetail, + TResult? Function(Outlet outlet)? loadedDetail, + TResult? Function(String message)? errorDetail, }) { return initial?.call(); } @@ -312,6 +453,9 @@ class _$InitialImpl implements _Initial { TResult Function()? loading, TResult Function(List outlets)? loaded, TResult Function(String message)? error, + TResult Function()? loadingDetail, + TResult Function(Outlet outlet)? loadedDetail, + TResult Function(String message)? errorDetail, required TResult orElse(), }) { if (initial != null) { @@ -327,6 +471,9 @@ class _$InitialImpl implements _Initial { required TResult Function(_Loading value) loading, required TResult Function(_Loaded value) loaded, required TResult Function(_Error value) error, + required TResult Function(_LoadingDetail value) loadingDetail, + required TResult Function(_LoadedDetail value) loadedDetail, + required TResult Function(_ErrorDetail value) errorDetail, }) { return initial(this); } @@ -338,6 +485,9 @@ class _$InitialImpl implements _Initial { TResult? Function(_Loading value)? loading, TResult? Function(_Loaded value)? loaded, TResult? Function(_Error value)? error, + TResult? Function(_LoadingDetail value)? loadingDetail, + TResult? Function(_LoadedDetail value)? loadedDetail, + TResult? Function(_ErrorDetail value)? errorDetail, }) { return initial?.call(this); } @@ -349,6 +499,9 @@ class _$InitialImpl implements _Initial { TResult Function(_Loading value)? loading, TResult Function(_Loaded value)? loaded, TResult Function(_Error value)? error, + TResult Function(_LoadingDetail value)? loadingDetail, + TResult Function(_LoadedDetail value)? loadedDetail, + TResult Function(_ErrorDetail value)? errorDetail, required TResult orElse(), }) { if (initial != null) { @@ -407,6 +560,9 @@ class _$LoadingImpl implements _Loading { required TResult Function() loading, required TResult Function(List outlets) loaded, required TResult Function(String message) error, + required TResult Function() loadingDetail, + required TResult Function(Outlet outlet) loadedDetail, + required TResult Function(String message) errorDetail, }) { return loading(); } @@ -418,6 +574,9 @@ class _$LoadingImpl implements _Loading { TResult? Function()? loading, TResult? Function(List outlets)? loaded, TResult? Function(String message)? error, + TResult? Function()? loadingDetail, + TResult? Function(Outlet outlet)? loadedDetail, + TResult? Function(String message)? errorDetail, }) { return loading?.call(); } @@ -429,6 +588,9 @@ class _$LoadingImpl implements _Loading { TResult Function()? loading, TResult Function(List outlets)? loaded, TResult Function(String message)? error, + TResult Function()? loadingDetail, + TResult Function(Outlet outlet)? loadedDetail, + TResult Function(String message)? errorDetail, required TResult orElse(), }) { if (loading != null) { @@ -444,6 +606,9 @@ class _$LoadingImpl implements _Loading { required TResult Function(_Loading value) loading, required TResult Function(_Loaded value) loaded, required TResult Function(_Error value) error, + required TResult Function(_LoadingDetail value) loadingDetail, + required TResult Function(_LoadedDetail value) loadedDetail, + required TResult Function(_ErrorDetail value) errorDetail, }) { return loading(this); } @@ -455,6 +620,9 @@ class _$LoadingImpl implements _Loading { TResult? Function(_Loading value)? loading, TResult? Function(_Loaded value)? loaded, TResult? Function(_Error value)? error, + TResult? Function(_LoadingDetail value)? loadingDetail, + TResult? Function(_LoadedDetail value)? loadedDetail, + TResult? Function(_ErrorDetail value)? errorDetail, }) { return loading?.call(this); } @@ -466,6 +634,9 @@ class _$LoadingImpl implements _Loading { TResult Function(_Loading value)? loading, TResult Function(_Loaded value)? loaded, TResult Function(_Error value)? error, + TResult Function(_LoadingDetail value)? loadingDetail, + TResult Function(_LoadedDetail value)? loadedDetail, + TResult Function(_ErrorDetail value)? errorDetail, required TResult orElse(), }) { if (loading != null) { @@ -557,6 +728,9 @@ class _$LoadedImpl implements _Loaded { required TResult Function() loading, required TResult Function(List outlets) loaded, required TResult Function(String message) error, + required TResult Function() loadingDetail, + required TResult Function(Outlet outlet) loadedDetail, + required TResult Function(String message) errorDetail, }) { return loaded(outlets); } @@ -568,6 +742,9 @@ class _$LoadedImpl implements _Loaded { TResult? Function()? loading, TResult? Function(List outlets)? loaded, TResult? Function(String message)? error, + TResult? Function()? loadingDetail, + TResult? Function(Outlet outlet)? loadedDetail, + TResult? Function(String message)? errorDetail, }) { return loaded?.call(outlets); } @@ -579,6 +756,9 @@ class _$LoadedImpl implements _Loaded { TResult Function()? loading, TResult Function(List outlets)? loaded, TResult Function(String message)? error, + TResult Function()? loadingDetail, + TResult Function(Outlet outlet)? loadedDetail, + TResult Function(String message)? errorDetail, required TResult orElse(), }) { if (loaded != null) { @@ -594,6 +774,9 @@ class _$LoadedImpl implements _Loaded { required TResult Function(_Loading value) loading, required TResult Function(_Loaded value) loaded, required TResult Function(_Error value) error, + required TResult Function(_LoadingDetail value) loadingDetail, + required TResult Function(_LoadedDetail value) loadedDetail, + required TResult Function(_ErrorDetail value) errorDetail, }) { return loaded(this); } @@ -605,6 +788,9 @@ class _$LoadedImpl implements _Loaded { TResult? Function(_Loading value)? loading, TResult? Function(_Loaded value)? loaded, TResult? Function(_Error value)? error, + TResult? Function(_LoadingDetail value)? loadingDetail, + TResult? Function(_LoadedDetail value)? loadedDetail, + TResult? Function(_ErrorDetail value)? errorDetail, }) { return loaded?.call(this); } @@ -616,6 +802,9 @@ class _$LoadedImpl implements _Loaded { TResult Function(_Loading value)? loading, TResult Function(_Loaded value)? loaded, TResult Function(_Error value)? error, + TResult Function(_LoadingDetail value)? loadingDetail, + TResult Function(_LoadedDetail value)? loadedDetail, + TResult Function(_ErrorDetail value)? errorDetail, required TResult orElse(), }) { if (loaded != null) { @@ -709,6 +898,9 @@ class _$ErrorImpl implements _Error { required TResult Function() loading, required TResult Function(List outlets) loaded, required TResult Function(String message) error, + required TResult Function() loadingDetail, + required TResult Function(Outlet outlet) loadedDetail, + required TResult Function(String message) errorDetail, }) { return error(message); } @@ -720,6 +912,9 @@ class _$ErrorImpl implements _Error { TResult? Function()? loading, TResult? Function(List outlets)? loaded, TResult? Function(String message)? error, + TResult? Function()? loadingDetail, + TResult? Function(Outlet outlet)? loadedDetail, + TResult? Function(String message)? errorDetail, }) { return error?.call(message); } @@ -731,6 +926,9 @@ class _$ErrorImpl implements _Error { TResult Function()? loading, TResult Function(List outlets)? loaded, TResult Function(String message)? error, + TResult Function()? loadingDetail, + TResult Function(Outlet outlet)? loadedDetail, + TResult Function(String message)? errorDetail, required TResult orElse(), }) { if (error != null) { @@ -746,6 +944,9 @@ class _$ErrorImpl implements _Error { required TResult Function(_Loading value) loading, required TResult Function(_Loaded value) loaded, required TResult Function(_Error value) error, + required TResult Function(_LoadingDetail value) loadingDetail, + required TResult Function(_LoadedDetail value) loadedDetail, + required TResult Function(_ErrorDetail value) errorDetail, }) { return error(this); } @@ -757,6 +958,9 @@ class _$ErrorImpl implements _Error { TResult? Function(_Loading value)? loading, TResult? Function(_Loaded value)? loaded, TResult? Function(_Error value)? error, + TResult? Function(_LoadingDetail value)? loadingDetail, + TResult? Function(_LoadedDetail value)? loadedDetail, + TResult? Function(_ErrorDetail value)? errorDetail, }) { return error?.call(this); } @@ -768,6 +972,9 @@ class _$ErrorImpl implements _Error { TResult Function(_Loading value)? loading, TResult Function(_Loaded value)? loaded, TResult Function(_Error value)? error, + TResult Function(_LoadingDetail value)? loadingDetail, + TResult Function(_LoadedDetail value)? loadedDetail, + TResult Function(_ErrorDetail value)? errorDetail, required TResult orElse(), }) { if (error != null) { @@ -788,3 +995,478 @@ abstract class _Error implements OutletLoaderState { _$$ErrorImplCopyWith<_$ErrorImpl> get copyWith => throw _privateConstructorUsedError; } + +/// @nodoc +abstract class _$$LoadingDetailImplCopyWith<$Res> { + factory _$$LoadingDetailImplCopyWith( + _$LoadingDetailImpl value, $Res Function(_$LoadingDetailImpl) then) = + __$$LoadingDetailImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$LoadingDetailImplCopyWithImpl<$Res> + extends _$OutletLoaderStateCopyWithImpl<$Res, _$LoadingDetailImpl> + implements _$$LoadingDetailImplCopyWith<$Res> { + __$$LoadingDetailImplCopyWithImpl( + _$LoadingDetailImpl _value, $Res Function(_$LoadingDetailImpl) _then) + : super(_value, _then); + + /// Create a copy of OutletLoaderState + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc + +class _$LoadingDetailImpl implements _LoadingDetail { + const _$LoadingDetailImpl(); + + @override + String toString() { + return 'OutletLoaderState.loadingDetail()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$LoadingDetailImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List outlets) loaded, + required TResult Function(String message) error, + required TResult Function() loadingDetail, + required TResult Function(Outlet outlet) loadedDetail, + required TResult Function(String message) errorDetail, + }) { + return loadingDetail(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List outlets)? loaded, + TResult? Function(String message)? error, + TResult? Function()? loadingDetail, + TResult? Function(Outlet outlet)? loadedDetail, + TResult? Function(String message)? errorDetail, + }) { + return loadingDetail?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List outlets)? loaded, + TResult Function(String message)? error, + TResult Function()? loadingDetail, + TResult Function(Outlet outlet)? loadedDetail, + TResult Function(String message)? errorDetail, + required TResult orElse(), + }) { + if (loadingDetail != null) { + return loadingDetail(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + required TResult Function(_LoadingDetail value) loadingDetail, + required TResult Function(_LoadedDetail value) loadedDetail, + required TResult Function(_ErrorDetail value) errorDetail, + }) { + return loadingDetail(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + TResult? Function(_LoadingDetail value)? loadingDetail, + TResult? Function(_LoadedDetail value)? loadedDetail, + TResult? Function(_ErrorDetail value)? errorDetail, + }) { + return loadingDetail?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + TResult Function(_LoadingDetail value)? loadingDetail, + TResult Function(_LoadedDetail value)? loadedDetail, + TResult Function(_ErrorDetail value)? errorDetail, + required TResult orElse(), + }) { + if (loadingDetail != null) { + return loadingDetail(this); + } + return orElse(); + } +} + +abstract class _LoadingDetail implements OutletLoaderState { + const factory _LoadingDetail() = _$LoadingDetailImpl; +} + +/// @nodoc +abstract class _$$LoadedDetailImplCopyWith<$Res> { + factory _$$LoadedDetailImplCopyWith( + _$LoadedDetailImpl value, $Res Function(_$LoadedDetailImpl) then) = + __$$LoadedDetailImplCopyWithImpl<$Res>; + @useResult + $Res call({Outlet outlet}); +} + +/// @nodoc +class __$$LoadedDetailImplCopyWithImpl<$Res> + extends _$OutletLoaderStateCopyWithImpl<$Res, _$LoadedDetailImpl> + implements _$$LoadedDetailImplCopyWith<$Res> { + __$$LoadedDetailImplCopyWithImpl( + _$LoadedDetailImpl _value, $Res Function(_$LoadedDetailImpl) _then) + : super(_value, _then); + + /// Create a copy of OutletLoaderState + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? outlet = null, + }) { + return _then(_$LoadedDetailImpl( + null == outlet + ? _value.outlet + : outlet // ignore: cast_nullable_to_non_nullable + as Outlet, + )); + } +} + +/// @nodoc + +class _$LoadedDetailImpl implements _LoadedDetail { + const _$LoadedDetailImpl(this.outlet); + + @override + final Outlet outlet; + + @override + String toString() { + return 'OutletLoaderState.loadedDetail(outlet: $outlet)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$LoadedDetailImpl && + (identical(other.outlet, outlet) || other.outlet == outlet)); + } + + @override + int get hashCode => Object.hash(runtimeType, outlet); + + /// Create a copy of OutletLoaderState + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$LoadedDetailImplCopyWith<_$LoadedDetailImpl> get copyWith => + __$$LoadedDetailImplCopyWithImpl<_$LoadedDetailImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List outlets) loaded, + required TResult Function(String message) error, + required TResult Function() loadingDetail, + required TResult Function(Outlet outlet) loadedDetail, + required TResult Function(String message) errorDetail, + }) { + return loadedDetail(outlet); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List outlets)? loaded, + TResult? Function(String message)? error, + TResult? Function()? loadingDetail, + TResult? Function(Outlet outlet)? loadedDetail, + TResult? Function(String message)? errorDetail, + }) { + return loadedDetail?.call(outlet); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List outlets)? loaded, + TResult Function(String message)? error, + TResult Function()? loadingDetail, + TResult Function(Outlet outlet)? loadedDetail, + TResult Function(String message)? errorDetail, + required TResult orElse(), + }) { + if (loadedDetail != null) { + return loadedDetail(outlet); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + required TResult Function(_LoadingDetail value) loadingDetail, + required TResult Function(_LoadedDetail value) loadedDetail, + required TResult Function(_ErrorDetail value) errorDetail, + }) { + return loadedDetail(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + TResult? Function(_LoadingDetail value)? loadingDetail, + TResult? Function(_LoadedDetail value)? loadedDetail, + TResult? Function(_ErrorDetail value)? errorDetail, + }) { + return loadedDetail?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + TResult Function(_LoadingDetail value)? loadingDetail, + TResult Function(_LoadedDetail value)? loadedDetail, + TResult Function(_ErrorDetail value)? errorDetail, + required TResult orElse(), + }) { + if (loadedDetail != null) { + return loadedDetail(this); + } + return orElse(); + } +} + +abstract class _LoadedDetail implements OutletLoaderState { + const factory _LoadedDetail(final Outlet outlet) = _$LoadedDetailImpl; + + Outlet get outlet; + + /// Create a copy of OutletLoaderState + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$LoadedDetailImplCopyWith<_$LoadedDetailImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$ErrorDetailImplCopyWith<$Res> { + factory _$$ErrorDetailImplCopyWith( + _$ErrorDetailImpl value, $Res Function(_$ErrorDetailImpl) then) = + __$$ErrorDetailImplCopyWithImpl<$Res>; + @useResult + $Res call({String message}); +} + +/// @nodoc +class __$$ErrorDetailImplCopyWithImpl<$Res> + extends _$OutletLoaderStateCopyWithImpl<$Res, _$ErrorDetailImpl> + implements _$$ErrorDetailImplCopyWith<$Res> { + __$$ErrorDetailImplCopyWithImpl( + _$ErrorDetailImpl _value, $Res Function(_$ErrorDetailImpl) _then) + : super(_value, _then); + + /// Create a copy of OutletLoaderState + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? message = null, + }) { + return _then(_$ErrorDetailImpl( + null == message + ? _value.message + : message // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ErrorDetailImpl implements _ErrorDetail { + const _$ErrorDetailImpl(this.message); + + @override + final String message; + + @override + String toString() { + return 'OutletLoaderState.errorDetail(message: $message)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ErrorDetailImpl && + (identical(other.message, message) || other.message == message)); + } + + @override + int get hashCode => Object.hash(runtimeType, message); + + /// Create a copy of OutletLoaderState + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$ErrorDetailImplCopyWith<_$ErrorDetailImpl> get copyWith => + __$$ErrorDetailImplCopyWithImpl<_$ErrorDetailImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function() initial, + required TResult Function() loading, + required TResult Function(List outlets) loaded, + required TResult Function(String message) error, + required TResult Function() loadingDetail, + required TResult Function(Outlet outlet) loadedDetail, + required TResult Function(String message) errorDetail, + }) { + return errorDetail(message); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function()? initial, + TResult? Function()? loading, + TResult? Function(List outlets)? loaded, + TResult? Function(String message)? error, + TResult? Function()? loadingDetail, + TResult? Function(Outlet outlet)? loadedDetail, + TResult? Function(String message)? errorDetail, + }) { + return errorDetail?.call(message); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function()? initial, + TResult Function()? loading, + TResult Function(List outlets)? loaded, + TResult Function(String message)? error, + TResult Function()? loadingDetail, + TResult Function(Outlet outlet)? loadedDetail, + TResult Function(String message)? errorDetail, + required TResult orElse(), + }) { + if (errorDetail != null) { + return errorDetail(message); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Initial value) initial, + required TResult Function(_Loading value) loading, + required TResult Function(_Loaded value) loaded, + required TResult Function(_Error value) error, + required TResult Function(_LoadingDetail value) loadingDetail, + required TResult Function(_LoadedDetail value) loadedDetail, + required TResult Function(_ErrorDetail value) errorDetail, + }) { + return errorDetail(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Initial value)? initial, + TResult? Function(_Loading value)? loading, + TResult? Function(_Loaded value)? loaded, + TResult? Function(_Error value)? error, + TResult? Function(_LoadingDetail value)? loadingDetail, + TResult? Function(_LoadedDetail value)? loadedDetail, + TResult? Function(_ErrorDetail value)? errorDetail, + }) { + return errorDetail?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Initial value)? initial, + TResult Function(_Loading value)? loading, + TResult Function(_Loaded value)? loaded, + TResult Function(_Error value)? error, + TResult Function(_LoadingDetail value)? loadingDetail, + TResult Function(_LoadedDetail value)? loadedDetail, + TResult Function(_ErrorDetail value)? errorDetail, + required TResult orElse(), + }) { + if (errorDetail != null) { + return errorDetail(this); + } + return orElse(); + } +} + +abstract class _ErrorDetail implements OutletLoaderState { + const factory _ErrorDetail(final String message) = _$ErrorDetailImpl; + + String get message; + + /// Create a copy of OutletLoaderState + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$ErrorDetailImplCopyWith<_$ErrorDetailImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/presentation/home/dialog/outlet_dialog.dart b/lib/presentation/home/dialog/outlet_dialog.dart index d900e71..46136a9 100644 --- a/lib/presentation/home/dialog/outlet_dialog.dart +++ b/lib/presentation/home/dialog/outlet_dialog.dart @@ -1,17 +1,30 @@ import 'package:enaklo_pos/core/components/custom_modal_dialog.dart'; +import 'package:enaklo_pos/core/extensions/build_context_ext.dart'; import 'package:enaklo_pos/presentation/home/bloc/outlet_loader/outlet_loader_bloc.dart'; import 'package:enaklo_pos/presentation/home/widgets/outlet_card.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -class OutletDialog extends StatelessWidget { +class OutletDialog extends StatefulWidget { const OutletDialog({super.key}); + @override + State createState() => _OutletDialogState(); +} + +class _OutletDialogState extends State { + @override + void initState() { + super.initState(); + context.read().add(OutletLoaderEvent.getOutlet()); + } + @override Widget build(BuildContext context) { return CustomModalDialog( title: 'Outlet', subtitle: 'Silahkan pilih outlet', + minWidth: context.deviceWidth * 0.4, contentPadding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 24.0), child: BlocBuilder( diff --git a/lib/presentation/home/models/outlet_model.dart b/lib/presentation/home/models/outlet_model.dart index 9f1c0f5..1023328 100644 --- a/lib/presentation/home/models/outlet_model.dart +++ b/lib/presentation/home/models/outlet_model.dart @@ -29,6 +29,36 @@ class OutletResponse { }; } +class OutletDetailResponse { + final bool? success; + final Outlet? data; + final dynamic errors; + + OutletDetailResponse({ + this.success, + this.data, + this.errors, + }); + + factory OutletDetailResponse.fromJson(String str) => + OutletDetailResponse.fromMap(json.decode(str)); + + String toJson() => json.encode(toMap()); + + factory OutletDetailResponse.fromMap(Map json) => + OutletDetailResponse( + success: json["success"], + data: json["data"] == null ? null : Outlet.fromMap(json["data"]), + errors: json["errors"], + ); + + Map toMap() => { + "success": success, + "data": data?.toMap(), + "errors": errors, + }; +} + class OutletData { final List? outlets; final int? totalCount; diff --git a/lib/presentation/home/pages/home_page.dart b/lib/presentation/home/pages/home_page.dart index e27f67b..e61d897 100644 --- a/lib/presentation/home/pages/home_page.dart +++ b/lib/presentation/home/pages/home_page.dart @@ -1,5 +1,6 @@ // ignore_for_file: public_member_api_docs, sort_constructors_first import 'package:enaklo_pos/core/components/flushbar.dart'; +import 'package:enaklo_pos/presentation/home/bloc/current_outlet/current_outlet_bloc.dart'; import 'package:enaklo_pos/presentation/home/bloc/outlet_loader/outlet_loader_bloc.dart'; import 'package:enaklo_pos/presentation/home/bloc/product_loader/product_loader_bloc.dart'; import 'package:enaklo_pos/presentation/home/widgets/home_right_title.dart'; @@ -67,7 +68,7 @@ class _HomePageState extends State { context.read().add(const CheckoutEvent.started()); // Get Outlets - context.read().add(const OutletLoaderEvent.getOutlet()); + context.read().add(CurrentOutletEvent.currentOutlet()); } void onCategoryTap(int index) { diff --git a/lib/presentation/home/widgets/home_title.dart b/lib/presentation/home/widgets/home_title.dart index 28275cc..2d1b876 100644 --- a/lib/presentation/home/widgets/home_title.dart +++ b/lib/presentation/home/widgets/home_title.dart @@ -1,7 +1,9 @@ import 'package:enaklo_pos/core/components/spaces.dart'; import 'package:enaklo_pos/core/extensions/build_context_ext.dart'; +import 'package:enaklo_pos/presentation/home/bloc/current_outlet/current_outlet_bloc.dart'; import 'package:enaklo_pos/presentation/home/dialog/outlet_dialog.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../core/components/search_input.dart'; import '../../../core/constants/colors.dart'; @@ -32,23 +34,46 @@ class HomeTitle extends StatelessWidget { context: context, builder: (context) => OutletDialog(), ), - child: Row( - children: [ - const Text( - 'DEFAULT OUTLET', - style: TextStyle( - color: AppColors.primary, - fontSize: 20, - fontWeight: FontWeight.w600, - ), - ), - SpaceWidth(2), - Icon(Icons.keyboard_arrow_down, color: AppColors.primary), - ], + child: BlocBuilder( + builder: (context, state) { + return Row( + children: [ + state.maybeWhen( + orElse: () => const Text( + 'DEFAULT OUTLET', + style: TextStyle( + color: AppColors.primary, + fontSize: 18, + fontWeight: FontWeight.w600, + ), + ), + loading: () => Center( + child: SizedBox( + height: 16, + width: 16, + child: CircularProgressIndicator( + color: AppColors.primary, + ), + ), + ), + loaded: (outlet) => Text( + outlet.name ?? 'DEFAULT OUTLET', + style: TextStyle( + color: AppColors.primary, + fontSize: 18, + fontWeight: FontWeight.w600, + ), + ), + ), + SpaceWidth(2), + Icon(Icons.keyboard_arrow_down, color: AppColors.primary), + ], + ); + }, ), ), SizedBox( - width: 300.0, + width: context.deviceWidth * 0.2, child: SearchInput( controller: controller, onChanged: onChanged,