import 'package:common/localization/l10n_utils.dart';
import 'package:concierge/data/remote/models/product.dart';
import 'package:concierge/presentation/app/cart_cubit.dart';
import 'package:concierge/presentation/widgets/comment_field.dart';
import 'package:concierge/presentation/screens/review_order/widget/delivery_method_picker.dart';
import 'package:concierge/presentation/screens/review_order/widget/delivery_time_picker.dart';
import 'package:concierge/presentation/screens/review_order/widget/product_in_cart_list_tile.dart';
import 'package:concierge/presentation/screens/review_order/widget/review_order_app_bar.dart';
import 'package:concierge/presentation/widgets/bevelled_app_bar.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:concierge/presentation/screens/review_order/bloc/review_order_cubit.dart';
import 'package:concierge/presentation/screens/review_order/bloc/review_order_state.dart';
import 'package:gap/gap.dart';
class ReviewOrderScreen extends StatelessWidget {
const ReviewOrderScreen({super.key});
@override
Widget build(BuildContext context) {
final cubit = context.read<ReviewOrderCubit>();
return BlocBuilder<ReviewOrderCubit, ReviewOrderState>(
builder: (context, state) {
return MultiBlocListener(
listeners: [
BlocListener<ReviewOrderCubit, ReviewOrderState>(
listenWhen: (prev, curr) => prev.isLoading && curr.error.isError,
listener: (context, state) {},
),
],
child: Scaffold(
bottomNavigationBar: ReviewOrderAppBar(),
body: Builder(
builder: (context) {
final widgets = buildContent(context).toList();
return Stack(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: ListView.builder(
itemCount: widgets.length,
itemBuilder: (context, index) {
final widget = widgets[index];
return widget;
},
),
),
BevelledAppBar(
showBack: true,
showClose: false,
),
],
);
},
),
),
);
},
);
}
Iterable<Widget> buildContent(BuildContext context) sync* {
final cartCubit = context.watch<CartCubit>();
yield* [
Gap(100), // app bar offset
Gap(48),
Text(context.strings.your_order, style: TextStyle(fontSize: 20)),
Gap(48),
if (cartCubit.products.isNotEmpty) ...buildDeliveryMethod(context),
...buildProducts(context, cartCubit.products),
Gap(36),
if (cartCubit.products.isNotEmpty) ...buildCommentField(context),
Gap(36),
];
}
Iterable<Widget> buildDeliveryMethod(BuildContext context) sync* {
yield DeliveryMethodPicker();
yield Gap(16);
yield Divider(color: Colors.grey.shade300);
yield DeliveryTimePicker();
}
Iterable<Widget> buildProducts(BuildContext context, Iterable<Product> products) sync* {
if (products.isEmpty) {
yield Gap(36);
yield Center(
child: Text(context.strings.no_products_in_cart),
);
} else {
yield Divider(color: Colors.grey.shade300);
}
for (final product in products) {
Gap(16);
yield ProductInCartListTile(product: product);
Gap(16);
yield Divider(color: Colors.grey.shade300);
}
}
}