6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit b79dabd2

AuthorEdmir Suljic<esu@dwarf.dk>
Date2025-08-25 12:57:55 +0200
finished feature. Added "get keys" button

Changed files

comwell_key_app/assets/translations/da-DK.json     |  4 +-
 comwell_key_app/assets/translations/en-US.json     |  6 +-
 .../lib/booking_details/booking_details_page.dart  |  5 ++
 .../components/get_keys_button.dart                | 69 ++++++++++++++++++++++
 .../lib/check_in/bloc/check_in_cubit.dart          | 22 +++++++
 comwell_key_app/lib/routing/app_router.dart        | 10 +++-
 6 files changed, 112 insertions(+), 4 deletions(-)

Diff

diff --git a/comwell_key_app/assets/translations/da-DK.json b/comwell_key_app/assets/translations/da-DK.json
index 9230da0d..cd406d64 100644
--- a/comwell_key_app/assets/translations/da-DK.json
+++ b/comwell_key_app/assets/translations/da-DK.json
@@ -330,5 +330,7 @@
"up_sales_processing_error_title": "Kunne ikke tilføje tilkøb",
"pay_bill": "Betal regning",
"discount": "Comwell Club Point Rabat",
- "error_preregistration": "Kunne ikke preregister, gå til reception"
+ "error_preregistration": "Kunne ikke preregister, gå til reception",
+ "get_keys": "Hent digital nøgle",
+ "get_keys_subtitle": "Få dit digitale nøglekort med det samme"
}
\ 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 2f74b31f..a383c6c8 100644
--- a/comwell_key_app/assets/translations/en-US.json
+++ b/comwell_key_app/assets/translations/en-US.json
@@ -10,7 +10,7 @@
"generic_error": "An error occurred. Please try again later.",
"lcome_headline": "Welcome at Comwell Hotels",
"welcome_button": "Continue",
- "welcome_error": "An error occurred. Please try again later.",
+ "welcome_error": "An error occurred. Please try again later.",
"room_key": "Room key",
"room_keys": "Room keys",
"redeem_code": "Redeem code",
@@ -333,5 +333,7 @@
"up_sales_processing_error_title": "Failed to add addons",
"pay_bill": "Pay bill",
"discount": "Comwell Club Points Discount",
- "error_preregistration": "Failed to preregister, go to reception"
+ "error_preregistration": "Failed to preregister, go to reception",
+ "get_keys": "Get digital key",
+ "get_keys_subtitle": "Get your digital key card"
}
diff --git a/comwell_key_app/lib/booking_details/booking_details_page.dart b/comwell_key_app/lib/booking_details/booking_details_page.dart
index fd59ef13..eb65259d 100644
--- a/comwell_key_app/lib/booking_details/booking_details_page.dart
+++ b/comwell_key_app/lib/booking_details/booking_details_page.dart
@@ -1,5 +1,6 @@
import 'package:comwell_key_app/booking_details/components/booking_details_bottom_sheet.dart';
import 'package:comwell_key_app/booking_details/components/check_in_button_timer.dart';
+import 'package:comwell_key_app/booking_details/components/get_keys_button.dart';
import 'package:comwell_key_app/booking_details/components/preregister_button.dart';
import 'package:comwell_key_app/booking_details/components/room_number_container.dart';
import 'package:comwell_key_app/booking_details/components/share_button.dart';
@@ -96,6 +97,10 @@ class BookingDetailsPage extends StatelessWidget {
const SizedBox(height: 10),
if (state.keys.isNotEmpty && cubit.booking.roomNumber != '')
const UnlockRoomButton()
+ else if (state.keys.isEmpty &&
+ cubit.booking.reservationStatus ==
+ ReservationStatus.checkedin)
+ const GetKeysButton()
else if (cubit.booking.reservationStatus ==
ReservationStatus.preregistered)
const CheckInButtonTimer()
diff --git a/comwell_key_app/lib/booking_details/components/get_keys_button.dart b/comwell_key_app/lib/booking_details/components/get_keys_button.dart
new file mode 100644
index 00000000..c9ddbf1d
--- /dev/null
+++ b/comwell_key_app/lib/booking_details/components/get_keys_button.dart
@@ -0,0 +1,69 @@
+import 'package:comwell_key_app/booking_details/bloc/booking_details_bloc.dart';
+import 'package:comwell_key_app/routing/app_routes.dart';
+import 'package:comwell_key_app/themes/dark_theme.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:go_router/go_router.dart';
+
+class GetKeysButton extends StatelessWidget {
+ const GetKeysButton({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ final bloc = context.read<BookingDetailsBloc>();
+
+ return Container(
+ margin: const EdgeInsets.symmetric(horizontal: 10),
+ child: ElevatedButton(
+ onPressed: () async {
+ const bool onlyKeys = true;
+ await context.pushNamed(AppRoutes.checkIn.name, extra: [bloc.booking, onlyKeys],);
+ if (!bloc.isClosed) {
+ bloc.add(InitialEvent());
+ }
+ },
+ child: Padding(
+ padding: const EdgeInsets.symmetric(vertical: 8.0),
+ child: Row(
+ children: [
+ SvgPicture.asset(
+ "assets/icons/Union.svg",
+ colorFilter: const ColorFilter.mode(
+ colorBackground,
+ BlendMode.srcIn,
+ ),
+ width: 14,
+ height: 14,
+ ),
+ const SizedBox(width: 16),
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ "get_keys".tr(),
+ style: Theme.of(context)
+ .textTheme
+ .titleMedium
+ ?.copyWith(color: Colors.white),
+ ),
+ Text(
+ "get_keys_subtitle".tr(),
+ style: Theme.of(context)
+ .textTheme
+ .bodySmall
+ ?.copyWith(color: Colors.white),
+ softWrap: true,
+ ),
+ ],
+ ),
+ )
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/check_in/bloc/check_in_cubit.dart b/comwell_key_app/lib/check_in/bloc/check_in_cubit.dart
index e3c926df..48bc8cac 100644
--- a/comwell_key_app/lib/check_in/bloc/check_in_cubit.dart
+++ b/comwell_key_app/lib/check_in/bloc/check_in_cubit.dart
@@ -13,6 +13,27 @@ class CheckInCubit extends Cubit<CheckInState> {
init();
}
+ CheckInCubit.initialOnlyKeys(this.booking) : super(CheckInState.initial()) {
+ initOnlyKeys();
+ }
+
+ Future<void> initOnlyKeys() async {
+ try {
+ final bookingDetails =
+ await _checkInRepository.getBookingDetails(booking.id);
+ emit(state.checkInStatusRoomFound(roomNumber: bookingDetails.roomNumber));
+ await _checkInRepository.checkIfSetup();
+ await tryGetKeys();
+
+ await Future<void>.delayed(const Duration(milliseconds: 1000));
+ emit(state.checkInStatusYourDigitalCard(
+ roomNumber: bookingDetails.roomNumber));
+ } catch (err, st) {
+ if (kDebugMode) print("qqq err=$err, $st");
+ emit(state.checkInStatusError(Exception(err.toString())));
+ }
+ }
+
Future<void> init() async {
try {
await Future<void>.delayed(const Duration(milliseconds: 500));
@@ -52,6 +73,7 @@ class CheckInCubit extends Cubit<CheckInState> {
await Future<void>.delayed(const Duration(milliseconds: 500));
tryGetKeys(attempt: attempt + 1);
} else {
+ emit(state.checkInStatusError(Exception(e.toString())));
rethrow;
}
}
diff --git a/comwell_key_app/lib/routing/app_router.dart b/comwell_key_app/lib/routing/app_router.dart
index 69be6581..ce9a7bbe 100644
--- a/comwell_key_app/lib/routing/app_router.dart
+++ b/comwell_key_app/lib/routing/app_router.dart
@@ -212,7 +212,15 @@ GoRouter goRouter() {
name: AppRoutes.checkIn.name,
builder: (context, state) {
return BlocProvider(
- create: (context) => CheckInCubit(state.extra as Booking),
+ create: (context) {
+ final extras = state.extra as List<dynamic>;
+ final booking = extras[0] as Booking;
+ final onlyKeys = extras[1] as bool;
+ if (onlyKeys) {
+ return CheckInCubit.initialOnlyKeys(booking);
+ }
+ return CheckInCubit(booking);
+ },
child: const CheckInPage(),
);
}),