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

AuthorEdmir Suljic<esu@dwarf.dk>
Date2025-05-27 15:07:11 +0200
Partly finished pre registration flow. Addons page still to be implemented

Changed files

comwell_key_app/assets/icons/ic_locked.svg         |   3 +
 comwell_key_app/assets/translations/da-DK.json     |   7 +-
 comwell_key_app/assets/translations/en-US.json     |   7 +-
 .../booking_details/bloc/booking_details_bloc.dart |  13 +-
 .../bloc/booking_details_event.dart                |   9 ++
 .../lib/booking_details/booking_details_page.dart  |  10 +-
 .../booking_details_repository.dart                |   1 -
 .../components/check_in_button_timer.dart          | 142 +++++++++++++++++++++
 .../components/practical_information_button.dart   |   7 +-
 .../components/preregister_button.dart             |   8 +-
 .../lib/check_in/bloc/check_in_cubit.dart          |   2 +
 comwell_key_app/lib/check_in/check_in_page.dart    |   1 -
 .../lib/check_in/check_in_repository.dart          |   9 +-
 .../lib/common/components/bottom_sheet_widget.dart |   1 -
 comwell_key_app/lib/main.dart                      |   2 +-
 comwell_key_app/lib/overview/models/booking.dart   |   3 +-
 .../past_cancelled_booking_detail_page.dart        |   1 -
 .../payment_cards/bloc/payment_cards_cubit.dart    |   2 +-
 .../lib/payment_cards/payment_cards_page.dart      |  20 ++-
 .../pregistration/bloc/preregistration_cubit.dart  |  51 ++++----
 .../pregistration/bloc/preregistration_state.dart  |   3 +-
 .../pages/prereg_confirmation_page.dart            |   1 -
 .../pregistration/pages/prereg_profile_page.dart   |   9 --
 .../pregistration/pregistration_repository.dart    |   1 -
 .../lib/pregistration/preregistration_flow.dart    |   2 -
 .../profile/components/profile_page_widget.dart    |   3 +-
 .../lib/profile/profile_repository.dart            |   3 +-
 .../components/intl_phone_field.dart               |   6 +-
 .../cubit/profile_settings_cubit.dart              |   3 +-
 .../profile_settings/profile_settings_page.dart    |   2 -
 .../repostiory/profile_settings_repository.dart    |   1 -
 comwell_key_app/lib/routing/app_router.dart        |  21 +--
 comwell_key_app/lib/services/api.dart              |   3 +-
 comwell_key_app/lib/services/http_client.dart      |   3 +-
 .../lib/tracking/trackers/firebase_tracker.dart    |   1 -
 comwell_key_app/lib/utils/phone_utils.dart         |  27 ++--
 comwell_key_app/lib/utils/time_utils.dart          |   9 ++
 .../test/overview_test/overview_cubic_test.dart    |  20 ++-
 .../overview_test/overview_repository_test.dart    |   6 +
 39 files changed, 307 insertions(+), 116 deletions(-)

Diff

diff --git a/comwell_key_app/assets/icons/ic_locked.svg b/comwell_key_app/assets/icons/ic_locked.svg
new file mode 100644
index 00000000..629ddca6
--- /dev/null
+++ b/comwell_key_app/assets/icons/ic_locked.svg
@@ -0,0 +1,3 @@
+<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M18 11H9V6.5C9 4.84315 10.3431 3.5 12 3.5C13.6569 3.5 15 4.84315 15 6.5V11H16.5V6.5C16.5 4.01472 14.4853 2 12 2C9.51472 2 7.5 4.01472 7.5 6.5V11H6C5.17157 11 4.5 11.6716 4.5 12.5V21.5C4.5 22.3284 5.17157 23 6 23H18C18.8284 23 19.5 22.3284 19.5 21.5V12.5C19.5 11.6716 18.8284 11 18 11ZM18 21.5H6V12.5H18V21.5Z" fill="white"/>
+</svg>
diff --git a/comwell_key_app/assets/translations/da-DK.json b/comwell_key_app/assets/translations/da-DK.json
index 368c5de4..89387014 100644
--- a/comwell_key_app/assets/translations/da-DK.json
+++ b/comwell_key_app/assets/translations/da-DK.json
@@ -247,5 +247,10 @@
"error_logout": "Der skete en fejl",
"error_logout_subtitle": "Du har været logget ud. Log venligst ind igen.",
"edit": "Rediger",
- "error_cards": "Fejl ved indlæsning af kort, prøv igen senere."
+ "error_cards": "Fejl ved indlæsning af kort, prøv igen senere.",
+ "check_in_button_timer_days_hours_minutes": "Om {} dage, {} timer og {} minutter",
+ "check_in_button_timer_hours_minutes": "Om {} timer og {} minutter",
+ "check_in_button_timer_minutes": "Om {} minutter",
+ "check_in_button_timer_seconds": "Om {} sekunder"
+
}
\ 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 a43eda3c..1256f66a 100644
--- a/comwell_key_app/assets/translations/en-US.json
+++ b/comwell_key_app/assets/translations/en-US.json
@@ -246,6 +246,9 @@
"error_logout": "There has been an error",
"error_logout_subtitle": "Please log in again",
"edit": "Edit",
- "error_cards": "Failed to load cards, try again later"
-
+ "error_cards": "Failed to load cards, try again later",
+ "check_in_button_timer_days_hours_minutes": "In {} days, {} hours and {} minutes",
+ "check_in_button_timer_hours_minutes": "In {} hours and {} minutes",
+ "check_in_button_timer_minutes": "In {} minutes",
+ "check_in_button_timer_seconds": "In {} seconds"
}
diff --git a/comwell_key_app/lib/booking_details/bloc/booking_details_bloc.dart b/comwell_key_app/lib/booking_details/bloc/booking_details_bloc.dart
index 13139b5b..bea9e3be 100644
--- a/comwell_key_app/lib/booking_details/bloc/booking_details_bloc.dart
+++ b/comwell_key_app/lib/booking_details/bloc/booking_details_bloc.dart
@@ -33,6 +33,7 @@ class BookingDetailsBloc
await checkIfHouseKeepingOrdered(emit);
await checkMobileKeys(emit);
booking = await getBookingDetails(emit);
+
} catch (e, st) {
if (kDebugMode) print("err=$e, $st");
emit(state.setupError());
@@ -50,7 +51,8 @@ class BookingDetailsBloc
Future<Booking> getBookingDetails(Emitter<BookingDetailsState> emit) async {
try {
- final bookingDetails = await profileRepository.getBookingDetails(booking.confirmationId);
+ final bookingDetails =
+ await profileRepository.getBookingDetails(booking.confirmationId);
emit(state.copyWith(status: BookingDetailsStatus.main));
return bookingDetails;
} catch (e) {
@@ -74,9 +76,9 @@ class BookingDetailsBloc
Future<void> checkIfHouseKeepingOrdered(
Emitter<BookingDetailsState> emit) async {
- final isHouseKeepingOrdered =
- await bookingDetailsRepository.isHousesKeepingOrdered(booking.roomNumber);
-
+ final isHouseKeepingOrdered = await bookingDetailsRepository
+ .isHousesKeepingOrdered(booking.roomNumber);
+
if (isHouseKeepingOrdered) {
emit(state.houseKeepingOrdered());
}
@@ -92,4 +94,7 @@ class BookingDetailsBloc
emit(state.setupError());
}
}
+
+ //TODO add checkin time from backend when we have it
+ DateTime getCheckInTime() => booking.startDate.add(const Duration(hours: 15));
}
diff --git a/comwell_key_app/lib/booking_details/bloc/booking_details_event.dart b/comwell_key_app/lib/booking_details/bloc/booking_details_event.dart
index b00ffa74..ab895b67 100644
--- a/comwell_key_app/lib/booking_details/bloc/booking_details_event.dart
+++ b/comwell_key_app/lib/booking_details/bloc/booking_details_event.dart
@@ -11,6 +11,15 @@ final class InitialEvent extends BookingDetailsEvent {}
final class CheckIfHouseKeepingOrdered extends BookingDetailsEvent {}
+final class UpdateRemainingEvent extends BookingDetailsEvent {
+ final Duration remaining;
+
+ const UpdateRemainingEvent(this.remaining);
+
+ @override
+ List<Object> get props => [remaining];
+}
+
final class ProvisionKeyEvent extends BookingDetailsEvent {
final String bookingId;
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 6aaa2cdd..8b475d98 100644
--- a/comwell_key_app/lib/booking_details/booking_details_page.dart
+++ b/comwell_key_app/lib/booking_details/booking_details_page.dart
@@ -1,4 +1,4 @@
-import 'package:comwell_key_app/booking_details/components/check_in_button.dart';
+import 'package:comwell_key_app/booking_details/components/check_in_button_timer.dart';
import 'package:comwell_key_app/booking_details/components/preregister_button.dart';
import 'package:comwell_key_app/booking_details/components/share_button.dart';
import 'package:comwell_key_app/common/components/bottom_sheet_widget.dart';
@@ -27,8 +27,6 @@ class BookingDetailsPage extends StatelessWidget {
builder: (context, state) {
final cubit = context.read<BookingDetailsBloc>();
- print("state: ${cubit.booking.reservationStatus}");
-
if (state.status == BookingDetailsStatus.initial) {
cubit.add(InitialEvent());
}
@@ -40,7 +38,7 @@ class BookingDetailsPage extends StatelessWidget {
body: Builder(
builder: (context) {
if (state.status == BookingDetailsStatus.loading) {
- return Center(
+ return const Center(
child: CircularProgressIndicator(),
);
} else {
@@ -100,7 +98,7 @@ class BookingDetailsPage extends StatelessWidget {
const UnlockRoomButton()
else if (cubit.booking.reservationStatus ==
ReservationStatus.preregistered)
- const CheckInButton(),
+ CheckInButtonTimer(checkInTime: cubit.getCheckInTime()),
if (cubit.booking.reservationStatus ==
ReservationStatus.newreservation)
const PreregisterButton(),
@@ -158,8 +156,6 @@ class BookingDetailsPage extends StatelessWidget {
const SizedBox(height: 16),
Text('rooms'.tr()),
const SizedBox(height: 16),
- const PreregisterButton(),
- const SizedBox(height: 16),
Text('room_keys'.tr()),
const SizedBox(height: 400),
],
diff --git a/comwell_key_app/lib/booking_details/booking_details_repository.dart b/comwell_key_app/lib/booking_details/booking_details_repository.dart
index 3b6b0a85..9e4d148c 100644
--- a/comwell_key_app/lib/booking_details/booking_details_repository.dart
+++ b/comwell_key_app/lib/booking_details/booking_details_repository.dart
@@ -3,7 +3,6 @@ import 'package:comwell_key_app/housekeeping/housekeeping_repository.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/services/api.dart';
import 'package:comwell_key_app/services/mappers/booking_mapper.dart';
-import 'package:comwell_key_app/services/models/booking_dto.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:comwell_key_app/utils/secure_storage.dart';
diff --git a/comwell_key_app/lib/booking_details/components/check_in_button_timer.dart b/comwell_key_app/lib/booking_details/components/check_in_button_timer.dart
new file mode 100644
index 00000000..5e57d345
--- /dev/null
+++ b/comwell_key_app/lib/booking_details/components/check_in_button_timer.dart
@@ -0,0 +1,142 @@
+import 'dart:async';
+import 'package:comwell_key_app/booking_details/bloc/booking_details_bloc.dart';
+import 'package:comwell_key_app/booking_details/components/check_in_button.dart';
+import 'package:comwell_key_app/utils/time_utils.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+
+class CheckInButtonTimer extends StatefulWidget {
+ final DateTime checkInTime;
+ const CheckInButtonTimer({super.key, required this.checkInTime});
+
+ @override
+ State<CheckInButtonTimer> createState() => _CheckInButtonTimerState();
+}
+
+class _CheckInButtonTimerState extends State<CheckInButtonTimer> {
+ late Duration _remaining;
+ Timer? _timer;
+
+ @override
+ void initState() {
+ super.initState();
+ _updateRemaining();
+ _timer =
+ Timer.periodic(const Duration(seconds: 1), (_) => _updateRemaining());
+ }
+
+ void _updateRemaining() {
+ final now = DateTime.now();
+ setState(() {
+ _remaining = widget.checkInTime.difference(now);
+
+ print("remaining=$_remaining");
+ if (_remaining.isNegative) {
+ _timer?.cancel();
+ }
+ });
+ }
+
+ @override
+ void dispose() {
+ _timer?.cancel();
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return AnimatedSwitcher(
+ duration: const Duration(milliseconds: 300),
+ transitionBuilder: (Widget child, Animation<double> animation) {
+ return FadeTransition(
+ opacity: animation,
+ child: child,
+ );
+ },
+ child: _remaining.isNegative
+ ? const CheckInButton(key: ValueKey('check_in_button'))
+ : getTimerWidget()
+ );
+ }
+
+ Widget getTimerWidget() {
+ return BlocBuilder<BookingDetailsBloc, BookingDetailsState>(
+ key: const ValueKey('timer_view'),
+ builder: (context, state) {
+ final (days, hours, minutes, seconds) = getDurationInMinutes(_remaining);
+ final dateStr =
+ DateFormat('d. MMM', 'da').format(widget.checkInTime);
+ final theme = Theme.of(context);
+ final timeStr = days > 0
+ ? "check_in_button_timer_days_hours_minutes".tr(args: [days.toString(), hours.toString(), minutes.toString()])
+ : hours > 0
+ ? "check_in_button_timer_hours_minutes".tr(args: [hours.toString(), minutes.toString()])
+ : minutes > 0
+ ? "check_in_button_timer_minutes".tr(args: [minutes.toString()])
+ : "check_in_button_timer_seconds".tr(args: [seconds.toString()]);
+
+ return Container(
+ margin: const EdgeInsets.symmetric(horizontal: 10),
+ decoration: BoxDecoration(
+ color: Colors.grey[900]?.withOpacity(0.8),
+ borderRadius: BorderRadius.circular(30),
+ ),
+ padding:
+ const EdgeInsets.symmetric(horizontal: 20, vertical: 8),
+ child: Row(
+ children: [
+ SvgPicture.asset(
+ 'assets/icons/ic_locked.svg',
+ colorFilter: const ColorFilter.mode(
+ Colors.white,
+ BlendMode.srcIn,
+ ),
+ ),
+ const SizedBox(width: 16),
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'Check-in',
+ style: theme.textTheme.titleMedium?.copyWith(
+ color: Colors.white,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ Text(
+ timeStr,
+ style: theme.textTheme.bodyMedium?.copyWith(
+ color: Colors.white.withOpacity(0.8)),
+ ),
+ ],
+ ),
+ ),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Text(
+ dateStr.toUpperCase(),
+ style: theme.textTheme.bodySmall?.copyWith(
+ color: Colors.white.withOpacity(0.7),
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ Text(
+ DateFormat('HH:mm').format(widget.checkInTime),
+ style: theme.textTheme.titleMedium?.copyWith(
+ color: Colors.white,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ );
+ },
+ );
+ }
+}
diff --git a/comwell_key_app/lib/booking_details/components/practical_information_button.dart b/comwell_key_app/lib/booking_details/components/practical_information_button.dart
index 3de7757d..09c32a2f 100644
--- a/comwell_key_app/lib/booking_details/components/practical_information_button.dart
+++ b/comwell_key_app/lib/booking_details/components/practical_information_button.dart
@@ -18,6 +18,9 @@ class PracticalInformationButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
+ final screenHeight = MediaQuery.of(context).size.height;
+ final screenWidth = MediaQuery.of(context).size.width;
+
return Material(
color: sandColor[10],
borderRadius: const BorderRadius.all(Radius.circular(16)),
@@ -46,13 +49,13 @@ class PracticalInformationButton extends StatelessWidget {
),
),
Positioned(
- top: 160,
+ top: screenHeight * 0.15,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(title),
SizedBox(
- width: 200,
+ width: screenWidth * 0.4,
child: Text(
subtitle,
style: Theme.of(context)
diff --git a/comwell_key_app/lib/booking_details/components/preregister_button.dart b/comwell_key_app/lib/booking_details/components/preregister_button.dart
index e8708a99..daec1b5a 100644
--- a/comwell_key_app/lib/booking_details/components/preregister_button.dart
+++ b/comwell_key_app/lib/booking_details/components/preregister_button.dart
@@ -14,12 +14,16 @@ class PreregisterButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
final bloc = context.read<BookingDetailsBloc>();
+
return Container(
margin: const EdgeInsets.symmetric(horizontal: 10),
child: ElevatedButton(
- onPressed: () {
- context.pushNamed(AppRoutes.preregistration.name,
+ onPressed: () async {
+ final (result) = await context.pushNamed(AppRoutes.preregistration.name,
extra: bloc.booking);
+ if (result != null) {
+ bloc.add(InitialEvent());
+ }
},
style: ElevatedButton.styleFrom(
backgroundColor: sandColor[80],
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 995154c4..28ee56b1 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
@@ -57,5 +57,7 @@ class CheckInCubit extends Cubit<CheckInState> {
}
}
+
+
static const getKeysRetryAttempts = 3;
}
diff --git a/comwell_key_app/lib/check_in/check_in_page.dart b/comwell_key_app/lib/check_in/check_in_page.dart
index ffb30548..22463e9e 100644
--- a/comwell_key_app/lib/check_in/check_in_page.dart
+++ b/comwell_key_app/lib/check_in/check_in_page.dart
@@ -106,7 +106,6 @@ class _CheckInPageState extends State<CheckInPage>
@override
Widget build(BuildContext context) {
- final mq = MediaQuery.of(context);
final cubit = context.read<CheckInCubit>();
final theme = Theme.of(context);
diff --git a/comwell_key_app/lib/check_in/check_in_repository.dart b/comwell_key_app/lib/check_in/check_in_repository.dart
index 0a6f621e..c43673d9 100644
--- a/comwell_key_app/lib/check_in/check_in_repository.dart
+++ b/comwell_key_app/lib/check_in/check_in_repository.dart
@@ -1,15 +1,11 @@
-import 'dart:convert';
-
import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/overview/models/guest.dart';
import 'package:comwell_key_app/profile/profile_repository.dart';
import 'package:comwell_key_app/services/api.dart';
-import 'package:comwell_key_app/services/mappers/booking_mapper.dart';
-import 'package:comwell_key_app/services/models/booking_dto.dart';
-import 'package:comwell_key_app/utils/json.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:dio/dio.dart';
+import 'package:flutter/cupertino.dart';
import '../utils/seos_repository.dart';
@@ -22,7 +18,6 @@ class CheckInRepository {
Future<dynamic> checkIn(String confirmationId) async {
try {
final response = await api.checkIn(confirmationId);
- print("response in checkInRepository: ${response}");
return response;
} on DioException catch (err) {
if (err.response?.data != null) {
@@ -31,7 +26,7 @@ class CheckInRepository {
}
throw Exception("Failed to check in: ${err.message}");
} catch (err, st) {
- print("error in checkInRepository: $err, $st");
+ debugPrint("error in checkInRepository: $err, $st");
throw Exception("An unexpected error occurred during check-in");
}
}
diff --git a/comwell_key_app/lib/common/components/bottom_sheet_widget.dart b/comwell_key_app/lib/common/components/bottom_sheet_widget.dart
index 7109e3aa..9e0eced8 100644
--- a/comwell_key_app/lib/common/components/bottom_sheet_widget.dart
+++ b/comwell_key_app/lib/common/components/bottom_sheet_widget.dart
@@ -1,4 +1,3 @@
-import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:flutter/material.dart';
import 'package:snapping_sheet/snapping_sheet.dart';
diff --git a/comwell_key_app/lib/main.dart b/comwell_key_app/lib/main.dart
index 2e4376c1..e79dec43 100644
--- a/comwell_key_app/lib/main.dart
+++ b/comwell_key_app/lib/main.dart
@@ -30,7 +30,7 @@ void runMainApp(FirebaseOptions firebaseOptions) async {
debugPrint("Loading environment file: $envFile");
try {
- await dotenv.load(fileName: '.env');
+ await dotenv.load(fileName: envFile);
debugPrint("Successfully loaded environment file");
} catch (e) {
debugPrint("Error loading environment file: $e");
diff --git a/comwell_key_app/lib/overview/models/booking.dart b/comwell_key_app/lib/overview/models/booking.dart
index ce9096a9..c6580768 100644
--- a/comwell_key_app/lib/overview/models/booking.dart
+++ b/comwell_key_app/lib/overview/models/booking.dart
@@ -149,13 +149,12 @@ enum ReservationStatus {
unknown;
static ReservationStatus fromString(String value) {
- print("value: ${value.toLowerCase()}");
if (value.toLowerCase() == 'new') {
return ReservationStatus.newreservation;
}
final status = ReservationStatus.values.firstWhere(
(status) => status.name.toLowerCase() == value.toLowerCase());
- print("status: $status");
+
return status;
}
}
diff --git a/comwell_key_app/lib/overview/past_cancelled_booking_detail_page.dart b/comwell_key_app/lib/overview/past_cancelled_booking_detail_page.dart
index 8dfa9e64..6b767fdd 100644
--- a/comwell_key_app/lib/overview/past_cancelled_booking_detail_page.dart
+++ b/comwell_key_app/lib/overview/past_cancelled_booking_detail_page.dart
@@ -13,7 +13,6 @@ class PastCancelledBookingDetailPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
- print("booking: $booking");
return Scaffold(
appBar: const ComwellAppBar(
shouldShowProfileButton: false,
diff --git a/comwell_key_app/lib/payment_cards/bloc/payment_cards_cubit.dart b/comwell_key_app/lib/payment_cards/bloc/payment_cards_cubit.dart
index 463c9fd5..c790005e 100644
--- a/comwell_key_app/lib/payment_cards/bloc/payment_cards_cubit.dart
+++ b/comwell_key_app/lib/payment_cards/bloc/payment_cards_cubit.dart
@@ -32,7 +32,7 @@ class PaymentCardsCubit extends Cubit<PaymentCardsState> {
try {
final cards = await _paymentCardsRepository.getCards();
paymentConfigurations = await fetchPaymentConfiguration();
-
+
if (cards.isEmpty) {
emit(state.cardsFetchedEmpty());
} else {
diff --git a/comwell_key_app/lib/payment_cards/payment_cards_page.dart b/comwell_key_app/lib/payment_cards/payment_cards_page.dart
index 3f3c2130..31a5915d 100644
--- a/comwell_key_app/lib/payment_cards/payment_cards_page.dart
+++ b/comwell_key_app/lib/payment_cards/payment_cards_page.dart
@@ -11,21 +11,34 @@ import '../themes/light_theme.dart';
import 'bloc/payment_cards_cubit.dart';
class PaymentCardsPage extends StatelessWidget {
- const PaymentCardsPage({super.key});
+ final bool needScaffold;
+ const PaymentCardsPage({super.key, this.needScaffold = false});
@override
Widget build(BuildContext context) {
return BlocBuilder<PaymentCardsCubit, PaymentCardsState>(
builder: (context, state) {
final cubit = context.read<PaymentCardsCubit>();
- final cards = cubit.state.cards;
if (cubit.state.isLoading) {
return const Center(child: CircularProgressIndicator());
}
if (cubit.state.hasError) {
return Center(child: Text('error_cards'.tr(), style: Theme.of(context).textTheme.bodyMedium,));
}
- return ListView(
+ return needScaffold ? Scaffold(
+ backgroundColor: Colors.white,
+ appBar: const ComwellAppBar(
+ shouldShowProfileButton: true,
+ ),
+ body: _buildPaymentCards(context, state, cubit)
+ ) : _buildPaymentCards(context, state, cubit);
+ });
+ }
+
+
+ Widget _buildPaymentCards(BuildContext context, PaymentCardsState state, PaymentCardsCubit cubit) {
+ final cards = state.cards;
+ return ListView(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
@@ -75,6 +88,5 @@ class PaymentCardsPage extends StatelessWidget {
),
],
);
- });
}
}
diff --git a/comwell_key_app/lib/pregistration/bloc/preregistration_cubit.dart b/comwell_key_app/lib/pregistration/bloc/preregistration_cubit.dart
index 0d951972..2b85b85b 100644
--- a/comwell_key_app/lib/pregistration/bloc/preregistration_cubit.dart
+++ b/comwell_key_app/lib/pregistration/bloc/preregistration_cubit.dart
@@ -1,5 +1,4 @@
import 'package:bloc/bloc.dart';
-import 'package:comwell_key_app/booking_details/bloc/booking_details_bloc.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/pregistration/bloc/preregistration_state.dart';
import 'package:comwell_key_app/pregistration/pregistration_repository.dart';
@@ -7,7 +6,6 @@ import 'package:comwell_key_app/pregistration/preregistration_flow.dart';
import 'package:comwell_key_app/profile/profile_repository.dart';
import 'package:comwell_key_app/profile_settings/model/address.dart';
import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
-import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/tracking/comwell_tracking.dart';
import 'package:comwell_key_app/tracking/models/analytics_event_item.dart';
import 'package:comwell_key_app/utils/locator.dart';
@@ -33,10 +31,10 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
final lastNameTextController = TextEditingController();
final emailTextController = TextEditingController();
final phoneNumberTextController = TextEditingController();
-
+
CountryCode? countryCode;
String? phoneNumber;
-
+
String selectedCountry = '';
PreregistrationPage get currentPage =>
@@ -44,7 +42,7 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
bool _isAnimating = false;
PreregistrationCubit({required this.booking})
- : super(PreregistrationState(loading: false)) {
+ : super(const PreregistrationState(loading: false)) {
_tracking.trackScreenView(
"Pre-registration - Betalingskort",
"/pre-registration/betalingskort",
@@ -63,7 +61,6 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
countryCode = getCountryCodeFromPhoneNumber(user.phoneNumber).$1;
phoneNumber = getCountryCodeFromPhoneNumber(user.phoneNumber).$2;
-
firstNameTextController.text = user.firstName;
lastNameTextController.text = user.lastName;
emailTextController.text = user.email;
@@ -93,7 +90,8 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
}
void onProfileContinueClicked() {
- final phoneNumber = concatCountryCodeAndPhoneNumber(countryCode!, phoneNumberTextController.text);
+ final phoneNumber = concatCountryCodeAndPhoneNumber(
+ countryCode!, phoneNumberTextController.text);
final updatedUser = state.user!.copyWith(
firstName: firstNameTextController.text,
@@ -167,18 +165,24 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
// quantity: 200);
// _tracking.trackBeginCheckout(analyticsEventItem);
- final confirmationId = booking.confirmationId;
-
- await _profileSettingsRepository.updateUser(state.user!);
- final response =
- await _preregistrationRepository.createPreregistration(confirmationId);
- print("response=$response");
emit(state.copyWith(loading: true));
- Future.delayed(const Duration(seconds: 3), () {
- emit(state.copyWith(loading: false));
- if (!context.mounted) return;
- context.pushReplacementNamed(AppRoutes.bookingDetails.name, extra: booking);
- });
+ try {
+ final confirmationId = booking.confirmationId;
+
+ await _profileSettingsRepository.updateUser(state.user!);
+ final preRegResponse = await _preregistrationRepository
+ .createPreregistration(confirmationId);
+
+ if (preRegResponse != null) {
+ Future.delayed(const Duration(seconds: 3), () {
+ emit(state.copyWith(loading: false));
+ if (!context.mounted) return;
+ context.pop(preRegResponse);
+ });
+ }
+ } catch (e) {
+ emit(state.copyWith(loading: false, error: Exception(e)));
+ }
}
void onEditProfileClicked() {
@@ -199,7 +203,6 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
void onPhoneNumberChanged(String phoneNumber) {
phoneNumberTextController.text = phoneNumber;
- print("isPhoneNumberValid: $isPhoneNumberValid");
emit(state.copyWith(isPhoneNumberValid: isPhoneNumberValid));
}
@@ -262,12 +265,14 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
bool get isCityValid => cityTextController.text.isNotEmpty;
- bool get isPhoneNumberValid => phoneNumberTextController.text.isNotEmpty && phoneNumberTextController.text.length > 9 && phoneNumberTextController.text.length < 16;
-
+ bool get isPhoneNumberValid =>
+ phoneNumberTextController.text.isNotEmpty &&
+ phoneNumberTextController.text.length > 8 &&
+ phoneNumberTextController.text.length < 16;
+
bool get isFirstNameValid => firstNameTextController.text.isNotEmpty;
-
+
bool get isLastNameValid => lastNameTextController.text.isNotEmpty;
-
bool get canContinue {
int page = pageController.page?.ceil() ?? 0;
diff --git a/comwell_key_app/lib/pregistration/bloc/preregistration_state.dart b/comwell_key_app/lib/pregistration/bloc/preregistration_state.dart
index 707f2afd..9e752120 100644
--- a/comwell_key_app/lib/pregistration/bloc/preregistration_state.dart
+++ b/comwell_key_app/lib/pregistration/bloc/preregistration_state.dart
@@ -1,4 +1,3 @@
-import 'package:comwell_key_app/utils/phone_utils.dart';
import 'package:country_code_picker/country_code_picker.dart';
import 'package:equatable/equatable.dart';
@@ -20,7 +19,7 @@ class PreregistrationState extends Equatable {
final bool isLastNameValid;
- PreregistrationState({
+ const PreregistrationState({
required this.loading,
this.missingInformation = false,
this.numOfExtras = 0,
diff --git a/comwell_key_app/lib/pregistration/pages/prereg_confirmation_page.dart b/comwell_key_app/lib/pregistration/pages/prereg_confirmation_page.dart
index 4cddca8f..d069965a 100644
--- a/comwell_key_app/lib/pregistration/pages/prereg_confirmation_page.dart
+++ b/comwell_key_app/lib/pregistration/pages/prereg_confirmation_page.dart
@@ -1,6 +1,5 @@
import 'package:comwell_key_app/pregistration/bloc/preregistration_cubit.dart';
import 'package:comwell_key_app/pregistration/components/information_card.dart';
-import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
diff --git a/comwell_key_app/lib/pregistration/pages/prereg_profile_page.dart b/comwell_key_app/lib/pregistration/pages/prereg_profile_page.dart
index 1b4d76af..f3c2bee3 100644
--- a/comwell_key_app/lib/pregistration/pages/prereg_profile_page.dart
+++ b/comwell_key_app/lib/pregistration/pages/prereg_profile_page.dart
@@ -1,10 +1,7 @@
-import 'package:comwell_key_app/common/components/comwell_app_bar.dart';
import 'package:comwell_key_app/common/components/comwell_text_field.dart';
import 'package:comwell_key_app/profile_settings/components/intl_phone_field.dart';
import 'package:comwell_key_app/pregistration/bloc/preregistration_cubit.dart';
import 'package:comwell_key_app/pregistration/bloc/preregistration_state.dart';
-import 'package:comwell_key_app/themes/light_theme.dart';
-import 'package:comwell_key_app/utils/phone_utils.dart';
import 'package:country_code_picker/country_code_picker.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
@@ -16,16 +13,12 @@ class PreregProfilePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
- final cubit = context.read<PreregistrationCubit>();
return BlocBuilder<PreregistrationCubit, PreregistrationState>(
builder: (context, state) {
if (state.loading) {
return const Center(child: CircularProgressIndicator());
}
if (state.user != null) {
- print("firstName: ${cubit.isFirstNameValid}");
- print("lastName: ${cubit.isLastNameValid}");
- print("phoneNumber: ${cubit.isPhoneNumberValid}");
return _buildProfilePage(theme, state, context);
}
@@ -75,7 +68,6 @@ class PreregProfilePage extends StatelessWidget {
errorMessage: firstNameErrorMessage,
onChanged: (value) {
cubit.firstNameTextController.text = value;
- cubit.emit(state.copyWith(forceUpdate: true));
},
),
const SizedBox(height: 8),
@@ -88,7 +80,6 @@ class PreregProfilePage extends StatelessWidget {
errorMessage: lastNameErrorMessage,
onChanged: (value) {
cubit.lastNameTextController.text = value;
- cubit.emit(state.copyWith(forceUpdate: true));
},
),
const SizedBox(height: 8),
diff --git a/comwell_key_app/lib/pregistration/pregistration_repository.dart b/comwell_key_app/lib/pregistration/pregistration_repository.dart
index 655fdc10..ec5269df 100644
--- a/comwell_key_app/lib/pregistration/pregistration_repository.dart
+++ b/comwell_key_app/lib/pregistration/pregistration_repository.dart
@@ -40,7 +40,6 @@ class PreregistrationRepository {
final response = await _api.preRegistration(confirmationId);
return response.data!;
} catch (e) {
- print("error=$e");
return null;
}
}
diff --git a/comwell_key_app/lib/pregistration/preregistration_flow.dart b/comwell_key_app/lib/pregistration/preregistration_flow.dart
index d82cbb2a..4f9adf51 100644
--- a/comwell_key_app/lib/pregistration/preregistration_flow.dart
+++ b/comwell_key_app/lib/pregistration/preregistration_flow.dart
@@ -7,10 +7,8 @@ import 'package:comwell_key_app/pregistration/bloc/preregistration_cubit.dart';
import 'package:comwell_key_app/pregistration/pages/prereg_confirmation_page.dart';
import 'package:comwell_key_app/pregistration/pages/prereg_address_page.dart';
import 'package:comwell_key_app/pregistration/pages/prereg_profile_page.dart';
-import 'package:comwell_key_app/themes/dark_theme.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
-import 'package:go_router/go_router.dart';
enum PreregistrationPage {
profile,
diff --git a/comwell_key_app/lib/profile/components/profile_page_widget.dart b/comwell_key_app/lib/profile/components/profile_page_widget.dart
index 63d5ff98..77e06fa3 100644
--- a/comwell_key_app/lib/profile/components/profile_page_widget.dart
+++ b/comwell_key_app/lib/profile/components/profile_page_widget.dart
@@ -135,7 +135,8 @@ class ProfilePageWidget extends StatelessWidget {
text: 'payment_card_profile_menu'.tr(),
trailingIcon: Icons.chevron_right,
onTap: () {
- context.pushNamed(AppRoutes.paymentCards.name);
+
+ context.pushNamed(AppRoutes.paymentCards.name, queryParameters: {'needsScaffold': 'true'});
},
),
const Padding(
diff --git a/comwell_key_app/lib/profile/profile_repository.dart b/comwell_key_app/lib/profile/profile_repository.dart
index bb8612ff..831476ac 100644
--- a/comwell_key_app/lib/profile/profile_repository.dart
+++ b/comwell_key_app/lib/profile/profile_repository.dart
@@ -6,7 +6,6 @@ import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_rep
import 'package:comwell_key_app/services/api.dart';
import 'package:comwell_key_app/services/mappers/booking_mapper.dart';
import 'package:comwell_key_app/services/mappers/user_mapper.dart';
-import 'package:comwell_key_app/services/models/booking_dto.dart';
import 'package:comwell_key_app/services/models/bookings_dto.dart';
import 'package:comwell_key_app/services/models/user_dto.dart';
import 'package:comwell_key_app/utils/json.dart';
@@ -46,7 +45,7 @@ class ProfileRepository {
final response = await api.getBookingDetails(bookingId);
await db.bookingsDao.insertBookings(BookingsDTO(current: [response], past: [], cancelled: []));
final booking = response.toBooking(user.id, BookingStatus.current, ReservationStatus.fromString(response.status));
- print("booking: ${booking}");
+
return booking;
}
diff --git a/comwell_key_app/lib/profile_settings/components/intl_phone_field.dart b/comwell_key_app/lib/profile_settings/components/intl_phone_field.dart
index a3243201..80d85d5b 100644
--- a/comwell_key_app/lib/profile_settings/components/intl_phone_field.dart
+++ b/comwell_key_app/lib/profile_settings/components/intl_phone_field.dart
@@ -51,10 +51,7 @@ class IntlPhoneFieldState extends State<IntlPhoneField> {
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
- final countryCode = widget.countryCode.code;
-
- print("countryCode: $countryCode");
-
+
return Form(
key: formKey,
child: Container(
@@ -97,6 +94,7 @@ class IntlPhoneFieldState extends State<IntlPhoneField> {
style: theme.textTheme.headlineSmall,
onSubmitted: widget.onSubmitted,
onChanged: widget.onPhoneNumberChanged,
+
keyboardType:
const TextInputType.numberWithOptions(signed: true),
inputFormatters: [
diff --git a/comwell_key_app/lib/profile_settings/cubit/profile_settings_cubit.dart b/comwell_key_app/lib/profile_settings/cubit/profile_settings_cubit.dart
index 93e33822..75770c75 100644
--- a/comwell_key_app/lib/profile_settings/cubit/profile_settings_cubit.dart
+++ b/comwell_key_app/lib/profile_settings/cubit/profile_settings_cubit.dart
@@ -37,6 +37,8 @@ class ProfileSettingsCubit extends Cubit<ProfileSettingsState> {
try {
final user = await profileRepository.fetchProfileSettings();
+
+
countryCode = getCountryCodeFromPhoneNumber(user.phoneNumber).$1;
phoneNumber = getCountryCodeFromPhoneNumber(user.phoneNumber).$2;
@@ -100,7 +102,6 @@ class ProfileSettingsCubit extends Cubit<ProfileSettingsState> {
clubLevelName: state.user!.clubLevelName,
);
- print("updatedUser: ${updatedUser.phoneNumber}");
await profileSettingsRepository.updateUser(updatedUser);
emit(ProfileSettingsState(isLoading: false, user: updatedUser, error: null));
} catch (e) {
diff --git a/comwell_key_app/lib/profile_settings/profile_settings_page.dart b/comwell_key_app/lib/profile_settings/profile_settings_page.dart
index ffd122a1..aa5855e3 100644
--- a/comwell_key_app/lib/profile_settings/profile_settings_page.dart
+++ b/comwell_key_app/lib/profile_settings/profile_settings_page.dart
@@ -9,10 +9,8 @@ import 'package:comwell_key_app/profile_settings/components/intl_phone_field.dar
import 'package:comwell_key_app/profile_settings/components/text_field_with_trailing_icon.dart';
import 'package:comwell_key_app/profile_settings/cubit/profile_settings_cubit.dart';
import 'package:comwell_key_app/profile_settings/model/address.dart';
-import 'package:comwell_key_app/profile_settings/model/user.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/utils/locator.dart';
-import 'package:comwell_key_app/utils/phone_utils.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
diff --git a/comwell_key_app/lib/profile_settings/repostiory/profile_settings_repository.dart b/comwell_key_app/lib/profile_settings/repostiory/profile_settings_repository.dart
index 303845c5..7549c14c 100644
--- a/comwell_key_app/lib/profile_settings/repostiory/profile_settings_repository.dart
+++ b/comwell_key_app/lib/profile_settings/repostiory/profile_settings_repository.dart
@@ -21,7 +21,6 @@ class ProfileSettingsRepository {
final user = responseDto.toUser();
await db.userDAO.saveUser(responseDto);
- print("user: ${user}");
return user;
}
diff --git a/comwell_key_app/lib/routing/app_router.dart b/comwell_key_app/lib/routing/app_router.dart
index fc6c4a3e..6ee17bd2 100644
--- a/comwell_key_app/lib/routing/app_router.dart
+++ b/comwell_key_app/lib/routing/app_router.dart
@@ -61,23 +61,21 @@ final _shellNavigatorKey = GlobalKey<NavigatorState>();
GoRouter goRouter() {
final authRepo = locator<AuthenticationRepository>();
-
+
return GoRouter(
initialLocation: '/login',
navigatorKey: _rootNavigatorKey,
debugLogDiagnostics: true,
observers: [GoRouterObserver()],
- refreshListenable:
- StreamToListenable([authRepo.broadcast]),
+ refreshListenable: StreamToListenable([authRepo.broadcast]),
redirect: (context, state) async {
final status = authRepo.statusBuffer;
- final isAuthenticated =
- status == AuthenticationStatus.authenticated;
+ final isAuthenticated = status == AuthenticationStatus.authenticated;
final isUnAuthenticated =
- status == AuthenticationStatus.unauthenticated || status == AuthenticationStatus.forcedUnauthenticated;
-
+ status == AuthenticationStatus.unauthenticated ||
+ status == AuthenticationStatus.forcedUnauthenticated;
- if (status == AuthenticationStatus.unknown) {
+ if (status == AuthenticationStatus.unknown) {
bool doesTokenExist = await authRepo.doesTokenExist();
if (doesTokenExist) {
authRepo.logIn();
@@ -87,7 +85,7 @@ GoRouter goRouter() {
// Redirect to the login page if the user is not authenticated, and if authenticated, do not show the login page
if (isUnAuthenticated && !state.matchedLocation.contains("/login")) {
final forced = status == AuthenticationStatus.forcedUnauthenticated;
-
+
return "/login?forced=$forced";
}
// Redirect to the booking_details page if the user is authenticated
@@ -293,7 +291,10 @@ GoRouter goRouter() {
builder: (context, state) {
return BlocProvider(
create: (context) => PaymentCardsCubit(),
- child: const PaymentCardsPage());
+ child: Builder(builder: (context) {
+ final needsScaffold = state.uri.queryParameters['needsScaffold'] == 'true';
+ return PaymentCardsPage(needScaffold: needsScaffold);
+ }));
}),
GoRoute(
path: "/login",
diff --git a/comwell_key_app/lib/services/api.dart b/comwell_key_app/lib/services/api.dart
index dbe22646..f924be5d 100644
--- a/comwell_key_app/lib/services/api.dart
+++ b/comwell_key_app/lib/services/api.dart
@@ -80,9 +80,8 @@ class Api {
}
Future<Response<dynamic>> fetchProfileSettings() async {
- print("fetching profile settings");
final response = await dio.get(ApiEndpoints.getGuestProfile);
- print("response=$response");
+
return response;
}
diff --git a/comwell_key_app/lib/services/http_client.dart b/comwell_key_app/lib/services/http_client.dart
index cfe3f00f..bfdee632 100644
--- a/comwell_key_app/lib/services/http_client.dart
+++ b/comwell_key_app/lib/services/http_client.dart
@@ -1,6 +1,7 @@
import 'package:comwell_key_app/services/interceptors/response_handle_interceptor.dart';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
+import 'package:flutter_dotenv/flutter_dotenv.dart';
class HttpClient {
@@ -15,7 +16,7 @@ class HttpClient {
static Dio _createDio() {
var dio = Dio(
BaseOptions(
- baseUrl: "https://apim-comwell-net-services-dev.azure-api.net/api",
+ baseUrl: dotenv.env['SERVICE_URL'] ?? 'https://apim-comwell-net-services-stage.azure-api.net/api',
receiveTimeout: const Duration(milliseconds: 10000),
connectTimeout: const Duration(milliseconds: 10000),
sendTimeout: const Duration(milliseconds: 10000),
diff --git a/comwell_key_app/lib/tracking/trackers/firebase_tracker.dart b/comwell_key_app/lib/tracking/trackers/firebase_tracker.dart
index fc256ed8..c73e2740 100644
--- a/comwell_key_app/lib/tracking/trackers/firebase_tracker.dart
+++ b/comwell_key_app/lib/tracking/trackers/firebase_tracker.dart
@@ -28,7 +28,6 @@ class FirebaseTracker {
}
void _track(String name, Map<String, dynamic>? parameters) async {
- print("name=$name, parameters=$parameters");
try {
await _tracking.logEvent(
name: name,
diff --git a/comwell_key_app/lib/utils/phone_utils.dart b/comwell_key_app/lib/utils/phone_utils.dart
index 5b02ef28..0598148e 100644
--- a/comwell_key_app/lib/utils/phone_utils.dart
+++ b/comwell_key_app/lib/utils/phone_utils.dart
@@ -1,22 +1,25 @@
-
import 'package:country_code_picker/country_code_picker.dart';
(CountryCode, String) getCountryCodeFromPhoneNumber(String phoneNumber) {
+ try {
+ if (phoneNumber.isEmpty) {
+ return (CountryCode.fromDialCode('+45'), '');
+ }
- if (phoneNumber.isEmpty) {
- return (CountryCode.fromDialCode('+45'), '');
- }
-
- final countryCode = phoneNumber.length == 13
- ? CountryCode.fromDialCode(phoneNumber.substring(0, 4))
- : CountryCode.fromDialCode(phoneNumber.substring(0, 3));
+ final countryCode = phoneNumber.length >= 13
+ ? CountryCode.fromCountryCode(phoneNumber.substring(0, 4))
+ : CountryCode.fromDialCode(phoneNumber.substring(0, 3));
- final cleanedPhoneNumber = phoneNumber.substring(countryCode.dialCode!.length);
+ final cleanedPhoneNumber =
+ phoneNumber.substring(countryCode.dialCode!.length);
-
- return (countryCode, cleanedPhoneNumber);
+ return (countryCode, cleanedPhoneNumber);
+ } catch (e) {
+ return (CountryCode.fromDialCode('+45'), '');
+ }
}
-String concatCountryCodeAndPhoneNumber(CountryCode countryCode, String phoneNumber) {
+String concatCountryCodeAndPhoneNumber(
+ CountryCode countryCode, String phoneNumber) {
return "${countryCode.dialCode}$phoneNumber";
}
diff --git a/comwell_key_app/lib/utils/time_utils.dart b/comwell_key_app/lib/utils/time_utils.dart
index 0090204a..0816cd12 100644
--- a/comwell_key_app/lib/utils/time_utils.dart
+++ b/comwell_key_app/lib/utils/time_utils.dart
@@ -4,4 +4,13 @@ extension TimeStringUtls on num {
if(this < 10) return "0$this";
return "$this";
}
+}
+
+(int, int, int, int) getDurationInMinutes(Duration duration) {
+ final days = duration.inDays;
+ final hours = duration.inHours % 24;
+ final minutes = duration.inMinutes % 60;
+ final seconds = duration.inSeconds % 60;
+
+ return (days, hours, minutes, seconds);
}
\ No newline at end of file
diff --git a/comwell_key_app/test/overview_test/overview_cubic_test.dart b/comwell_key_app/test/overview_test/overview_cubic_test.dart
index d4f154ec..655eb146 100644
--- a/comwell_key_app/test/overview_test/overview_cubic_test.dart
+++ b/comwell_key_app/test/overview_test/overview_cubic_test.dart
@@ -45,7 +45,10 @@ void main() {
booker: const Guest(name: "name", id: "id"),
bookingDate: DateTime(2021, 10, 10),
digitalCard: true,
- totalCharge: 100)
+ totalCharge: 100,
+ reservationStatus: ReservationStatus.newreservation,
+ balance: 100,
+ maskedCardNumber: "1234567890")
],
past: const [],
cancelled: const [],
@@ -74,7 +77,10 @@ void main() {
booker: const Guest(name: "name", id: "id"),
bookingDate: DateTime(2021, 10, 10),
digitalCard: true,
- totalCharge: 100)
+ totalCharge: 100,
+ reservationStatus: ReservationStatus.newreservation,
+ balance: 100,
+ maskedCardNumber: "1234567890")
],
past: const [],
cancelled: const [],
@@ -125,7 +131,10 @@ void main() {
booker: const Guest(name: "name", id: "id"),
bookingDate: DateTime(2021, 10, 10),
digitalCard: true,
- totalCharge: 100)),
+ totalCharge: 100,
+ reservationStatus: ReservationStatus.newreservation,
+ balance: 100,
+ maskedCardNumber: "1234567890")),
expect: () => [
OverviewLoaded(
bookings: Bookings(
@@ -146,7 +155,10 @@ void main() {
booker: const Guest(name: "name", id: "id"),
bookingDate: DateTime(2021, 10, 10),
digitalCard: true,
- totalCharge: 100)
+ totalCharge: 100,
+ reservationStatus: ReservationStatus.newreservation,
+ balance: 100,
+ maskedCardNumber: "1234567890")
],
past: const [],
cancelled: const [],
diff --git a/comwell_key_app/test/overview_test/overview_repository_test.dart b/comwell_key_app/test/overview_test/overview_repository_test.dart
index d6bad831..5d6a5726 100644
--- a/comwell_key_app/test/overview_test/overview_repository_test.dart
+++ b/comwell_key_app/test/overview_test/overview_repository_test.dart
@@ -36,6 +36,9 @@ void main() {
bookingDate: DateTime.now(),
digitalCard: true,
totalCharge: 100,
+ reservationStatus: ReservationStatus.newreservation,
+ balance: 100,
+ maskedCardNumber: "1234567890"
),
],
past: const [],
@@ -72,6 +75,9 @@ void main() {
bookingDate: DateTime.now(),
digitalCard: true,
totalCharge: 100,
+ reservationStatus: ReservationStatus.newreservation,
+ balance: 100,
+ maskedCardNumber: "1234567890"
);
when(() => overviewRepository.findBooking(bookingReference, lastName))