6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit 77d048d5

AuthorMikkel Thygesen<mikkelet@gmail.com>
Date2026-02-27 12:39:13 +0100
2922: added delivery time picker

Changed files

.../screens/review_order/review_order_screen.dart  | 65 +++++++++++++++-------
 .../review_order/widget/delivery_time_picker.dart  | 44 +++++++++++++++
 2 files changed, 88 insertions(+), 21 deletions(-)

Diff

diff --git a/concierge/lib/presentation/screens/review_order/review_order_screen.dart b/concierge/lib/presentation/screens/review_order/review_order_screen.dart
index 3ef91a12..cbe4c04e 100644
--- a/concierge/lib/presentation/screens/review_order/review_order_screen.dart
+++ b/concierge/lib/presentation/screens/review_order/review_order_screen.dart
@@ -1,6 +1,7 @@
import 'package:concierge/data/remote/models/product.dart';
import 'package:concierge/presentation/app/cart_cubit.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';
@@ -16,7 +17,6 @@ class ReviewOrderScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
- final cartCubit = context.watch<CartCubit>();
final cubit = context.read<ReviewOrderCubit>();
return BlocBuilder<ReviewOrderCubit, ReviewOrderState>(
builder: (context, state) {
@@ -29,25 +29,25 @@ class ReviewOrderScreen extends StatelessWidget {
],
child: Scaffold(
bottomNavigationBar: ReviewOrderAppBar(),
- body: Stack(
- children: [
- SingleChildScrollView(
- child: PaddedColumn(
- padding: EdgeInsets.symmetric(horizontal: 16),
- children: [
- Gap(48),
- Text("Din Bestilling", style: TextStyle(fontSize: 20)),
- Gap(48),
- if (cartCubit.products.isNotEmpty) const DeliveryMethodPicker(),
- ...buildProducts(context, cartCubit.products),
- Gap(36),
- if (cartCubit.products.isNotEmpty) ...buildCommentField(context),
- Gap(36),
- ],
- ),
- ),
- BevelledAppBar(),
- ],
+ 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(),
+ ],
+ );
+ },
),
),
);
@@ -55,13 +55,36 @@ class ReviewOrderScreen extends StatelessWidget {
);
}
+ Iterable<Widget> buildContent(BuildContext context) sync* {
+ final cartCubit = context.watch<CartCubit>();
+ yield* [
+ Gap(100), // app bar offset
+ Gap(48),
+ Text("Din Bestilling", 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> buildCommentField(BuildContext context) sync* {
final cartCubit = context.watch<CartCubit>();
yield Text("Kommentar til ordre", style: TextStyle(fontSize: 20));
yield Gap(16);
yield TextField(
controller: cartCubit.orderCommentController,
- maxLines: 3,
+ minLines: 3,
+ maxLines: 5,
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.grey, width: 1),
diff --git a/concierge/lib/presentation/screens/review_order/widget/delivery_time_picker.dart b/concierge/lib/presentation/screens/review_order/widget/delivery_time_picker.dart
new file mode 100644
index 00000000..131ba478
--- /dev/null
+++ b/concierge/lib/presentation/screens/review_order/widget/delivery_time_picker.dart
@@ -0,0 +1,44 @@
+import 'package:concierge/domain/models/delivery_method.dart';
+import 'package:concierge/presentation/app/cart_cubit.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+Iterable<String> _deliveryTimes() sync* {
+ yield "Hurtigst muligt";
+ for (var i = 16; i < 24; i++) {
+ yield* ["$i:00", "$i:30"];
+ }
+}
+
+class DeliveryTimePicker extends StatelessWidget {
+ const DeliveryTimePicker({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ final cartCubit = context.read<CartCubit>();
+ final times = _deliveryTimes().toList();
+ return SizedBox(
+ height: 40,
+ child: ListView.builder(
+ scrollDirection: Axis.horizontal,
+ itemCount: times.length,
+ itemBuilder: (context, index) {
+ final time = times[index];
+ final isSelected = switch (cartCubit.state.deliveryMethod) {
+ Delivery delivery => delivery.time == time,
+ _ => false,
+ };
+ return TextButton(
+ onPressed: () {
+ cartCubit.updateDelivery(DeliveryMethod.delivery(time));
+ },
+ child: Text(
+ time,
+ style: TextStyle(color: isSelected ? Colors.black : Colors.grey),
+ ),
+ );
+ },
+ ),
+ );
+ }
+}