diff --git a/lib/core/di/injection_container.config.dart b/lib/core/di/injection_container.config.dart index 75fa593..5d4f2cf 100644 --- a/lib/core/di/injection_container.config.dart +++ b/lib/core/di/injection_container.config.dart @@ -12,6 +12,7 @@ import 'package:get_it/get_it.dart' as _i174; import 'package:injectable/injectable.dart' as _i526; +import '../../feature/basket/presentation/blocs/basket_bloc.dart' as _i728; import '../../feature/common/presentation/blocs/language_bloc/language_bloc.dart' as _i942; import '../../feature/home/presentation/blocs/home_bloc/home_bloc.dart' @@ -34,6 +35,7 @@ extension GetItInjectableX on _i174.GetIt { gh.factory<_i1007.HomeBloc>(() => _i1007.HomeBloc()); gh.factory<_i580.MainBloc>(() => _i580.MainBloc()); gh.factory<_i311.SplashBloc>(() => _i311.SplashBloc()); + gh.factory<_i728.BasketBloc>(() => _i728.BasketBloc()); gh.singleton<_i306.StorageService>(() => _i306.StorageService()); gh.singleton<_i152.AppRoutes>(() => _i152.AppRoutes()); gh.factory<_i942.LanguageBloc>( diff --git a/lib/feature/basket/basket.dart b/lib/feature/basket/basket.dart index 559d8b5..e7e41b4 100644 --- a/lib/feature/basket/basket.dart +++ b/lib/feature/basket/basket.dart @@ -1 +1,5 @@ -export 'presentation/pages/basket_page/basket_page.dart'; \ No newline at end of file +export 'presentation/pages/basket_page/basket_page.dart'; +export 'package:food_delivery_client/feature/basket/presentation/pages/basket_page/widgets/w_basket_empty.dart'; +export 'package:food_delivery_client/feature/basket/presentation/pages/basket_page/widgets/w_basket_header.dart'; +export 'presentation/blocs/basket_bloc.dart'; +export 'package:food_delivery_client/feature/basket/presentation/pages/basket_page/widgets/w_basket_body.dart'; diff --git a/lib/feature/basket/presentation/blocs/basket_bloc.dart b/lib/feature/basket/presentation/blocs/basket_bloc.dart new file mode 100644 index 0000000..662b62d --- /dev/null +++ b/lib/feature/basket/presentation/blocs/basket_bloc.dart @@ -0,0 +1,20 @@ +import 'package:food_delivery_client/food_delivery_client.dart'; + +part 'basket_event.dart'; + +part 'basket_state.dart'; + +part 'basket_bloc.freezed.dart'; + +@injectable +class BasketBloc extends Bloc { + BasketBloc() : super(const BasketState()) { + on<_Started>(_onStarted); + } + + _onStarted(_Started event, Emitter emit) async { + emit(state.copyWith(status: RequestStatus.loading)); + await Future.delayed(TimeDelayConst.duration3); + emit(state.copyWith(status: RequestStatus.loaded)); + } +} diff --git a/lib/feature/basket/presentation/blocs/basket_event.dart b/lib/feature/basket/presentation/blocs/basket_event.dart new file mode 100644 index 0000000..2340f66 --- /dev/null +++ b/lib/feature/basket/presentation/blocs/basket_event.dart @@ -0,0 +1,6 @@ +part of 'basket_bloc.dart'; + +@freezed +class BasketEvent with _$BasketEvent { + const factory BasketEvent.started() = _Started; +} diff --git a/lib/feature/basket/presentation/blocs/basket_state.dart b/lib/feature/basket/presentation/blocs/basket_state.dart new file mode 100644 index 0000000..feb368b --- /dev/null +++ b/lib/feature/basket/presentation/blocs/basket_state.dart @@ -0,0 +1,9 @@ +part of 'basket_bloc.dart'; + +@freezed +abstract class BasketState with _$BasketState { + const factory BasketState({ + @Default(RequestStatus.initial) RequestStatus status, + @Default([]) List orders, + }) = _BasketState; +} diff --git a/lib/feature/basket/presentation/pages/basket_page/basket_page.dart b/lib/feature/basket/presentation/pages/basket_page/basket_page.dart index 5c4b5e7..9bd0ac2 100644 --- a/lib/feature/basket/presentation/pages/basket_page/basket_page.dart +++ b/lib/feature/basket/presentation/pages/basket_page/basket_page.dart @@ -1,6 +1,3 @@ -import 'package:food_delivery_client/feature/basket/presentation/pages/basket_page/widgets/w_basket_empty.dart'; -import 'package:food_delivery_client/feature/basket/presentation/pages/basket_page/widgets/w_basket_header.dart'; - import '../../../../../food_delivery_client.dart'; class BasketPage extends StatelessWidget { @@ -8,10 +5,13 @@ class BasketPage extends StatelessWidget { @override Widget build(BuildContext context) { - return WLayout( - child: Scaffold(body: Column(children: [ - WBasketHeader(), - WBasketEmpty()])), + return BlocProvider( + create: (context) => sl()..add(BasketEvent.started()), + child: BlocBuilder( + builder: (context, state) { + return WLayout(child: Scaffold(body: WBasketBody())); + }, + ), ); } } diff --git a/lib/feature/basket/presentation/pages/basket_page/widgets/w_basket_body.dart b/lib/feature/basket/presentation/pages/basket_page/widgets/w_basket_body.dart new file mode 100644 index 0000000..affb21d --- /dev/null +++ b/lib/feature/basket/presentation/pages/basket_page/widgets/w_basket_body.dart @@ -0,0 +1,25 @@ +import 'package:food_delivery_client/feature/basket/presentation/pages/basket_page/widgets/w_basket_loading.dart'; + +import '../../../../../../food_delivery_client.dart'; + +class WBasketBody extends StatelessWidget { + const WBasketBody({super.key}); + + @override + Widget build(BuildContext context) { + return BlocBuilder( + builder: (context, state) { + return Column( + children: [ + WBasketHeader(), + OrderItem(), + + if (state.status.isLoading()) Text("Loading"), + if (state.status.isLoaded()) + if (state.orders.isEmpty) WBasketEmpty(), + ], + ); + }, + ); + } +} diff --git a/lib/feature/basket/presentation/pages/basket_page/widgets/w_basket_loading.dart b/lib/feature/basket/presentation/pages/basket_page/widgets/w_basket_loading.dart new file mode 100644 index 0000000..bddb00b --- /dev/null +++ b/lib/feature/basket/presentation/pages/basket_page/widgets/w_basket_loading.dart @@ -0,0 +1,64 @@ +import '../../../../../../food_delivery_client.dart'; + +class WBasketLoading extends StatelessWidget { + const WBasketLoading({super.key}); + + @override + Widget build(BuildContext context) { + return Column(children: []); + } +} + +class OrderItem extends StatelessWidget { + const OrderItem({super.key}); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () {}, + child: Ink( + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ClipRRect( + borderRadius: AppUtils.kBorderRadius40, + child: CachedNetworkImage( + imageUrl: AppLocaleKeys.imageUrl, + height: 70, + width: 70, + fit: BoxFit.cover, + ), + ), + 16.horizontalSpace, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("Begs & Megs", style: AppTextStyles.size16Medium), + Text( + "1 item", + style: AppTextStyles.size14Regular.copyWith( + color: AppColors.c6B6B6B, + ), + ), + Text( + "Deliver to San Franciscao Bay Area", + style: AppTextStyles.size14Regular.copyWith( + color: AppColors.c6B6B6B, + ), + ), + ], + ), + const Spacer(), + Icon(Icons.arrow_forward_ios_outlined), + ], + ).paddingSymmetric(vertical: 10, horizontal: 16), + 10.verticalSpace, + WDivider(indent: 120, endIndent: 20, height: 1), + ], + ), + ), + ); + } +} diff --git a/lib/feature/common/presentation/widgets/w_divider.dart b/lib/feature/common/presentation/widgets/w_divider.dart index 5372571..85e27cc 100644 --- a/lib/feature/common/presentation/widgets/w_divider.dart +++ b/lib/feature/common/presentation/widgets/w_divider.dart @@ -18,8 +18,8 @@ class WDivider extends StatelessWidget { color: AppColors.cF6F6F6, height: height, thickness: height, - endIndent: 0, - indent: 0, + endIndent: endIndent??0, + indent:indent?? 0, ); } }