6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit 26b4c51c

AuthorEdmir Suljic<esu@dwarf.dk>
Date2025-06-27 13:05:27 +0200
Mid fix

Changed files

comwell_key_app/assets/translations/da-DK.json     |   4 +-
 comwell_key_app/assets/translations/en-US.json     |   4 +-
 .../choose_share_room/choose_share_room_page.dart  |  87 ++++++++++++++
 .../choose_share_room_repository.dart              |   5 +
 .../components/choose_room_widget.dart             | 126 +++++++++++++++++++++
 .../cubit/choose_share_room_cubit.dart             |   9 ++
 .../cubit/choose_share_room_state.dart             |   3 +
 .../components/current_booking_list_item_view.dart |  55 ++-------
 .../components/current_bookings_tab_view.dart      |  14 ++-
 .../overview/components/prepare_room_widget.dart   |  53 +++++++++
 .../overview/components/room_selection_widget.dart |  64 +++++++++++
 comwell_key_app/lib/routing/app_router.dart        |  13 +++
 comwell_key_app/lib/routing/app_routes.dart        |   1 +
 comwell_key_app/lib/utils/locator.dart             |   3 +
 14 files changed, 392 insertions(+), 49 deletions(-)

Diff

diff --git a/comwell_key_app/assets/translations/da-DK.json b/comwell_key_app/assets/translations/da-DK.json
index dd0fe441..6bd6c7d3 100644
--- a/comwell_key_app/assets/translations/da-DK.json
+++ b/comwell_key_app/assets/translations/da-DK.json
@@ -286,5 +286,7 @@
"confirm_up_sales_dialog_confirm": "Ja, tilføj tilkøb",
"confirm_up_sales_dialog_cancel": "Nej",
"email_launch_error": "Kunne ikke åbne email klient",
- "phone_launch_error": "Kunne ikke åbne telefon"
+ "phone_launch_error": "Kunne ikke åbne telefon",
+ "room_selection": "Vælg værelse",
+ "room_selection_subtitle": "Vælg et værelse til dit ophold"
}
\ No newline at end of file
diff --git a/comwell_key_app/assets/translations/en-US.json b/comwell_key_app/assets/translations/en-US.json
index 240f9c05..c1e31107 100644
--- a/comwell_key_app/assets/translations/en-US.json
+++ b/comwell_key_app/assets/translations/en-US.json
@@ -285,6 +285,8 @@
"confirm_up_sales_dialog_confirm": "Yes, add upgrades",
"confirm_up_sales_dialog_cancel": "No",
"email_launch_error": "Could not launch email client",
- "phone_launch_error": "Could not launch phone call"
+ "phone_launch_error": "Could not launch phone call",
+ "room_selection": "Room selection",
+ "room_selection_subtitle": "Select a room for your stay"
}
diff --git a/comwell_key_app/lib/choose_share_room/choose_share_room_page.dart b/comwell_key_app/lib/choose_share_room/choose_share_room_page.dart
new file mode 100644
index 00000000..0c90a42a
--- /dev/null
+++ b/comwell_key_app/lib/choose_share_room/choose_share_room_page.dart
@@ -0,0 +1,87 @@
+import 'package:flutter/material.dart';
+import 'package:comwell_key_app/choose_share_room/components/choose_room_widget.dart';
+import 'package:comwell_key_app/themes/light_theme.dart';
+
+class ChooseShareRoomPage extends StatelessWidget {
+ const ChooseShareRoomPage({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+ return Scaffold(
+ backgroundColor: Colors.white,
+ appBar: PreferredSize(
+ preferredSize: const Size.fromHeight(80),
+ child: Container(
+ decoration: BoxDecoration(
+ color: sandColor[20],
+ borderRadius: const BorderRadius.only(
+ bottomLeft: Radius.circular(32),
+ bottomRight: Radius.circular(32),
+ ),
+ ),
+ child: SafeArea(
+ child: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ IconButton(
+ icon: const Icon(Icons.arrow_back_ios_new_rounded),
+ onPressed: () => Navigator.of(context).pop(),
+ ),
+ const Spacer(),
+ IconButton(
+ icon: const Icon(Icons.person_outline),
+ onPressed: () {},
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ body: Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: ListView(
+ children: [
+ const SizedBox(height: 24),
+ Text(
+ 'Vælg dit værelse',
+ style: theme.textTheme.headlineLarge,
+ ),
+ const SizedBox(height: 8),
+ Text(
+ 'Du skal vælge dét værelse du gerne vil sove på. Når du har valgt, kan du tildele de andre værelser til andre.',
+ style: theme.textTheme.bodySmall,
+ ),
+ const SizedBox(height: 24),
+ ChooseRoomWidget(
+ roomName: 'Standard Single Room',
+ description: 'Overnatning med morgenmad',
+ guests: 1,
+ imageAsset: 'assets/images/current_room.png',
+ onSelect: () {},
+ ),
+ ChooseRoomWidget(
+ roomName: 'Standard Twin Room',
+ description: 'Overnatning med morgenmad',
+ guests: 2,
+ imageAsset: 'assets/images/borupgaard.png',
+ extraInfo: 'Babyseng',
+ onSelect: () {},
+ ),
+ ChooseRoomWidget(
+ roomName: 'Standard Twin Room',
+ description: 'Overnatning med morgenmad',
+ guests: 2,
+ imageAsset: 'assets/images/borupgaard.png',
+ onSelect: () {},
+ ),
+ const SizedBox(height: 32),
+ ],
+ ),
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/comwell_key_app/lib/choose_share_room/choose_share_room_repository.dart b/comwell_key_app/lib/choose_share_room/choose_share_room_repository.dart
new file mode 100644
index 00000000..11663b35
--- /dev/null
+++ b/comwell_key_app/lib/choose_share_room/choose_share_room_repository.dart
@@ -0,0 +1,5 @@
+class ChooseShareRoomRepository {
+ String baseUrl;
+
+ ChooseShareRoomRepository({ this.baseUrl = ''});
+}
\ No newline at end of file
diff --git a/comwell_key_app/lib/choose_share_room/components/choose_room_widget.dart b/comwell_key_app/lib/choose_share_room/components/choose_room_widget.dart
new file mode 100644
index 00000000..b38064e3
--- /dev/null
+++ b/comwell_key_app/lib/choose_share_room/components/choose_room_widget.dart
@@ -0,0 +1,126 @@
+import 'package:flutter/material.dart';
+import 'package:comwell_key_app/themes/light_theme.dart';
+import 'package:flutter_svg/svg.dart';
+
+class ChooseRoomWidget extends StatelessWidget {
+ final String roomName;
+ final String description;
+ final int guests;
+ final String imageAsset;
+ final String? extraInfo;
+ final VoidCallback onSelect;
+
+ const ChooseRoomWidget({
+ super.key,
+ required this.roomName,
+ required this.description,
+ required this.guests,
+ required this.imageAsset,
+ this.extraInfo,
+ required this.onSelect,
+ });
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+ return Container(
+ margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
+ decoration: BoxDecoration(
+ border: Border.all(color: colorDivider),
+ borderRadius: BorderRadius.circular(16),
+ ),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ roomName,
+ style: theme.textTheme.headlineSmall,
+ ),
+ const SizedBox(height: 2),
+ Text(
+ description,
+ style: theme.textTheme.bodySmall,
+ ),
+ const SizedBox(height: 12),
+ Row(
+ children: [
+ SvgPicture.asset("assets/icons/user-circle.svg", width: 20, height: 20),
+ const SizedBox(width: 4),
+ Text(
+ guests == 1 ? '1 voksen' : '$guests voksne',
+ style: theme.textTheme.bodySmall,
+ ),
+ const SizedBox(width: 8),
+
+
+ ],
+ ),
+ ],
+ ),
+ ),
+ const SizedBox(width: 8),
+ ClipRRect(
+ borderRadius: BorderRadius.circular(12),
+ child: Image.asset(
+ imageAsset,
+ width: 72,
+ height: 72,
+ fit: BoxFit.cover,
+ ),
+ ),
+ ],
+ ),
+ ),
+ if (extraInfo != null) ...[
+ const SizedBox(height: 8),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16.0),
+ child: Text(
+ 'Tilkøbt på værelse',
+ style: theme.textTheme.bodySmall,
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16.0),
+ child: Text(
+ extraInfo!,
+ style: theme.textTheme.bodySmall
+ ?.copyWith(fontWeight: FontWeight.bold),
+ ),
+ ),
+ const SizedBox(height: 8),
+ ],
+ Column(
+ children: [
+ const Divider(color: colorDivider),
+ Padding(
+ padding: const EdgeInsets.only(left: 16.0, right: 16.0, top: 8.0, bottom: 16.0),
+ child: SizedBox(
+ width: double.infinity,
+ child: ElevatedButton(
+ style: ElevatedButton.styleFrom(
+ elevation: 0,
+ foregroundColor: Colors.white,
+ ),
+ onPressed: onSelect,
+ child: const Text('Vælg værelse'),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/choose_share_room/cubit/choose_share_room_cubit.dart b/comwell_key_app/lib/choose_share_room/cubit/choose_share_room_cubit.dart
new file mode 100644
index 00000000..b9e9f132
--- /dev/null
+++ b/comwell_key_app/lib/choose_share_room/cubit/choose_share_room_cubit.dart
@@ -0,0 +1,9 @@
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+class ChooseShareRoomCubit extends Cubit<ChooseShareRoomState> {
+ ChooseShareRoomCubit() : super(ChooseShareRoomInitial());
+}
+
+class ChooseShareRoomState {}
+
+class ChooseShareRoomInitial extends ChooseShareRoomState {}
\ No newline at end of file
diff --git a/comwell_key_app/lib/choose_share_room/cubit/choose_share_room_state.dart b/comwell_key_app/lib/choose_share_room/cubit/choose_share_room_state.dart
new file mode 100644
index 00000000..cd0e985f
--- /dev/null
+++ b/comwell_key_app/lib/choose_share_room/cubit/choose_share_room_state.dart
@@ -0,0 +1,3 @@
+class ChooseShareRoomState {}
+
+class ChooseShareRoomInitial extends ChooseShareRoomState {}
\ No newline at end of file
diff --git a/comwell_key_app/lib/overview/components/current_booking_list_item_view.dart b/comwell_key_app/lib/overview/components/current_booking_list_item_view.dart
index d6f5870a..0299cd88 100644
--- a/comwell_key_app/lib/overview/components/current_booking_list_item_view.dart
+++ b/comwell_key_app/lib/overview/components/current_booking_list_item_view.dart
@@ -1,3 +1,5 @@
+import 'package:comwell_key_app/overview/components/prepare_room_widget.dart';
+import 'package:comwell_key_app/overview/components/room_selection_widget.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
@@ -15,7 +17,9 @@ class CurrentBookingListItem extends StatelessWidget {
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Container(
- height: 327,
+ height: booking.reservationStatus == ReservationStatus.newreservation
+ ? 327
+ : 258,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(10)),
border: Border.all(
@@ -81,50 +85,13 @@ class CurrentBookingListItem extends StatelessWidget {
],
),
),
- Divider(
- color: Colors.grey.shade300,
- ),
- Padding(
- padding:
- const EdgeInsets.only(left: 16, right: 8, top: 8, bottom: 8),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.start,
- children: [
- Container(
- height: 36,
- padding: const EdgeInsets.all(8),
- decoration: BoxDecoration(
- color: sandColor[20],
- shape: BoxShape.circle,
- ),
- child: SvgPicture.asset("assets/icons/check-in.svg"),
- ),
- const SizedBox(width: 8),
- Expanded(
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(
- "prepare_room".tr(),
- style: theme.textTheme.bodyMedium,
- textAlign: TextAlign.start,
- ),
- Text(
- "jump_line_text".tr(),
- overflow: TextOverflow.ellipsis,
- textAlign: TextAlign.start,
- style: theme.textTheme.bodySmall?.copyWith(
- color: colorHeadlineText,
- ),
- ),
- ],
- ),
- ),
- const SizedBox(width: 8),
- SvgPicture.asset("assets/icons/arrow-left.svg"),
- ],
+ if (booking.reservationStatus ==
+ ReservationStatus.newreservation) ...[
+ Divider(
+ color: Colors.grey.shade300,
),
- ),
+ const PrepareRoomWidget()
+ ],
],
),
),
diff --git a/comwell_key_app/lib/overview/components/current_bookings_tab_view.dart b/comwell_key_app/lib/overview/components/current_bookings_tab_view.dart
index ee396ca4..740a8240 100644
--- a/comwell_key_app/lib/overview/components/current_bookings_tab_view.dart
+++ b/comwell_key_app/lib/overview/components/current_bookings_tab_view.dart
@@ -1,4 +1,5 @@
import 'package:comwell_key_app/overview/components/current_booking_list_item_view.dart';
+import 'package:comwell_key_app/overview/components/room_selection_widget.dart';
import 'package:comwell_key_app/overview/cubit/overview_cubit.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
@@ -98,9 +99,16 @@ class CurrentBookingsTabView extends StatelessWidget {
return ListView.builder(
shrinkWrap: true,
itemCount: bookings.length,
- itemBuilder: (context, index) => CurrentBookingListItem(
- booking: bookings.elementAt(index),
- ),
+ itemBuilder: (context, index) {
+ final booking = bookings.elementAt(index);
+ return Column(
+ children: [
+ CurrentBookingListItem(booking: booking),
+ if (booking.reservationStatus == ReservationStatus.checkedin)
+ const RoomSelectionWidget(),
+ ],
+ );
+ },
);
}
},
diff --git a/comwell_key_app/lib/overview/components/prepare_room_widget.dart b/comwell_key_app/lib/overview/components/prepare_room_widget.dart
new file mode 100644
index 00000000..3937e422
--- /dev/null
+++ b/comwell_key_app/lib/overview/components/prepare_room_widget.dart
@@ -0,0 +1,53 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:comwell_key_app/themes/light_theme.dart';
+
+class PrepareRoomWidget extends StatelessWidget {
+ const PrepareRoomWidget({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+ return Padding(
+ padding: const EdgeInsets.only(left: 16, right: 8, top: 8, bottom: 8),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Container(
+ height: 36,
+ padding: const EdgeInsets.all(8),
+ decoration: BoxDecoration(
+ color: sandColor[20],
+ shape: BoxShape.circle,
+ ),
+ child: SvgPicture.asset("assets/icons/check-in.svg"),
+ ),
+ const SizedBox(width: 8),
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ "prepare_room".tr(),
+ style: theme.textTheme.bodyMedium,
+ textAlign: TextAlign.start,
+ ),
+ Text(
+ "jump_line_text".tr(),
+ overflow: TextOverflow.ellipsis,
+ textAlign: TextAlign.start,
+ style: theme.textTheme.bodySmall?.copyWith(
+ color: colorHeadlineText,
+ ),
+ ),
+ ],
+ ),
+ ),
+ const SizedBox(width: 8),
+ SvgPicture.asset("assets/icons/arrow-left.svg"),
+ ],
+ ),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/overview/components/room_selection_widget.dart b/comwell_key_app/lib/overview/components/room_selection_widget.dart
new file mode 100644
index 00000000..5fecc73b
--- /dev/null
+++ b/comwell_key_app/lib/overview/components/room_selection_widget.dart
@@ -0,0 +1,64 @@
+import 'package:comwell_key_app/routing/app_routes.dart';
+import 'package:comwell_key_app/themes/light_theme.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+
+class RoomSelectionWidget extends StatelessWidget {
+
+ const RoomSelectionWidget({
+ super.key,
+ });
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+ return Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: InkWell(
+ onTap: () {
+ context.pushNamed(AppRoutes.chooseShareRoom.name);
+ },
+ child: Container(
+ decoration: BoxDecoration(
+ color: sandColor[20],
+ borderRadius: BorderRadius.circular(10),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(16),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ "room_selection".tr(),
+ style: theme.textTheme.bodyMedium,
+ textAlign: TextAlign.start,
+ ),
+ Text(
+ "room_selection_subtitle".tr(),
+ style: theme.textTheme.bodySmall?.copyWith(
+ color: colorHeadlineText,
+ ),
+ textAlign: TextAlign.start,
+ ),
+ ],
+ ),
+ ),
+ const SizedBox(width: 8),
+ const Icon(
+ Icons.arrow_forward_ios,
+ color: Colors.black,
+ size: 28,
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/routing/app_router.dart b/comwell_key_app/lib/routing/app_router.dart
index 596dd8e3..df46eb44 100644
--- a/comwell_key_app/lib/routing/app_router.dart
+++ b/comwell_key_app/lib/routing/app_router.dart
@@ -5,6 +5,8 @@ import 'package:comwell_key_app/check_in/check_in_page.dart';
import 'package:comwell_key_app/check_out/bloc/check_out_cubit.dart';
import 'package:comwell_key_app/check_out/bloc/check_out_state.dart';
import 'package:comwell_key_app/check_out/check_out_flow.dart';
+import 'package:comwell_key_app/choose_share_room/choose_share_room_page.dart';
+import 'package:comwell_key_app/choose_share_room/cubit/choose_share_room_cubit.dart';
import 'package:comwell_key_app/common/const.dart';
import 'package:comwell_key_app/contact/contact_page.dart';
import 'package:comwell_key_app/contact/cubit/contact_cubit.dart';
@@ -428,6 +430,17 @@ GoRouter goRouter() {
);
},
),
+ GoRoute(
+ path: "/${AppRoutes.chooseShareRoom.name}",
+ name: AppRoutes.chooseShareRoom.name,
+ builder: (context, state) {
+ return BlocProvider(
+ create: (context) => ChooseShareRoomCubit(
+ ),
+ child: const ChooseShareRoomPage(),
+ );
+ },
+ ),
/* GoRoute(
path: "/keys",
name: AppRoutes.keys.name,
diff --git a/comwell_key_app/lib/routing/app_routes.dart b/comwell_key_app/lib/routing/app_routes.dart
index 0e3e2d81..73154756 100644
--- a/comwell_key_app/lib/routing/app_routes.dart
+++ b/comwell_key_app/lib/routing/app_routes.dart
@@ -31,4 +31,5 @@ enum AppRoutes {
otherUpgrade,
upSaleConfirmation,
upSalesAnimation,
+ chooseShareRoom,
}
diff --git a/comwell_key_app/lib/utils/locator.dart b/comwell_key_app/lib/utils/locator.dart
index 5a0ccb61..f2557758 100644
--- a/comwell_key_app/lib/utils/locator.dart
+++ b/comwell_key_app/lib/utils/locator.dart
@@ -1,4 +1,5 @@
import 'package:comwell_key_app/authentication/authentication_repository.dart';
+import 'package:comwell_key_app/choose_share_room/choose_share_room_repository.dart';
import 'package:comwell_key_app/contact/repository/contact_repository.dart';
import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/hotel_information/repository/hotel_information_repository.dart';
@@ -46,5 +47,7 @@ void setupLocator() {
() => NotificationsRepository());
locator.registerFactory<ContactRepository>(() => ContactRepository());
locator.registerFactory<UpSalesRepository>(() => UpSalesRepository());
+ locator.registerFactory<ChooseShareRoomRepository>(
+ () => ChooseShareRoomRepository());
}
}