6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit f3c69301
Changed files
comwell_key_app/assets/translations/da-DK.json | 4 +- comwell_key_app/assets/translations/en-US.json | 4 +- .../up_sales/models/dto/addon_upgrade_dto.g.dart | 2 +- .../up_sales/models/facility_type.g.dart | 20 +++ .../booking_details/bloc/booking_details_bloc.dart | 3 - .../lib/booking_details/booking_details_page.dart | 4 +- .../components/booking_details_bottom_sheet.dart | 8 +- .../choose_share_room_repository.dart | 1 - .../choose_share_room/pages/room_info_page.dart | 24 ---- .../lib/common/components/comwell_text_field.dart | 19 +-- .../cubit/hotel_information_cubit.dart | 2 - .../repository/hotel_information_repository.dart | 50 +------ .../lib/my_booking/my_booking_page.dart | 1 - comwell_key_app/lib/overview/overview_page.dart | 2 +- .../pregistration/components/information_card.dart | 2 +- .../pregistration/cubit/preregistration_cubit.dart | 156 ++++++++++----------- .../pregistration/cubit/preregistration_state.dart | 92 ++++-------- .../pages/prereg_confirmation_page.dart | 10 +- .../pregistration/pages/prereg_profile_page.dart | 6 +- .../pages/prereg_up_sales_catalog_page.dart | 38 ++--- .../lib/pregistration/preregistration_flow.dart | 85 ++++++----- comwell_key_app/lib/pregistration/utils/utils.dart | 12 +- comwell_key_app/lib/routing/app_router.dart | 24 ++-- comwell_key_app/lib/routing/app_routes.dart | 1 + comwell_key_app/lib/services/api.dart | 4 - .../lib/services/mappers/addon_item_mapper.dart | 14 +- .../lib/services/mappers/booking_mapper.dart | 2 +- .../lib/services/mappers/room_mapper.dart | 1 - comwell_key_app/lib/services/models/room_dto.dart | 1 - .../up_sales/components/addon_item_counter.dart | 74 ++++++++++ .../components/catalog/addon_upgrade_catalog.dart | 3 +- .../components/catalog/service_catalog.dart | 9 +- .../up_sales/components/facility_icon_text.dart | 1 - .../up_sales/components/generic_item_counter.dart | 74 ---------- .../components/up_sales_upgrades_widget.dart | 29 ++-- .../lib/up_sales/cubit/up_sales_cubit.dart | 18 +-- .../lib/up_sales/cubit/up_sales_state.dart | 15 +- .../lib/up_sales/mappers/addon_upgrade_mapper.dart | 4 +- .../lib/up_sales/mappers/up_sales_mapper.dart | 8 +- .../lib/up_sales/models/addon_upgrade.dart | 2 + .../lib/up_sales/models/dto/addon_upgrade_dto.dart | 5 +- .../lib/up_sales/models/dto/room_upgrade_dto.dart | 1 - .../lib/up_sales/models/facility_type.dart | 22 +++ .../lib/up_sales/models/room_upgrade.dart | 3 +- .../lib/up_sales/pages/addon_upgrade_page.dart | 56 +++++--- .../pages/processing/up_sales_error_page.dart | 64 +++++++++ .../pages/processing/up_sales_processing_page.dart | 105 ++++++++++++++ .../lib/up_sales/pages/services_upgrade_page.dart | 16 +-- .../up_sales/pages/up_sale_confirmation_page.dart | 16 +-- .../up_sales/pages/up_sales_processing_page.dart | 107 -------------- .../lib/up_sales/up_sales_repository.dart | 2 - 51 files changed, 605 insertions(+), 621 deletions(-)
Diff
diff --git a/comwell_key_app/assets/translations/da-DK.json b/comwell_key_app/assets/translations/da-DK.json
index 3d0f45e0..939409ae 100644
--- a/comwell_key_app/assets/translations/da-DK.json
+++ b/comwell_key_app/assets/translations/da-DK.json
@@ -321,5 +321,7 @@
"invalid_birthday_description": "Din gemte fødselsdag er ikke tilladt. Vælg en ny dato.",
"up_sales_confirmation_title": "Betalingsoversigt",
"up_sales_confirmation_no_up_sales": "Ingen tilvalg valgt.",
- "facilities": "Faciliteter"
+ "facilities": "Faciliteter",
+ "remove": "Fjern",
+ "up_sales_processing_error_title": "Kunne ikke tilføje tilkøb"
}
\ 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 196d5ba8..6f991610 100644
--- a/comwell_key_app/assets/translations/en-US.json
+++ b/comwell_key_app/assets/translations/en-US.json
@@ -324,5 +324,7 @@
"invalid_birthday_description": "Your saved birthday is not allowed. Please pick a new date.",
"up_sales_confirmation_title": "Payment overview",
"up_sales_confirmation_no_up_sales": "No upgrades selected.",
- "facilities": "Facilities"
+ "facilities": "Facilities",
+ "remove": "Remove",
+ "up_sales_processing_error_title": "Failed to add addons"
}
diff --git a/comwell_key_app/lib/.generated/up_sales/models/dto/addon_upgrade_dto.g.dart b/comwell_key_app/lib/.generated/up_sales/models/dto/addon_upgrade_dto.g.dart
index 11780278..039e32b4 100644
--- a/comwell_key_app/lib/.generated/up_sales/models/dto/addon_upgrade_dto.g.dart
+++ b/comwell_key_app/lib/.generated/up_sales/models/dto/addon_upgrade_dto.g.dart
@@ -15,7 +15,7 @@ AddOnUpgradeDTO _$AddOnUpgradeDTOFromJson(Map json) => AddOnUpgradeDTO(
images: (json['images'] as List<dynamic>).map((e) => e as String),
description: json['description'] as String,
tags: (json['tags'] as List<dynamic>).map((e) => e as String),
- quantity: (json['quantity'] as num?)?.toInt(),
+ quantity: (json['quantity'] as num?)?.toInt() ?? 0,
isService: json['isService'] as bool? ?? false,
);
diff --git a/comwell_key_app/lib/.generated/up_sales/models/facility_type.g.dart b/comwell_key_app/lib/.generated/up_sales/models/facility_type.g.dart
new file mode 100644
index 00000000..e1fd0e6b
--- /dev/null
+++ b/comwell_key_app/lib/.generated/up_sales/models/facility_type.g.dart
@@ -0,0 +1,20 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of '../../../up_sales/models/facility_type.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+FacilityType _$FacilityTypeFromJson(Map json) => FacilityType(
+ name: json['name'] as String,
+ icon: json['icon'] as String,
+ groupName: json['groupName'] as String,
+ );
+
+Map<String, dynamic> _$FacilityTypeToJson(FacilityType instance) =>
+ <String, dynamic>{
+ 'name': instance.name,
+ 'icon': instance.icon,
+ 'groupName': instance.groupName,
+ };
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 bbf62ecc..018887de 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
@@ -1,11 +1,8 @@
import 'dart:async';
-import 'dart:ui';
-
import 'package:bloc/bloc.dart';
import 'package:comwell_key_app/overview/models/guest.dart';
import 'package:comwell_key_app/profile/profile_repository.dart';
import 'package:comwell_key_app/profile_settings/model/user.dart';
-import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
import 'package:comwell_key_app/up_sales/models/up_sales.dart';
import 'package:comwell_key_app/up_sales/models/upgrade.dart';
import 'package:comwell_key_app/up_sales/up_sales_repository.dart';
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 768b744c..72f39f33 100644
--- a/comwell_key_app/lib/booking_details/booking_details_page.dart
+++ b/comwell_key_app/lib/booking_details/booking_details_page.dart
@@ -27,9 +27,8 @@ class BookingDetailsPage extends StatelessWidget {
if (state.status == BookingDetailsStatus.initial) {
cubit.add(InitialEvent());
- // cubit.add(GetBookingDetailsEvent(cubit.booking.confirmationId));
}
- print(cubit.booking);
+
return Scaffold(
extendBodyBehindAppBar: true,
backgroundColor: Colors.white,
@@ -37,7 +36,6 @@ class BookingDetailsPage extends StatelessWidget {
body: Builder(
builder: (context) {
if (state.status == BookingDetailsStatus.loading) {
- print('loading');
return const Center(
child: BookingDetailsShimmerLoader(),
);
diff --git a/comwell_key_app/lib/booking_details/components/booking_details_bottom_sheet.dart b/comwell_key_app/lib/booking_details/components/booking_details_bottom_sheet.dart
index 6a66d9a9..089fc14f 100644
--- a/comwell_key_app/lib/booking_details/components/booking_details_bottom_sheet.dart
+++ b/comwell_key_app/lib/booking_details/components/booking_details_bottom_sheet.dart
@@ -144,6 +144,9 @@ class BookingDetailsBottomSheet extends StatelessWidget {
Widget _buildServices(BuildContext context) {
final theme = Theme.of(context);
+ final serviceUpgrades = cubit.upSales?.addOnUpgrades
+ .where((upgrade) => upgrade.isService)
+ .toList() ?? [];
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -170,10 +173,11 @@ class BookingDetailsBottomSheet extends StatelessWidget {
],
),
const SizedBox(height: 16),
- if (cubit.upSales != null)
+ if (serviceUpgrades.isNotEmpty)
ServiceCatalog(
+ bookingDetailsBloc: cubit,
booking: cubit.booking,
- upSales: cubit.upSales!.addOnUpgrades,
+ upSales: serviceUpgrades,
height: 252,
showRadioButton: false,
isSinglePurchase: true,
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
index b3bd9be4..26d88e57 100644
--- 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
@@ -1,7 +1,6 @@
import 'package:comwell_key_app/overview/models/room.dart';
import 'package:comwell_key_app/services/mappers/room_mapper.dart';
import 'package:comwell_key_app/services/models/room_dto.dart';
-import 'package:comwell_key_app/up_sales/models/dto/addon_upgrade_dto.dart';
class ChooseShareRoomRepository {
String baseUrl;
diff --git a/comwell_key_app/lib/choose_share_room/pages/room_info_page.dart b/comwell_key_app/lib/choose_share_room/pages/room_info_page.dart
index e0062fff..3128c850 100644
--- a/comwell_key_app/lib/choose_share_room/pages/room_info_page.dart
+++ b/comwell_key_app/lib/choose_share_room/pages/room_info_page.dart
@@ -8,13 +8,10 @@ import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/common/components/room_image_carousel.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/up_sales/models/facility_type.dart';
-import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:comwell_key_app/up_sales/components/facility_icon_text.dart';
-import 'package:comwell_key_app/up_sales/components/facilities_bottom_sheet.dart';
import 'package:comwell_key_app/up_sales/components/tags.dart';
-import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:comwell_key_app/common/components/shimmer_loader/room_info_shimmer_loader.dart';
import 'package:go_router/go_router.dart';
@@ -194,25 +191,4 @@ class _RoomInfoPageState extends State<RoomInfoPage> {
});
}
- void _showFacilitiesSheet(
- BuildContext context, List<FacilityType> facilities) {
- showModalBottomSheet<void>(
- context: context,
- isScrollControlled: true,
- enableDrag: true,
- shape: const RoundedRectangleBorder(
- borderRadius: BorderRadius.vertical(top: Radius.circular(24)),
- ),
- builder: (context) {
- return ConstrainedBox(
- constraints: BoxConstraints(
- maxHeight: MediaQuery.of(context).size.height - kComwellAppBarHeight,
- ),
- child: FacilitiesBottomSheet(
- facilities: facilities,
- ),
- );
- },
- );
- }
}
diff --git a/comwell_key_app/lib/common/components/comwell_text_field.dart b/comwell_key_app/lib/common/components/comwell_text_field.dart
index 05b0298c..3e1e1ccb 100644
--- a/comwell_key_app/lib/common/components/comwell_text_field.dart
+++ b/comwell_key_app/lib/common/components/comwell_text_field.dart
@@ -52,6 +52,12 @@ class ComwellTextFieldState extends State<ComwellTextField> {
final errorMessage = _isFocused ? null : widget.errorMessage;
final labelTextColor =
errorMessage == null ? Colors.black : const Color(0xFFEB0026);
+ final textStyle = widget.readOnly
+ ? theme.textTheme.headlineSmall?.copyWith(color: colorDivider)
+ : _isFocused
+ ? theme.textTheme.bodySmall
+ ?.copyWith(color: Colors.black.withAlpha((0.65 * 255).toInt()))
+ : theme.textTheme.headlineSmall?.copyWith(color: labelTextColor);
return Column(
children: [
TextField(
@@ -66,12 +72,7 @@ class ComwellTextFieldState extends State<ComwellTextField> {
.textTheme
.bodySmall
?.copyWith(color: const Color(0xFFEB0026)),
- label: Text(widget.fieldName,
- style: widget.readOnly ? theme.textTheme.headlineSmall?.copyWith(color: colorDivider) : _isFocused
- ? theme.textTheme.bodySmall
- ?.copyWith(color: Colors.black.withAlpha((0.65 * 255).toInt()))
- : theme.textTheme.headlineSmall
- ?.copyWith(color: labelTextColor)),
+ label: Text(widget.fieldName, style: textStyle),
errorBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Color(0xFFEB0026)),
borderRadius: BorderRadius.circular(8)),
@@ -81,9 +82,9 @@ class ComwellTextFieldState extends State<ComwellTextField> {
focusedBorder: OutlineInputBorder(
borderSide: const BorderSide(color: colorDivider),
borderRadius: BorderRadius.circular(8)),
- enabledBorder: OutlineInputBorder(
- borderSide: const BorderSide(color: colorDivider),
- borderRadius: BorderRadius.circular(8)),
+ enabledBorder: OutlineInputBorder(
+ borderSide: const BorderSide(color: colorDivider),
+ borderRadius: BorderRadius.circular(8)),
contentPadding:
const EdgeInsets.symmetric(vertical: 20, horizontal: 12),
),
diff --git a/comwell_key_app/lib/hotel_information/cubit/hotel_information_cubit.dart b/comwell_key_app/lib/hotel_information/cubit/hotel_information_cubit.dart
index 53077fac..dd1bcf09 100644
--- a/comwell_key_app/lib/hotel_information/cubit/hotel_information_cubit.dart
+++ b/comwell_key_app/lib/hotel_information/cubit/hotel_information_cubit.dart
@@ -1,5 +1,3 @@
-import 'dart:ui';
-
import 'package:bloc/bloc.dart';
import 'package:comwell_key_app/hotel_information/models/hotel.dart';
import 'package:comwell_key_app/hotel_information/repository/hotel_information_repository.dart';
diff --git a/comwell_key_app/lib/hotel_information/repository/hotel_information_repository.dart b/comwell_key_app/lib/hotel_information/repository/hotel_information_repository.dart
index 6880dfe7..fd42d870 100644
--- a/comwell_key_app/lib/hotel_information/repository/hotel_information_repository.dart
+++ b/comwell_key_app/lib/hotel_information/repository/hotel_information_repository.dart
@@ -1,5 +1,3 @@
-import 'dart:ui';
-
import 'package:comwell_key_app/hotel_information/models/hotel.dart';
import 'package:comwell_key_app/services/api.dart';
import 'package:comwell_key_app/utils/json.dart';
@@ -18,51 +16,5 @@ class HotelInformationRepository {
}
}
}
- // Fetch hotel information
- // return Hotel(
- // id: '1',
- // name: 'Comwell Hotel',
- // address: 'Vesterbrogade 6C',
- // city: 'Copenhagen',
- // country: 'Denmark',
- // starRating: 4,
- // image: 'assets/images/current_room.png',
- // facilities: [
- // Restaurant(
- // name: 'Restaurant Borupgaard',
- // subtitle: "Læs om vores restaurant",
- // description: 'Restaurant Linden på Comwell Borupgaard får du en udsøgt gourmetoplevelse, der er fyldt med både smag og styrke. Restauranten byder på ren idyl og hygge, samt en intim atmosfære med service i særklasse.',
- // imageUrl: 'assets/images/restaurant_cover.png',
- // address: 'Nørrevej 80, 3070 Snekkersten',
- // openingHours: 'Restaurant Linden er åben alle dage kl. 12.00-14.00 og 18.00-22.30 (køkkenet lukket kl. 21.30)',
- // phoneNumber: '+4528424242',
- // email: 'email@comwell.com'),
- // Restaurant(
- // name: 'Restaurant 2',
- // subtitle: "Visit",
- // description: 'Description 1',
- // imageUrl: 'assets/images/restaurant_cover.png',
- // address: 'Address 2',
- // openingHours: 'Opening Hours 2',
- // phoneNumber: '+4528424242',
- // email: 'email@comwell.com'),
- // Spa(
- // title: 'Spa 1',
- // subtitle: "Visit",
- // description: 'Description 1',
- // image: 'assets/images/spa1.jpg'),
- // Spa(
- // title: 'Spa 2',
- // subtitle: "Visit",
- // description: 'Description 2',
- // image: 'assets/images/spa2.jpg'),
- // ParkingInfo(
- // title: 'Parking',
- // subtitle: "Park here",
- // description: 'Description',
- // electricCharging: true,
- // electricChargingTitle: 'Electric Charging',
- // electricChargingDescription: 'Electric Charging Description'),
- // ],
- // );
+
diff --git a/comwell_key_app/lib/my_booking/my_booking_page.dart b/comwell_key_app/lib/my_booking/my_booking_page.dart
index e481cab0..20ec9eb9 100644
--- a/comwell_key_app/lib/my_booking/my_booking_page.dart
+++ b/comwell_key_app/lib/my_booking/my_booking_page.dart
@@ -6,7 +6,6 @@ import 'package:comwell_key_app/my_booking/components/balance_bottom_sheet.dart'
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/profile/profile_repository.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
-import 'package:comwell_key_app/up_sales/models/up_sales.dart';
import 'package:comwell_key_app/up_sales/up_sales_repository.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:easy_localization/easy_localization.dart';
diff --git a/comwell_key_app/lib/overview/overview_page.dart b/comwell_key_app/lib/overview/overview_page.dart
index 97b56877..d51b96c5 100644
--- a/comwell_key_app/lib/overview/overview_page.dart
+++ b/comwell_key_app/lib/overview/overview_page.dart
@@ -55,7 +55,7 @@ class OverviewTabViewState extends State<OverviewPage>
child: BlocBuilder<OverviewCubit, OverviewState>(
builder: (context, state) {
return Scaffold(
- backgroundColor: Colors.white,
+ backgroundColor: colorBackground,
appBar: const ComwellAppBar(
shouldShowBackButton: false,
),
diff --git a/comwell_key_app/lib/pregistration/components/information_card.dart b/comwell_key_app/lib/pregistration/components/information_card.dart
index 538ccb12..32720d52 100644
--- a/comwell_key_app/lib/pregistration/components/information_card.dart
+++ b/comwell_key_app/lib/pregistration/components/information_card.dart
@@ -21,7 +21,7 @@ class InformationCard extends StatelessWidget {
return Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
- color: sandColor[20],
+ color: sandColor[10],
borderRadius: const BorderRadius.all(Radius.circular(10))),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
diff --git a/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart b/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart
index f275d7e5..41a04ff7 100644
--- a/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart
+++ b/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart
@@ -54,11 +54,9 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
isLoading: false,
selected: false,
availableRoomUpgrades: [],
- selectedUpSales: [],
- availableAddOnUpgrades: [],
+ addOnUpgrades: [],
selectedRoomUpgrade: '',
missingInformation: false,
- numOfExtras: 0,
extrasTotalPrice: 0,
termsAndConditionsAccepted: false,
forceUpdate: false,
@@ -76,16 +74,32 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
"/pre-registration/betalingskort",
);
+ phoneNumberTextController.addListener(() {
+ emit(state.copyWith(
+ isPhoneNumberValid: isPhoneNumberValid,
+ missingInformation: false,
+ ));
+ });
+
addressTextController.addListener(() {
- emit(state.copyWith(isAddressValid: isAddressValid));
+ emit(state.copyWith(
+ isAddressValid: isAddressValid,
+ missingInformation: false,
+ ));
});
postalCodeTextController.addListener(() {
- emit(state.copyWith(isPostalCodeValid: isPostalCodeValid));
+ emit(state.copyWith(
+ isPostalCodeValid: isPostalCodeValid,
+ missingInformation: false,
+ ));
});
cityTextController.addListener(() {
- emit(state.copyWith(isCityValid: isCityValid));
+ emit(state.copyWith(
+ isCityValid: isCityValid,
+ missingInformation: false,
+ ));
});
}
@@ -114,7 +128,7 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
}
void onAddressContinueClicked() {
- if (isAddressValid && isCityValid) {
+ if (isAddressValid && isCityValid && isPostalCodeValid) {
final updatedUser = state.user!.copyWith(
address: Address(
street: addressTextController.text,
@@ -131,16 +145,19 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
}
void onProfileContinueClicked() {
+ if (isFirstNameValid && isLastNameValid && isPhoneNumberValid) {
final phoneNumber = concatCountryCodeAndPhoneNumber(
countryCode!, phoneNumberTextController.text);
-
final updatedUser = state.user!.copyWith(
firstName: firstNameTextController.text,
lastName: lastNameTextController.text,
phoneNumber: phoneNumber);
- emit(state.copyWith(user: updatedUser));
+ emit(state.copyWith(user: updatedUser));
- _navigateNextPage();
+ _navigateNextPage();
+ } else {
+ emit(state.copyWith(missingInformation: true));
+ }
}
void onPaymentContinueClicked() {
@@ -148,12 +165,6 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
}
void onUpSalesContinueClicked() {
- emit(state.updateSelectedUpSales(
- selectedUpSales: state.selectedUpSales,
- numOfExtras: state.selectedUpSales.length +
- (state.selectedRoomUpgrade.isNotEmpty ? 1 : 0),
- extrasTotalPrice: extrasTotalPrice));
-
_navigateNextPage();
}
@@ -166,9 +177,9 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
case PreregistrationPage.address:
onAddressContinueClicked();
break;
- case PreregistrationPage.payment:
- onPaymentContinueClicked();
- break;
+ // case PreregistrationPage.payment:
+ // onPaymentContinueClicked();
+ // break;
case PreregistrationPage.upSales:
onUpSalesContinueClicked();
break;
@@ -212,11 +223,10 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
final confirmationId = booking.confirmationId;
await _profileSettingsRepository.updateUser(state.user!);
+ addUpSalesToBooking();
final preRegResponse = await _preregistrationRepository
.createPreregistration(confirmationId);
- addUpSalesToBooking(state.selectedUpSales, state.selectedRoomUpgrade);
-
if (preRegResponse != null) {
Future.delayed(const Duration(seconds: 3), () {
emit(state.copyWith(isLoading: false));
@@ -229,23 +239,18 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
}
}
- Future<void> addUpSalesToBooking(
- List<Upgrade> selectedUpSales, String? selectedRoomUpgrade) async {
- try {
- // Extract RoomUpgrade from selectedUpSales to get the roomType
- final roomType = selectedRoomUpgrade ?? '';
+ Future<void> addUpSalesToBooking() async {
+ // Extract RoomUpgrade from selectedUpSales to get the roomType
+ final roomType = state.selectedRoomUpgrade;
- // Convert selected up sales to AddOnList objects using their individual quantities
- final List<AddOnList> addonList = selectedUpSales
- .map((upgrade) =>
- AddOnList(itemCode: upgrade.id, quantity: upgrade.quantity))
- .toList();
+ // Convert selected up sales to AddOnList objects using their individual quantities
+ final List<AddOnList> addonList = state.addOnUpgrades
+ .map((upgrade) =>
+ AddOnList(itemCode: upgrade.id, quantity: upgrade.quantity))
+ .toList();
- await _upSalesRepository.addUpSalesToBooking(
- booking.confirmationId, booking.hotelCode, roomType, addonList);
- } catch (e) {
- print(e);
- }
+ await _upSalesRepository.addUpSalesToBooking(
+ booking.confirmationId, booking.hotelCode, roomType, addonList);
}
void onEditProfileClicked() {
@@ -256,9 +261,9 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
_navigateTo(PreregistrationPage.address);
}
- void onEditPaymentMethodCLickked() {
- _navigateTo(PreregistrationPage.payment);
- }
+ // void onEditPaymentMethodCLickked() {
+ // _navigateTo(PreregistrationPage.payment);
+ // }
void onEditExtrasClicked() {
_navigateTo(PreregistrationPage.upSales);
@@ -314,9 +319,11 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
}
int get extrasTotalPrice {
- //This is the total price of the selected up sales and the price of the selected room upgrade if it is selected
- return state.selectedUpSales
- .fold(0, (sum, upgrade) => sum + upgrade.price * upgrade.quantity) +
+ //This is the total price of the selected up sales and the price of the selected
+ //room upgrade if it is selected
+
+ return selectedAddOnUpgrades.fold(
+ 0, (sum, upgrade) => sum + upgrade.price * upgrade.quantity) +
(state.selectedRoomUpgrade.isNotEmpty
? upSales.roomUpgrades
.firstWhere((e) => e.id == state.selectedRoomUpgrade)
@@ -324,6 +331,22 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
: 0);
}
+ int get numOfExtras =>
+ selectedAddOnUpgrades.fold(0, (sum, upgrade) => sum + upgrade.quantity) +
+ (state.selectedRoomUpgrade.isNotEmpty ? 1 : 0);
+
+ List<AddOnUpgrade> get otherUpgrades {
+ final selectedUpgrades =
+ state.addOnUpgrades.where((upgrade) => !upgrade.isService).toList();
+ return selectedUpgrades;
+ }
+
+ List<AddOnUpgrade> get selectedAddOnUpgrades {
+ final selectedUpgrades =
+ state.addOnUpgrades.where((upgrade) => upgrade.isAddedToCart).toList();
+ return selectedUpgrades;
+ }
+
@override
Future<void> close() {
addressTextController.dispose();
@@ -361,8 +384,8 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
return isFirstNameValid && isLastNameValid && isPhoneNumberValid;
case PreregistrationPage.address:
return isAddressValid && isPostalCodeValid && isCityValid;
- case PreregistrationPage.payment:
- return state.termsAndConditionsAccepted;
+ // case PreregistrationPage.payment:
+ // return true;
case PreregistrationPage.upSales:
return true;
case PreregistrationPage.confirmation:
@@ -378,10 +401,11 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
return "generic_continue".tr();
case PreregistrationPage.address:
return "generic_continue".tr();
- case PreregistrationPage.payment:
- return "generic_continue".tr();
+ // case PreregistrationPage.payment:
+ // return "generic_continue".tr();
case PreregistrationPage.upSales:
- if (state.selectedUpSales.isEmpty) {
+ if (selectedAddOnUpgrades.isEmpty &&
+ state.selectedRoomUpgrade.isEmpty) {
return "continue_without_up_sales".tr();
}
return "generic_continue".tr();
@@ -394,19 +418,11 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
emit(state.copyWith(termsAndConditionsAccepted: toggle));
}
- void addSelected(Upgrade upgrade) {
- if (upgrade is RoomUpgrade) {
- emit(state.updateRoomUpgrade(roomUpgrade: upgrade));
- } else {
- emit(state.addSelectedUpsales(upgrade: upgrade));
- }
- }
-
- void removeUpgrade(Upgrade upgrade) {
+ void toggleSelectedUpgrade(Upgrade upgrade) {
if (upgrade is RoomUpgrade) {
- emit(state.removeRoomUpgrade());
- } else {
- emit(state.removeSelectedUpSales(upgrade: upgrade));
+ emit(state.toggleRoomUpgrade(roomUpgrade: upgrade));
+ } else if (upgrade is AddOnUpgrade) {
+ emit(state.toggleSelectedAddonUpsale(upgrade: upgrade));
}
}
@@ -417,26 +433,4 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
void updateAddonUpgradeQuantity(AddOnUpgrade upgrade, int quantity) {
emit(state.updateSelectedUpgradeWithQuantity(upgrade, quantity));
}
-
- List<AddOnUpgrade> get selectedAddOnUpgrades {
- return upSales.addOnUpgrades
- .where((upgrade) => upgrade.quantity > 0 || upgrade.isSelected)
- .toList();
- }
-
- int extrasTotalQuantity(Upgrade upgrade) {
- return state.selectedUpSales
- .where((element) => element.id == upgrade.id)
- .length;
- }
-
- void increment(AddOnUpgrade upgrade) {
- emit(state.copyWith(selectedUpSales: [...state.selectedUpSales, upgrade]));
- }
-
- void decrement(AddOnUpgrade upgrade) {
- emit(state.copyWith(
- selectedUpSales:
- state.selectedUpSales.where((e) => e.id != upgrade.id).toList()));
- }
}
diff --git a/comwell_key_app/lib/pregistration/cubit/preregistration_state.dart b/comwell_key_app/lib/pregistration/cubit/preregistration_state.dart
index dde18d6c..6592fb1c 100644
--- a/comwell_key_app/lib/pregistration/cubit/preregistration_state.dart
+++ b/comwell_key_app/lib/pregistration/cubit/preregistration_state.dart
@@ -1,4 +1,3 @@
-import 'package:comwell_key_app/up_sales/cubit/up_sales_state.dart';
import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
import 'package:comwell_key_app/up_sales/models/up_sales.dart';
@@ -11,16 +10,14 @@ import '../../profile_settings/model/user.dart';
class PreregistrationState extends Equatable {
final bool isLoading;
final bool selected;
- final List<AddOnUpgrade> availableAddOnUpgrades;
+ final List<AddOnUpgrade> addOnUpgrades;
final List<RoomUpgrade> availableRoomUpgrades;
- final List<Upgrade> selectedUpSales;
final String selectedRoomUpgrade;
final bool forceUpdate;
final User? user;
final CountryCode? countryCode;
final String? phoneNumber;
final bool missingInformation;
- final int numOfExtras;
final int extrasTotalPrice;
final bool termsAndConditionsAccepted;
final bool isPhoneNumberValid;
@@ -33,12 +30,10 @@ class PreregistrationState extends Equatable {
const PreregistrationState({
required this.isLoading,
required this.selected,
- required this.availableAddOnUpgrades,
+ required this.addOnUpgrades,
required this.availableRoomUpgrades,
- required this.selectedUpSales,
required this.selectedRoomUpgrade,
this.missingInformation = false,
- this.numOfExtras = 0,
this.extrasTotalPrice = 0,
this.termsAndConditionsAccepted = false,
this.forceUpdate = false,
@@ -56,12 +51,10 @@ class PreregistrationState extends Equatable {
PreregistrationState.initial()
: isLoading = false,
selected = false,
- availableAddOnUpgrades = [],
+ addOnUpgrades = [],
availableRoomUpgrades = [],
- selectedUpSales = [],
selectedRoomUpgrade = '',
missingInformation = false,
- numOfExtras = 0,
extrasTotalPrice = 0,
termsAndConditionsAccepted = false,
forceUpdate = false,
@@ -79,66 +72,47 @@ class PreregistrationState extends Equatable {
copyWith(
isLoading: false,
availableRoomUpgrades: upSales.roomUpgrades,
- availableAddOnUpgrades: upSales.addOnUpgrades,
+ addOnUpgrades: upSales.addOnUpgrades,
user: user);
PreregistrationState updateUser({required User user}) => copyWith(user: user);
- PreregistrationState updateSelectedUpSales(
- {required List<Upgrade> selectedUpSales,
- required int numOfExtras,
- required int extrasTotalPrice}) =>
- copyWith(
- selectedUpSales: selectedUpSales,
- numOfExtras: numOfExtras,
- extrasTotalPrice: extrasTotalPrice);
+ PreregistrationState toggleSelectedAddonUpsale(
+ {required AddOnUpgrade upgrade}) {
+ final upgradeIsSelected = upgrade.isSelected;
+ final updatedUpgrade =
+ upgrade.copyWith(isSelected: !upgradeIsSelected, quantity: 1);
+ return updateUpgrade(updatedUpgrade);
+ }
+
+ PreregistrationState updateUpgrade(AddOnUpgrade upgrade) {
+ final updatedAddOnUpgrades = addOnUpgrades.toList();
+ final index = updatedAddOnUpgrades.indexWhere((e) => e.id == upgrade.id);
+ updatedAddOnUpgrades[index] = upgrade;
+ return copyWith(addOnUpgrades: updatedAddOnUpgrades);
+ }
- PreregistrationState addSelectedUpsales({required Upgrade upgrade}) {
- if (upgrade is AddOnUpgrade) {
- final newUpsale = upgrade.copyWith(quantity: 1);
- return copyWith(
- selectedUpSales: [...selectedUpSales, newUpsale],
- selectedRoomUpgrade: selectedRoomUpgrade);
+ PreregistrationState toggleRoomUpgrade({required RoomUpgrade roomUpgrade}) {
+ if (selectedRoomUpgrade == roomUpgrade.id) {
+ return copyWith(selectedRoomUpgrade: '');
} else {
- return copyWith(
- selectedUpSales: [...selectedUpSales, upgrade],
- selectedRoomUpgrade: selectedRoomUpgrade);
+ return copyWith(selectedRoomUpgrade: roomUpgrade.id);
}
}
- PreregistrationState addQuantity(AddOnUpgrade upgrade) {
- return copyWith(
- availableAddOnUpgrades: availableAddOnUpgrades
- .map((e) =>
- e.id == upgrade.id ? e.copyWith(quantity: e.quantity + 1) : e)
- .toList(),
- selectedRoomUpgrade: selectedRoomUpgrade);
+ PreregistrationState updateSelectedUpgradeWithQuantity(
+ AddOnUpgrade upgrade,
+ int quantity,
+ ) {
+ return updateUpgrade(upgrade.copyWith(quantity: quantity));
}
- PreregistrationState updateRoomUpgrade({required RoomUpgrade roomUpgrade}) =>
- copyWith(selectedRoomUpgrade: roomUpgrade.id);
-
- PreregistrationState removeRoomUpgrade() => copyWith(selectedRoomUpgrade: '');
- PreregistrationState removeSelectedUpSales({required Upgrade upgrade}) =>
- copyWith(
- selectedUpSales:
- selectedUpSales.where((item) => item.id != upgrade.id).toList(),
- selectedRoomUpgrade: selectedRoomUpgrade);
-
-
- PreregistrationState updateSelectedUpgradeWithQuantity(AddOnUpgrade upgrade, int quantity) {
- final index = selectedUpSales.indexWhere((e) => e.id == upgrade.id);
-
- selectedUpSales[index] = upgrade.copyWith(quantity: quantity);
-
- return copyWith(selectedUpSales: selectedUpSales);
- }
PreregistrationState copyWith({
bool? isLoading,
bool? selected,
- List<AddOnUpgrade>? availableAddOnUpgrades,
+ List<AddOnUpgrade>? addOnUpgrades,
List<RoomUpgrade>? availableRoomUpgrades,
List<Upgrade>? selectedUpSales,
String? selectedRoomUpgrade,
@@ -160,14 +134,11 @@ class PreregistrationState extends Equatable {
return PreregistrationState(
isLoading: isLoading ?? this.isLoading,
selected: selected ?? this.selected,
- availableAddOnUpgrades:
- availableAddOnUpgrades ?? this.availableAddOnUpgrades,
+ addOnUpgrades: addOnUpgrades ?? this.addOnUpgrades,
availableRoomUpgrades:
availableRoomUpgrades ?? this.availableRoomUpgrades,
- selectedUpSales: selectedUpSales ?? this.selectedUpSales,
selectedRoomUpgrade: selectedRoomUpgrade ?? this.selectedRoomUpgrade,
missingInformation: missingInformation ?? this.missingInformation,
- numOfExtras: numOfExtras ?? this.numOfExtras,
extrasTotalPrice: extrasTotalPrice ?? this.extrasTotalPrice,
termsAndConditionsAccepted:
termsAndConditionsAccepted ?? this.termsAndConditionsAccepted,
@@ -180,15 +151,13 @@ class PreregistrationState extends Equatable {
List<Object?> get props => [
isLoading,
selected,
- availableAddOnUpgrades,
+ addOnUpgrades,
availableRoomUpgrades,
- selectedUpSales,
selectedRoomUpgrade,
user,
phoneNumber,
countryCode,
missingInformation,
- numOfExtras,
extrasTotalPrice,
termsAndConditionsAccepted,
forceUpdate,
@@ -198,7 +167,6 @@ class PreregistrationState extends Equatable {
isAddressValid,
isPostalCodeValid,
isCityValid,
- selectedUpSales,
availableRoomUpgrades,
selectedRoomUpgrade,
];
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 c7ac6ce1..5ada5642 100644
--- a/comwell_key_app/lib/pregistration/pages/prereg_confirmation_page.dart
+++ b/comwell_key_app/lib/pregistration/pages/prereg_confirmation_page.dart
@@ -14,14 +14,18 @@ class PreregConfirmationPage extends StatelessWidget {
final state = cubit.state;
final user = state.user!;
final theme = Theme.of(context);
-
+ final singularExtra = cubit.numOfExtras == 1 &&
+ cubit.state.selectedRoomUpgrade.isEmpty ||
+ cubit.numOfExtras == 0 &&
+ cubit.state.selectedRoomUpgrade.isNotEmpty;
String extrasTitleText;
- if (state.numOfExtras == 1) {
+
+ if (singularExtra) {
extrasTitleText =
"preregistration_confirmation_extras_card_title_singular".tr();
} else {
extrasTitleText = "preregistration_confirmation_extras_card_title_plural"
- .tr(args: [state.numOfExtras.toString()]);
+ .tr(args: [cubit.numOfExtras.toString()]);
}
return SafeArea(
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 eea6d984..73acf024 100644
--- a/comwell_key_app/lib/pregistration/pages/prereg_profile_page.dart
+++ b/comwell_key_app/lib/pregistration/pages/prereg_profile_page.dart
@@ -38,15 +38,15 @@ class PreregProfilePage extends StatelessWidget {
final cubit = context.read<PreregistrationCubit>();
final firstNameErrorMessage =
- cubit.isFirstNameValid && state.missingInformation
+ !cubit.isFirstNameValid && state.missingInformation
? "generic_information_required".tr()
: null;
final lastNameErrorMessage =
- cubit.isLastNameValid && state.missingInformation
+ !cubit.isLastNameValid && state.missingInformation
? "generic_information_required".tr()
: null;
final phoneNumberErrorMessage =
- cubit.isPhoneNumberValid && state.missingInformation
+ !cubit.isPhoneNumberValid && state.missingInformation
? "generic_information_required".tr()
: null;
diff --git a/comwell_key_app/lib/pregistration/pages/prereg_up_sales_catalog_page.dart b/comwell_key_app/lib/pregistration/pages/prereg_up_sales_catalog_page.dart
index 286dd3b0..2090fda4 100644
--- a/comwell_key_app/lib/pregistration/pages/prereg_up_sales_catalog_page.dart
+++ b/comwell_key_app/lib/pregistration/pages/prereg_up_sales_catalog_page.dart
@@ -16,15 +16,15 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
return BlocBuilder<PreregistrationCubit, PreregistrationState>(
builder: (context, state) {
final cubit = context.read<PreregistrationCubit>();
- final serviceUpgrades = cubit.state.availableAddOnUpgrades
+ final serviceUpgrades = cubit.state.addOnUpgrades
.where((upgrade) => upgrade.isService)
.toList();
- final addonUpgrade = cubit.state.availableAddOnUpgrades
+ final addonUpgrades = cubit.upSales.addOnUpgrades
.where((upgrade) => !upgrade.isService)
.toList();
final selectedRoomUpgrade = cubit.state.selectedRoomUpgrade.isEmpty
? null
- : cubit.state.availableRoomUpgrades
+ : cubit.upSales.roomUpgrades
.firstWhere((e) => e.id == cubit.state.selectedRoomUpgrade);
if (state.isLoading) {
@@ -59,20 +59,10 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
booking: cubit.booking,
upSales: serviceUpgrades,
onServiceSelected: (upgrade, isSelected) {
- if (isSelected) {
- cubit.removeUpgrade(upgrade);
- } else {
- cubit.addSelected(upgrade);
- }
+ cubit.toggleSelectedUpgrade(upgrade);
},
onTap: (upgrade) {
- final isSelected = cubit.state.selectedUpSales
- .any((e) => e.id == upgrade.id);
- if (isSelected) {
- cubit.removeUpgrade(upgrade);
- } else {
- cubit.addSelected(upgrade);
- }
+ cubit.toggleSelectedUpgrade(upgrade);
},
),
],
@@ -89,24 +79,14 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
availableRoomUpgrades: cubit.state.availableRoomUpgrades,
selectedRoomUpgrade: cubit.state.selectedRoomUpgrade,
onRoomUpgradeSelected: (upgrade, isSelected) {
- if (isSelected) {
- cubit.removeUpgrade(upgrade);
- } else {
- cubit.addSelected(upgrade);
- }
+ cubit.toggleSelectedUpgrade(upgrade);
},
onTap: (upgrade) {
- final isSelected =
- cubit.state.selectedRoomUpgrade == upgrade.id;
- if (isSelected) {
- cubit.removeUpgrade(upgrade);
- } else {
- cubit.addSelected(upgrade);
- }
+ cubit.toggleSelectedUpgrade(upgrade);
},
),
],
- if (addonUpgrade.isNotEmpty) ...[
+ if (addonUpgrades.isNotEmpty) ...[
const SizedBox(height: 24),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
@@ -115,7 +95,7 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
),
const SizedBox(height: 8),
AddOnUpgradeCatalog(
- addOnUpgrades: addonUpgrade,
+ addOnUpgrades: cubit.otherUpgrades,
extrasTotalPrice: cubit.extrasTotalPrice,
selectedRoomUpgrade: selectedRoomUpgrade?.id ?? '',
onAddOnUpgradeSelected: (upgrade, quantity) {
diff --git a/comwell_key_app/lib/pregistration/preregistration_flow.dart b/comwell_key_app/lib/pregistration/preregistration_flow.dart
index e6953263..e9cc0797 100644
--- a/comwell_key_app/lib/pregistration/preregistration_flow.dart
+++ b/comwell_key_app/lib/pregistration/preregistration_flow.dart
@@ -1,9 +1,8 @@
import 'package:comwell_key_app/common/components/comwell_app_bar.dart';
-import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/pregistration/cubit/preregistration_state.dart';
import 'package:comwell_key_app/pregistration/cubit/preregistration_cubit.dart';
import 'package:comwell_key_app/pregistration/utils/utils.dart';
-import 'package:easy_localization/easy_localization.dart';
+import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../common/components/shimmer_loader/prereg_flow_shimmer_loader.dart';
@@ -19,12 +18,16 @@ class _PreregistrationFlowState extends State<PreregistrationFlow> {
@override
Widget build(BuildContext context) {
return BlocBuilder<PreregistrationCubit, PreregistrationState>(
- builder: (context, state) {
- final cubit = context.read<PreregistrationCubit>();
- return Scaffold(
- backgroundColor: Theme.of(context).colorScheme.surface,
- appBar: const ComwellAppBar(),
- body: Builder(
+ builder: (context, state) {
+ final cubit = context.read<PreregistrationCubit>();
+ return Scaffold(
+ backgroundColor: Theme.of(context).colorScheme.surface,
+ appBar: const ComwellAppBar(),
+ body: GestureDetector(
+ onTap: () {
+ FocusManager.instance.primaryFocus?.unfocus();
+ },
+ child: Builder(
builder: (context) {
if (state.isLoading) {
return const Center(child: PreregFlowShimmerLoader());
@@ -38,46 +41,38 @@ class _PreregistrationFlowState extends State<PreregistrationFlow> {
);
},
),
- bottomNavigationBar: Builder(builder: (context) {
- if (state.isLoading) return const SizedBox();
- return Column(
- // BOTTOM NAVIGATION
- mainAxisSize: MainAxisSize.min,
- children: [
- const Divider(
- color: Colors.black12,
- height: 0,
- ),
- Row(
- children: [
- Expanded(
- child: Padding(
- padding:
- const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 40.0),
- child: ElevatedButton(
- onPressed: () => cubit.onContinueClicked(context),
- style: ButtonStyle(
- backgroundColor:
- WidgetStateProperty.resolveWith((states) {
- // if (states.contains(WidgetState.disabled)) {
- // return Colors.grey;
- // }
- return const Color(0xffAA8D65);
- }),
- foregroundColor:
- const WidgetStatePropertyAll(Colors.white)),
- child: Padding(
- padding:
- const EdgeInsets.symmetric(vertical: 16.0),
- child: Text(cubit.buttonText),
- ),
+ ),
+ bottomNavigationBar: Builder(builder: (context) {
+ if (state.isLoading) return const SizedBox();
+ return Column(
+ // BOTTOM NAVIGATION
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ const Divider(
+ color: Colors.black12,
+ height: 0,
+ ),
+ Row(
+ children: [
+ Expanded(
+ child: Padding(
+ padding:
+ const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 40.0),
+ child: ElevatedButton(
+ onPressed: () => cubit.onContinueClicked(context),
+ style: ElevatedButton.styleFrom(
+ foregroundColor: colorBackground),
+ child: Padding(
+ padding: const EdgeInsets.symmetric(vertical: 16.0),
+ child: Text(cubit.buttonText),
),
),
),
- ],
- ),
- ],
- );
+ ),
+ ],
+ ),
+ ],
+ );
}),
);
},
diff --git a/comwell_key_app/lib/pregistration/utils/utils.dart b/comwell_key_app/lib/pregistration/utils/utils.dart
index 7120904a..5f5d3089 100644
--- a/comwell_key_app/lib/pregistration/utils/utils.dart
+++ b/comwell_key_app/lib/pregistration/utils/utils.dart
@@ -1,16 +1,12 @@
-import 'package:comwell_key_app/payment_cards/bloc/payment_cards_cubit.dart';
-import 'package:comwell_key_app/payment_cards/payment_cards_page.dart';
import 'package:comwell_key_app/pregistration/pages/prereg_address_page.dart';
import 'package:comwell_key_app/pregistration/pages/prereg_confirmation_page.dart';
import 'package:comwell_key_app/pregistration/pages/prereg_profile_page.dart';
import 'package:comwell_key_app/pregistration/pages/prereg_up_sales_catalog_page.dart';
import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
enum PreregistrationPage {
profile,
address,
- payment,
upSales,
confirmation;
@@ -25,10 +21,10 @@ enum PreregistrationPage {
return PreregProfilePage(key: key);
case PreregistrationPage.address:
return PreregAddressPage(key: key);
- case PreregistrationPage.payment:
- return BlocProvider(
- create: (context) => PaymentCardsCubit(),
- child: const PaymentCardsPage());
+ // case PreregistrationPage.payment:
+ // return BlocProvider(
+ // create: (context) => PaymentCardsCubit(),
+ // child: const PaymentCardsPage());
case PreregistrationPage.upSales:
return const PreregUpSalesCatalogPage();
case PreregistrationPage.confirmation:
diff --git a/comwell_key_app/lib/routing/app_router.dart b/comwell_key_app/lib/routing/app_router.dart
index 83ed359d..be43a001 100644
--- a/comwell_key_app/lib/routing/app_router.dart
+++ b/comwell_key_app/lib/routing/app_router.dart
@@ -56,16 +56,14 @@ import 'package:comwell_key_app/up_sales/cubit/up_sales_cubit.dart';
import 'package:comwell_key_app/up_sales/cubit/up_sales_state.dart';
import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
-import 'package:comwell_key_app/up_sales/models/room_upgrade_extra.dart';
-import 'package:comwell_key_app/up_sales/models/room_upgrade_extra.dart';
import 'package:comwell_key_app/up_sales/models/room_upgrade_list.dart';
import 'package:comwell_key_app/up_sales/models/up_sales.dart';
-import 'package:comwell_key_app/up_sales/models/upgrade.dart';
import 'package:comwell_key_app/up_sales/pages/addon_upgrade_page.dart';
+import 'package:comwell_key_app/up_sales/pages/processing/up_sales_error_page.dart';
import 'package:comwell_key_app/up_sales/pages/room_upgrade_page.dart';
import 'package:comwell_key_app/up_sales/pages/services_upgrade_page.dart';
import 'package:comwell_key_app/up_sales/pages/up_sale_confirmation_page.dart';
-import 'package:comwell_key_app/up_sales/pages/up_sales_processing_page.dart';
+import 'package:comwell_key_app/up_sales/pages/processing/up_sales_processing_page.dart';
import 'package:comwell_key_app/up_sales/up_sales_repository.dart';
import 'package:comwell_key_app/up_sales/up_sales_catalog.dart';
import 'package:comwell_key_app/utils/stream_to_listenable.dart';
@@ -73,7 +71,6 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
-import 'package:easy_localization/easy_localization.dart';
import '../hotel_information/repository/hotel_information_repository.dart';
import '../utils/locator.dart';
@@ -197,9 +194,7 @@ GoRouter goRouter() {
create: (context) => OverviewCubit(locator<OverviewRepository>())
..findBookingById(bookingId),
child: BlocListener<OverviewCubit, OverviewState>(
- listener: (context, state) {
- // TODO: Implement listener
- },
+ listener: (context, state) {},
child: const LoadingPage(),
),
);
@@ -483,19 +478,20 @@ GoRouter goRouter() {
path: "/${AppRoutes.upSalesProcessing.name}",
name: AppRoutes.upSalesProcessing.name,
builder: (context, state) {
- final extras = state.extra as List<dynamic>;
- final selectedUpSales = extras[0] as List<AddOnUpgrade?>;
- final selectedRoomUpgrade = extras[1] as RoomUpgrade?;
final cubit = context.read<UpSalesCubit>();
- cubit.addUpSalesToBooking(
- selectedUpSales.whereType<AddOnUpgrade>().toList(),
- selectedRoomUpgrade);
+ cubit.addUpSalesToBooking();
+
return BlocBuilder<UpSalesCubit, UpSalesState>(
builder: (context, state) {
return UpSalesProcessingPage(key: ValueKey(state));
});
},
),
+ GoRoute(
+ path: "/${AppRoutes.upSalesError.name}",
+ name: AppRoutes.upSalesError.name,
+ builder: (context, state) => const UpSalesErrorPage(),
+ ),
]),
GoRoute(
path: "/${AppRoutes.chooseShareRoom.name}",
diff --git a/comwell_key_app/lib/routing/app_routes.dart b/comwell_key_app/lib/routing/app_routes.dart
index c354f0f5..bd6c8b5b 100644
--- a/comwell_key_app/lib/routing/app_routes.dart
+++ b/comwell_key_app/lib/routing/app_routes.dart
@@ -36,4 +36,5 @@ enum AppRoutes {
roomInfo,
shareRoom,
forceUpdate,
+ upSalesError,
}
diff --git a/comwell_key_app/lib/services/api.dart b/comwell_key_app/lib/services/api.dart
index 6f57dc18..2107cdbf 100644
--- a/comwell_key_app/lib/services/api.dart
+++ b/comwell_key_app/lib/services/api.dart
@@ -9,10 +9,7 @@ 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/services/utils/api_endpoints.dart';
import 'package:comwell_key_app/up_sales/models/addon_list.dart';
-import 'package:comwell_key_app/up_sales/models/dto/room_upgrade_dto.dart';
import 'package:comwell_key_app/up_sales/models/dto/up_sales_dto.dart';
-import 'package:comwell_key_app/up_sales/models/up_sales.dart';
-import 'package:comwell_key_app/up_sales/models/upgrade.dart';
import 'package:comwell_key_app/utils/json.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:dio/dio.dart';
@@ -285,7 +282,6 @@ class Api {
"addOnList": selectedUpSales,
};
final data = jsonEncode(body);
- print("data=${data}");
await dio.post<void>(ApiEndpoints.addUpSalesToBooking, data: data);
return;
}
diff --git a/comwell_key_app/lib/services/mappers/addon_item_mapper.dart b/comwell_key_app/lib/services/mappers/addon_item_mapper.dart
index 8ff4c109..d9cf2379 100644
--- a/comwell_key_app/lib/services/mappers/addon_item_mapper.dart
+++ b/comwell_key_app/lib/services/mappers/addon_item_mapper.dart
@@ -14,11 +14,11 @@ extension AddOnItemDTOMapper on AddOnItemDTO {
name: description,
price: price.toInt(),
currency: currency,
- images: ['assets/images/room_upgrade_placeholder.png'],
+ images: const [],
description: description,
- tags: ['room'],
+ tags: const [],
quantity: quantity,
- facilityTypes: [],
+ facilityTypes: const [],
);
} else {
// This is an addon upgrade
@@ -27,10 +27,10 @@ extension AddOnItemDTOMapper on AddOnItemDTO {
name: description,
price: price.toInt(),
currency: currency,
- images: ['assets/images/addon_placeholder.png'],
+ images: const [],
description: description,
- tags: ['service'],
- isSelected: true, // Since it's already in the booking
+ tags: const [],
+ isSelected: false,
quantity: quantity,
isService: true,
);
@@ -40,4 +40,4 @@ extension AddOnItemDTOMapper on AddOnItemDTO {
extension ListAddOnItemDTOMapper on List<AddOnItemDTO> {
List<Upgrade> toUpgrades() => map((dto) => dto.toUpgrade()).toList();
-}
\ No newline at end of file
+}
diff --git a/comwell_key_app/lib/services/mappers/booking_mapper.dart b/comwell_key_app/lib/services/mappers/booking_mapper.dart
index b023e48e..7bfc1a09 100644
--- a/comwell_key_app/lib/services/mappers/booking_mapper.dart
+++ b/comwell_key_app/lib/services/mappers/booking_mapper.dart
@@ -57,7 +57,7 @@ extension BookingMapper on Booking {
children: children,
totalCharge: 200,
balance: 0,
- maskedCardNumber: "1234567890",
+ maskedCardNumber: maskedCardNumber,
addOnItems: addOnItems?.map((upgrade) => AddOnItemDTO(
code: upgrade.id,
description: upgrade.description,
diff --git a/comwell_key_app/lib/services/mappers/room_mapper.dart b/comwell_key_app/lib/services/mappers/room_mapper.dart
index 1209b045..5362417b 100644
--- a/comwell_key_app/lib/services/mappers/room_mapper.dart
+++ b/comwell_key_app/lib/services/mappers/room_mapper.dart
@@ -1,6 +1,5 @@
import 'package:comwell_key_app/overview/models/room.dart';
import 'package:comwell_key_app/services/models/room_dto.dart';
-import 'package:comwell_key_app/up_sales/mappers/addon_upgrade_mapper.dart';
extension RoomDTOMapper on RoomDto {
Room toRoom() {
diff --git a/comwell_key_app/lib/services/models/room_dto.dart b/comwell_key_app/lib/services/models/room_dto.dart
index f09ed2ed..b0c80c74 100644
--- a/comwell_key_app/lib/services/models/room_dto.dart
+++ b/comwell_key_app/lib/services/models/room_dto.dart
@@ -1,4 +1,3 @@
-import 'package:comwell_key_app/up_sales/models/dto/addon_upgrade_dto.dart';
import 'package:json_annotation/json_annotation.dart';
part '../../.generated/services/models/room_dto.g.dart';
diff --git a/comwell_key_app/lib/up_sales/components/addon_item_counter.dart b/comwell_key_app/lib/up_sales/components/addon_item_counter.dart
new file mode 100644
index 00000000..529dc629
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/components/addon_item_counter.dart
@@ -0,0 +1,74 @@
+import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
+import 'package:flutter/material.dart';
+
+class AddonItemCounter extends StatelessWidget {
+ final AddOnUpgrade addonUpgrade;
+ final int quantity;
+ final VoidCallback onIncrement;
+ final VoidCallback onDecrement;
+
+ const AddonItemCounter({
+ super.key,
+ required this.addonUpgrade,
+ required this.quantity,
+ required this.onIncrement,
+ required this.onDecrement,
+ });
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+
+ return Container(
+ color: Theme.of(context).colorScheme.surface,
+ child: Padding(
+ padding: const EdgeInsets.only(
+ left: 16.0,
+ right: 16.0,
+ top: 16.0,
+ bottom: 40,
+ ),
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Row(
+ children: [
+ InkWell(
+ onTap: onDecrement,
+ borderRadius: BorderRadius.circular(24),
+ child: Container(
+ width: 44,
+ height: 44,
+ decoration: BoxDecoration(
+ color: Theme.of(context).colorScheme.onSurface,
+ shape: BoxShape.circle,
+ ),
+ child: Icon(Icons.remove, color: Theme.of(context).colorScheme.surface),
+ ),
+ ),
+ const SizedBox(width: 16),
+ Text('$quantity', style: theme.textTheme.headlineMedium),
+ const SizedBox(width: 16),
+ // Plus button
+ InkWell(
+ onTap: onIncrement,
+ borderRadius: BorderRadius.circular(24),
+ child: Container(
+ width: 44,
+ height: 44,
+ decoration: BoxDecoration(
+ color: Theme.of(context).colorScheme.onSurface,
+ shape: BoxShape.circle,
+ ),
+ child: Icon(Icons.add, color: Theme.of(context).colorScheme.surface),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/comwell_key_app/lib/up_sales/components/catalog/addon_upgrade_catalog.dart b/comwell_key_app/lib/up_sales/components/catalog/addon_upgrade_catalog.dart
index ebede4ee..1235fbce 100644
--- a/comwell_key_app/lib/up_sales/components/catalog/addon_upgrade_catalog.dart
+++ b/comwell_key_app/lib/up_sales/components/catalog/addon_upgrade_catalog.dart
@@ -25,7 +25,7 @@ class AddOnUpgradeCatalog extends StatelessWidget {
scrollDirection: Axis.horizontal,
itemCount: addOnUpgrades.length,
itemBuilder: (context, index) {
- final isSelected = addOnUpgrades.elementAt(index).isSelected;
+ final isSelected = addOnUpgrades.elementAt(index).isAddedToCart;
return GestureDetector(
onTap: () async {
final quantity = await context.pushNamed(AppRoutes.addonUpgrade.name, extra: [
@@ -44,6 +44,7 @@ class AddOnUpgradeCatalog extends StatelessWidget {
isSelected: isSelected,
routeName: AppRoutes.addonUpgrade.name,
showCounter: true,
+ isAddon: true,
onTap: (upgrade) {},
),
);
diff --git a/comwell_key_app/lib/up_sales/components/catalog/service_catalog.dart b/comwell_key_app/lib/up_sales/components/catalog/service_catalog.dart
index 3d959659..b64dd555 100644
--- a/comwell_key_app/lib/up_sales/components/catalog/service_catalog.dart
+++ b/comwell_key_app/lib/up_sales/components/catalog/service_catalog.dart
@@ -1,9 +1,9 @@
+import 'package:comwell_key_app/booking_details/bloc/booking_details_bloc.dart';
import 'package:comwell_key_app/common/const.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/up_sales/components/up_sales_services_widget.dart';
import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
-import 'package:comwell_key_app/up_sales/models/upgrade.dart';
import 'package:comwell_key_app/up_sales/models/room_upgrade_list.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
@@ -16,6 +16,7 @@ class ServiceCatalog extends StatelessWidget {
final void Function(AddOnUpgrade, bool) onServiceSelected;
final Booking booking;
final bool isSinglePurchase;
+ final BookingDetailsBloc? bookingDetailsBloc;
const ServiceCatalog({
super.key,
@@ -26,6 +27,7 @@ class ServiceCatalog extends StatelessWidget {
required this.onServiceSelected,
required this.booking,
this.isSinglePurchase = false,
+ this.bookingDetailsBloc,
});
@override
@@ -47,6 +49,11 @@ class ServiceCatalog extends StatelessWidget {
addOnUpgrade: upSales.elementAt(index),
isRoomUpgradeSelected: isSelected,
isSinglePurchase: isSinglePurchase));
+
+ if (bookingDetailsBloc != null && isSinglePurchase) {
+ bookingDetailsBloc!.add(InitialEvent());
+ }
+
if (result is List && result.length == 2) {
final upgrade = result[0] as AddOnUpgrade;
final isSelected = result[1] as bool;
diff --git a/comwell_key_app/lib/up_sales/components/facility_icon_text.dart b/comwell_key_app/lib/up_sales/components/facility_icon_text.dart
index 993a96da..8eb4a62d 100644
--- a/comwell_key_app/lib/up_sales/components/facility_icon_text.dart
+++ b/comwell_key_app/lib/up_sales/components/facility_icon_text.dart
@@ -1,6 +1,5 @@
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/up_sales/models/facility_type.dart';
-import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
diff --git a/comwell_key_app/lib/up_sales/components/generic_item_counter.dart b/comwell_key_app/lib/up_sales/components/generic_item_counter.dart
deleted file mode 100644
index 82da17bc..00000000
--- a/comwell_key_app/lib/up_sales/components/generic_item_counter.dart
+++ /dev/null
@@ -1,74 +0,0 @@
-import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
-import 'package:flutter/material.dart';
-
-class GenericItemCounter extends StatelessWidget {
- final AddOnUpgrade addonUpgrade;
- final int quantity;
- final VoidCallback onIncrement;
- final VoidCallback onDecrement;
-
- const GenericItemCounter({
- super.key,
- required this.addonUpgrade,
- required this.quantity,
- required this.onIncrement,
- required this.onDecrement,
- });
-
- @override
- Widget build(BuildContext context) {
- final theme = Theme.of(context);
-
- return Container(
- color: Theme.of(context).colorScheme.surface,
- child: Padding(
- padding: const EdgeInsets.only(
- left: 16.0,
- right: 16.0,
- top: 16.0,
- bottom: 40,
- ),
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.center,
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Row(
- children: [
- InkWell(
- onTap: onDecrement,
- borderRadius: BorderRadius.circular(24),
- child: Container(
- width: 44,
- height: 44,
- decoration: BoxDecoration(
- color: Theme.of(context).colorScheme.onSurface,
- shape: BoxShape.circle,
- ),
- child: Icon(Icons.remove, color: Theme.of(context).colorScheme.surface),
- ),
- ),
- const SizedBox(width: 16),
- Text('$quantity', style: theme.textTheme.headlineMedium),
- const SizedBox(width: 16),
- // Plus button
- InkWell(
- onTap: onIncrement,
- borderRadius: BorderRadius.circular(24),
- child: Container(
- width: 44,
- height: 44,
- decoration: BoxDecoration(
- color: Theme.of(context).colorScheme.onSurface,
- shape: BoxShape.circle,
- ),
- child: Icon(Icons.add, color: Theme.of(context).colorScheme.surface),
- ),
- ),
- ],
- ),
- ],
- ),
- ),
- );
- }
-}
\ No newline at end of file
diff --git a/comwell_key_app/lib/up_sales/components/up_sales_upgrades_widget.dart b/comwell_key_app/lib/up_sales/components/up_sales_upgrades_widget.dart
index 7deb62f6..fd0dc8ee 100644
--- a/comwell_key_app/lib/up_sales/components/up_sales_upgrades_widget.dart
+++ b/comwell_key_app/lib/up_sales/components/up_sales_upgrades_widget.dart
@@ -13,6 +13,7 @@ class UpSalesUpgradesWidget extends StatelessWidget {
final bool isSelected;
final String routeName;
final bool showCounter;
+ final bool isAddon;
final void Function(Upgrade) onTap;
const UpSalesUpgradesWidget({
super.key,
@@ -23,6 +24,7 @@ class UpSalesUpgradesWidget extends StatelessWidget {
required this.routeName,
this.showCounter = false,
required this.onTap,
+ this.isAddon = false,
});
@override
@@ -52,14 +54,24 @@ class UpSalesUpgradesWidget extends StatelessWidget {
topLeft: Radius.circular(10),
topRight: Radius.circular(10),
),
- child: Image.asset(
- kPlaceholderImage,
- height: 180,
- width: double.infinity,
- fit: BoxFit.cover,
- ),
+ child: upgrade.images.isNotEmpty
+ ? Image.network(
+ upgrade.images.first,
+ height: 180,
+ width: double.infinity,
+ fit: BoxFit.cover,
+ errorBuilder: (context, error, stackTrace) {
+ return Image.asset(kPlaceholderImage);
+ },
+ )
+ : Image.asset(
+ kPlaceholderImage,
+ height: 180,
+ width: double.infinity,
+ fit: BoxFit.cover,
+ ),
),
- if (upgrade.tags.firstOrNull != null)
+ if (upgrade.tags.firstOrNull != null && !isAddon)
Positioned(
top: 16,
right: 16,
@@ -112,8 +124,7 @@ class UpSalesUpgradesWidget extends StatelessWidget {
showCounter
? UpgradesCounter(quantity: upgrade.quantity)
: ComwellRadioButton(
- selected:
- isSelected,
+ selected: isSelected,
onTap: () {
onTap.call(upgrade);
},
diff --git a/comwell_key_app/lib/up_sales/cubit/up_sales_cubit.dart b/comwell_key_app/lib/up_sales/cubit/up_sales_cubit.dart
index 477cb7a7..4f431eab 100644
--- a/comwell_key_app/lib/up_sales/cubit/up_sales_cubit.dart
+++ b/comwell_key_app/lib/up_sales/cubit/up_sales_cubit.dart
@@ -47,7 +47,7 @@ class UpSalesCubit extends Cubit<UpSalesState> {
void toggleSelectedUpgrade(Upgrade upgrade) {
if (upgrade is RoomUpgrade) {
- emit(state.updateRoomUpgrade(roomUpgrade: upgrade));
+ emit(state.toggleRoomUpgrade(roomUpgrade: upgrade));
} else if (upgrade is AddOnUpgrade) {
emit(state.toggleSelectedAddonUpsale(upgrade: upgrade));
}
@@ -56,6 +56,7 @@ class UpSalesCubit extends Cubit<UpSalesState> {
int get extrasTotalPrice {
//This is the total price of the selected up sales and the price of the selected
//room upgrade if it is selected
+
return selectedAddOnUpgrades.fold(
0, (sum, upgrade) => sum + upgrade.price * upgrade.quantity) +
(state.selectedRoomUpgrade.isNotEmpty
@@ -65,15 +66,9 @@ class UpSalesCubit extends Cubit<UpSalesState> {
: 0);
}
- int extrasTotalQuantity(Upgrade upgrade) {
- return selectedAddOnUpgrades
- .where((element) => element.id == upgrade.id)
- .length;
- }
-
List<AddOnUpgrade> get selectedAddOnUpgrades {
final selectedUpgrades = state.addOnUpgrades
- .where((upgrade) => upgrade.quantity > 0 || upgrade.isSelected)
+ .where((upgrade) => upgrade.isAddedToCart)
.toList();
return selectedUpgrades;
}
@@ -90,16 +85,14 @@ class UpSalesCubit extends Cubit<UpSalesState> {
}
Future<void> addUpSalesToBooking(
- List<Upgrade> selectedUpSales,
- RoomUpgrade? selectedRoomUpgrade,
) async {
emit(state.processingStateUpdated(UpSalesProcessingStateProcessing()));
try {
// Extract RoomUpgrade from selectedUpSales to get the roomType
- final roomType = selectedRoomUpgrade?.id ?? '';
+ final roomType = state.selectedRoomUpgrade;
// Convert selected up sales to AddOnList objects using their individual quantities
- final List<AddOnList> addonList = selectedUpSales
+ final List<AddOnList> addonList = state.addOnUpgrades
.map((upgrade) =>
AddOnList(itemCode: upgrade.id, quantity: upgrade.quantity))
.toList();
@@ -109,7 +102,6 @@ class UpSalesCubit extends Cubit<UpSalesState> {
await Future<void>.delayed(const Duration(seconds: 2));
emit(state.processingStateUpdated(UpSalesProcessingStateSuccess()));
} catch (e) {
- print("here");
emit(state.processingStateUpdated(UpSalesProcessingStateError()));
}
}
diff --git a/comwell_key_app/lib/up_sales/cubit/up_sales_state.dart b/comwell_key_app/lib/up_sales/cubit/up_sales_state.dart
index 0995ad6a..88aff282 100644
--- a/comwell_key_app/lib/up_sales/cubit/up_sales_state.dart
+++ b/comwell_key_app/lib/up_sales/cubit/up_sales_state.dart
@@ -56,17 +56,16 @@ class UpSalesState extends Equatable {
UpSalesState toggleSelectedAddonUpsale({required AddOnUpgrade upgrade}) {
final upgradeIsSelected = upgrade.isSelected;
- final updatedUpgrade = upgrade.copyWith(isSelected: !upgradeIsSelected);
+ final updatedUpgrade = upgrade.copyWith(isSelected: !upgradeIsSelected, quantity: 1);
return updateUpgrade(updatedUpgrade);
}
- UpSalesState updateRoomUpgrade({required RoomUpgrade roomUpgrade}) =>
- copyWith(selectedRoomUpgrade: roomUpgrade.id);
-
- UpSalesState removeRoomUpgrade() => copyWith(selectedRoomUpgrade: '');
-
- UpSalesState removeSelectedUpSales({required AddOnUpgrade upgrade}) {
- return updateUpgrade(upgrade.copyWith(quantity: 0, isSelected: false));
+ UpSalesState toggleRoomUpgrade({required RoomUpgrade roomUpgrade}) {
+ if (selectedRoomUpgrade == roomUpgrade.id) {
+ return copyWith(selectedRoomUpgrade: '');
+ } else {
+ return copyWith(selectedRoomUpgrade: roomUpgrade.id);
+ }
}
UpSalesState updateSelectedUpgradeWithQuantity(
diff --git a/comwell_key_app/lib/up_sales/mappers/addon_upgrade_mapper.dart b/comwell_key_app/lib/up_sales/mappers/addon_upgrade_mapper.dart
index 71990201..28698856 100644
--- a/comwell_key_app/lib/up_sales/mappers/addon_upgrade_mapper.dart
+++ b/comwell_key_app/lib/up_sales/mappers/addon_upgrade_mapper.dart
@@ -8,11 +8,11 @@ extension AddOnUpgradeDTOMapper on AddOnUpgradeDTO {
name: name,
price: price,
currency: currency,
- isSelected: isSelected,
+ isSelected: false,
images: images,
description: description,
tags: tags,
- quantity: quantity ?? 0,
+ quantity: 0,
isService: isService);
}
}
diff --git a/comwell_key_app/lib/up_sales/mappers/up_sales_mapper.dart b/comwell_key_app/lib/up_sales/mappers/up_sales_mapper.dart
index 5d781053..e9d348ab 100644
--- a/comwell_key_app/lib/up_sales/mappers/up_sales_mapper.dart
+++ b/comwell_key_app/lib/up_sales/mappers/up_sales_mapper.dart
@@ -5,10 +5,14 @@ import 'package:comwell_key_app/up_sales/models/up_sales.dart';
extension UpSalesDTOMapper on UpSalesDTO {
UpSales toUpSales() {
- return UpSales(property: property, confirmationNumber: confirmationNumber, roomUpgrades: roomUpgrades.toRoomUpgrades(), addOnUpgrades: addOnUpgrades.toAddOnUpgrades());
+ return UpSales(
+ property: property,
+ confirmationNumber: confirmationNumber,
+ roomUpgrades: roomUpgrades.toRoomUpgrades(),
+ addOnUpgrades: addOnUpgrades.toAddOnUpgrades());
}
}
extension ListUpSalesMapper on List<UpSalesDTO> {
List<UpSales> toUpSales() => map((dto) => dto.toUpSales()).toList();
-}
\ No newline at end of file
+}
diff --git a/comwell_key_app/lib/up_sales/models/addon_upgrade.dart b/comwell_key_app/lib/up_sales/models/addon_upgrade.dart
index 7939a91c..69a1cfa6 100644
--- a/comwell_key_app/lib/up_sales/models/addon_upgrade.dart
+++ b/comwell_key_app/lib/up_sales/models/addon_upgrade.dart
@@ -42,6 +42,8 @@ class AddOnUpgrade extends Upgrade {
isService: isService ?? this.isService,
);
}
+
+ bool get isAddedToCart => quantity > 0 || isSelected;
}
diff --git a/comwell_key_app/lib/up_sales/models/dto/addon_upgrade_dto.dart b/comwell_key_app/lib/up_sales/models/dto/addon_upgrade_dto.dart
index e4f7f648..18f1a38a 100644
--- a/comwell_key_app/lib/up_sales/models/dto/addon_upgrade_dto.dart
+++ b/comwell_key_app/lib/up_sales/models/dto/addon_upgrade_dto.dart
@@ -13,7 +13,7 @@ class AddOnUpgradeDTO {
final Iterable<String> images;
final String description;
final Iterable<String> tags;
- final int? quantity;
+ final int quantity;
final bool isService;
AddOnUpgradeDTO(
@@ -25,11 +25,12 @@ class AddOnUpgradeDTO {
required this.images,
required this.description,
required this.tags,
- this.quantity,
+ this.quantity = 0,
this.isService = false});
Json toJson() => _$AddOnUpgradeDTOToJson(this);
factory AddOnUpgradeDTO.fromJson(Map<String, dynamic> json) =>
_$AddOnUpgradeDTOFromJson(json);
+
}
diff --git a/comwell_key_app/lib/up_sales/models/dto/room_upgrade_dto.dart b/comwell_key_app/lib/up_sales/models/dto/room_upgrade_dto.dart
index 643ba20c..c55c080f 100644
--- a/comwell_key_app/lib/up_sales/models/dto/room_upgrade_dto.dart
+++ b/comwell_key_app/lib/up_sales/models/dto/room_upgrade_dto.dart
@@ -1,5 +1,4 @@
import 'package:comwell_key_app/up_sales/models/facility_type.dart';
-import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
import 'package:comwell_key_app/utils/json.dart';
import 'package:json_annotation/json_annotation.dart';
diff --git a/comwell_key_app/lib/up_sales/models/facility_type.dart b/comwell_key_app/lib/up_sales/models/facility_type.dart
new file mode 100644
index 00000000..4d9d119d
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/models/facility_type.dart
@@ -0,0 +1,22 @@
+import 'package:equatable/equatable.dart';
+import 'package:json_annotation/json_annotation.dart';
+
+part '../../.generated/up_sales/models/facility_type.g.dart';
+
+
+@JsonSerializable()
+class FacilityType extends Equatable {
+
+ final String name;
+ final String icon;
+ final String groupName;
+
+ const FacilityType({required this.name, required this.icon, required this.groupName});
+
+ @override
+ List<Object?> get props => [name, icon, groupName];
+
+ factory FacilityType.fromJson(Map<String, dynamic> json) => _$FacilityTypeFromJson(json);
+
+ Map<String, dynamic> toJson() => _$FacilityTypeToJson(this);
+}
\ No newline at end of file
diff --git a/comwell_key_app/lib/up_sales/models/room_upgrade.dart b/comwell_key_app/lib/up_sales/models/room_upgrade.dart
index 80b63796..7051187e 100644
--- a/comwell_key_app/lib/up_sales/models/room_upgrade.dart
+++ b/comwell_key_app/lib/up_sales/models/room_upgrade.dart
@@ -1,10 +1,9 @@
-import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
import 'package:comwell_key_app/up_sales/models/facility_type.dart';
import 'package:comwell_key_app/up_sales/models/upgrade.dart';
class RoomUpgrade extends Upgrade {
final List<FacilityType> facilityTypes;
- RoomUpgrade({
+ const RoomUpgrade({
required super.id,
required super.name,
required super.price,
diff --git a/comwell_key_app/lib/up_sales/pages/addon_upgrade_page.dart b/comwell_key_app/lib/up_sales/pages/addon_upgrade_page.dart
index 86f357e8..c776a31b 100644
--- a/comwell_key_app/lib/up_sales/pages/addon_upgrade_page.dart
+++ b/comwell_key_app/lib/up_sales/pages/addon_upgrade_page.dart
@@ -1,6 +1,6 @@
import 'package:comwell_key_app/common/components/comwell_app_bar.dart';
import 'package:comwell_key_app/common/const.dart';
-import 'package:comwell_key_app/up_sales/components/generic_item_counter.dart';
+import 'package:comwell_key_app/up_sales/components/addon_item_counter.dart';
import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
@@ -13,21 +13,20 @@ class AddonUpgradePage extends StatefulWidget {
final int extrasTotalPrice;
final String selectedRoomUpgrade;
-
-
- const AddonUpgradePage(
- {super.key,
- required this.addonUpgrade,
- required this.extrasTotalPrice,
- required this.selectedRoomUpgrade,
- });
+ const AddonUpgradePage({
+ super.key,
+ required this.addonUpgrade,
+ required this.extrasTotalPrice,
+ required this.selectedRoomUpgrade,
+ });
@override
State<AddonUpgradePage> createState() => _AddonUpgradePageState();
}
class _AddonUpgradePageState extends State<AddonUpgradePage> {
- late int quantity = widget.addonUpgrade.quantity;
+ late int quantity =
+ widget.addonUpgrade.quantity > 0 ? widget.addonUpgrade.quantity : 1;
void increment() {
setState(() {
@@ -37,10 +36,12 @@ class _AddonUpgradePageState extends State<AddonUpgradePage> {
void decrement() {
setState(() {
- quantity--;
+ if (quantity > 0) {
+ quantity--;
+ }
});
}
-
+
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
@@ -61,13 +62,22 @@ class _AddonUpgradePageState extends State<AddonUpgradePage> {
topLeft: Radius.circular(10),
topRight: Radius.circular(10),
),
- child: Image.asset(
- //extra.upgrade.images!.first ,
- kPlaceholderImage,
- height: height * 0.5,
- width: double.infinity,
- fit: BoxFit.cover,
- ),
+ child: widget.addonUpgrade.images.isNotEmpty
+ ? Image.network(
+ widget.addonUpgrade.images.first,
+ height: height * 0.5,
+ width: double.infinity,
+ fit: BoxFit.cover,
+ errorBuilder: (context, error, stackTrace) {
+ return Image.asset(kPlaceholderImage);
+ },
+ )
+ : Image.asset(
+ kPlaceholderImage,
+ height: height * 0.5,
+ width: double.infinity,
+ fit: BoxFit.cover,
+ ),
),
Container(
decoration: const BoxDecoration(
@@ -126,7 +136,7 @@ class _AddonUpgradePageState extends State<AddonUpgradePage> {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
- GenericItemCounter(
+ AddonItemCounter(
key: ValueKey(quantity),
addonUpgrade: widget.addonUpgrade,
quantity: quantity,
@@ -134,14 +144,16 @@ class _AddonUpgradePageState extends State<AddonUpgradePage> {
onDecrement: decrement,
),
Expanded(
- flex: 2,
+ flex: 1,
child: UpSalesBottomButton(
onContinue: () {
Navigator.pop(context, quantity);
},
extrasTotalPrice: widget.extrasTotalPrice,
selectedRoomUpgrade: widget.selectedRoomUpgrade,
- children: [Text('add_to_booking'.tr())],
+ children: [
+ Text(quantity > 0 ? 'add_to_booking'.tr() : 'remove'.tr())
+ ],
),
),
],
diff --git a/comwell_key_app/lib/up_sales/pages/processing/up_sales_error_page.dart b/comwell_key_app/lib/up_sales/pages/processing/up_sales_error_page.dart
new file mode 100644
index 00000000..7205bbab
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/pages/processing/up_sales_error_page.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';
+
+class UpSalesErrorPage extends StatelessWidget {
+ const UpSalesErrorPage({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16.0),
+ child: Padding(
+ padding: const EdgeInsets.symmetric(vertical: 40.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ const SizedBox(),
+ Column(
+ children: [
+ Text(
+ "up_sales_processing_error_title".tr(),
+ style: Theme.of(context)
+ .textTheme
+ .headlineMedium
+ ?.copyWith(color: Colors.white),
+ ),
+ Text("generic_error".tr(),
+ textAlign: TextAlign.center,
+ style: Theme.of(context)
+ .textTheme
+ .bodySmall
+ ?.copyWith(color: colorDivider))
+ ],
+ ),
+ Row(
+ children: [
+ Expanded(
+ child: ElevatedButton(
+ onPressed: () {
+ Navigator.of(context).popUntil((route) =>
+ route.settings.name ==
+ AppRoutes.bookingDetails.name);
+ },
+ style: const ButtonStyle(
+ backgroundColor:
+ WidgetStatePropertyAll(Colors.white)),
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Text(
+ "generic_ok".tr(),
+ style: const TextStyle(color: Colors.black),
+ ),
+ )),
+ ),
+ ],
+ )
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/up_sales/pages/processing/up_sales_processing_page.dart b/comwell_key_app/lib/up_sales/pages/processing/up_sales_processing_page.dart
new file mode 100644
index 00000000..0d457592
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/pages/processing/up_sales_processing_page.dart
@@ -0,0 +1,105 @@
+import 'package:comwell_key_app/themes/dark_theme.dart';
+import 'package:comwell_key_app/up_sales/cubit/up_sales_cubit.dart';
+import 'package:comwell_key_app/up_sales/models/up_sales_processing_state.dart';
+import 'package:comwell_key_app/routing/app_routes.dart';
+import 'package:comwell_key_app/up_sales/pages/processing/up_sales_error_page.dart';
+import 'package:comwell_key_app/utils/lottie_utils.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:lottie/lottie.dart';
+
+class UpSalesProcessingPage extends StatefulWidget {
+ const UpSalesProcessingPage({super.key});
+
+ @override
+ State<UpSalesProcessingPage> createState() => _UpSalesProcessingPageState();
+}
+
+class _UpSalesProcessingPageState extends State<UpSalesProcessingPage>
+ with SingleTickerProviderStateMixin {
+ LottieComposition? loadingComposition;
+ late final AnimationController animationController;
+
+ @override
+ void initState() {
+ animationController = AnimationController(vsync: this);
+ super.initState();
+ }
+
+ @override
+ void dispose() {
+ animationController.dispose();
+ super.dispose();
+ }
+
+ void playLoading(UpSalesCubit cubit) async {
+ loadingComposition?.playBetween(
+ animationController,
+ "spinner",
+ markerEnd: "success",
+ repeat: true,
+ );
+ }
+
+ void playError() async {
+ loadingComposition?.playBetween(
+ animationController,
+ "error",
+ repeat: false,
+ );
+ await Future<void>.delayed(const Duration(seconds: 2));
+
+ }
+
+ void playSuccess() async {
+ await loadingComposition?.playBetween(
+ animationController,
+ "success",
+ markerEnd: "error",
+ );
+ await Future<void>.delayed(const Duration(seconds: 2));
+ if (mounted) {
+ Navigator.of(context).popUntil(
+ (route) => route.settings.name == AppRoutes.bookingDetails.name);
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final cubit = context.read<UpSalesCubit>();
+
+ return Scaffold(
+ body: Container(
+ alignment: Alignment.center,
+ color: sandColor[80],
+ child: Builder(builder: (context) {
+ final processingState = cubit.state.processingState;
+ if (processingState is UpSalesProcessingStateError) {
+ return const UpSalesErrorPage();
+ }
+ return Lottie.asset(
+ 'assets/animations/load_animation.json',
+ controller: animationController,
+ onLoaded: (composition) {
+ if (loadingComposition == null) {
+ loadingComposition = composition;
+ animationController.duration = composition.duration;
+ switch (cubit.state.processingState) {
+ case UpSalesProcessingStateSuccess _:
+ playSuccess();
+ case UpSalesProcessingStateError _:
+ playError();
+ default:
+ playLoading(cubit);
+ }
+ }
+ },
+ fit: BoxFit.cover,
+ width: 64,
+ height: 64,
+ );
+ }),
+ ),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/up_sales/pages/services_upgrade_page.dart b/comwell_key_app/lib/up_sales/pages/services_upgrade_page.dart
index 3fe705ae..a57ef9b1 100644
--- a/comwell_key_app/lib/up_sales/pages/services_upgrade_page.dart
+++ b/comwell_key_app/lib/up_sales/pages/services_upgrade_page.dart
@@ -4,8 +4,6 @@ import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/up_sales/components/up_sales_bottom_button.dart';
import 'package:comwell_key_app/up_sales/cubit/up_sales_cubit.dart';
import 'package:comwell_key_app/up_sales/cubit/up_sales_state.dart';
-import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
-import 'package:comwell_key_app/up_sales/models/room_upgrade_extra.dart';
import 'package:comwell_key_app/up_sales/models/room_upgrade_list.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
@@ -109,12 +107,14 @@ class ServicesUpgradePage extends StatelessWidget {
isSinglePurchase: roomUpgradeList.isSinglePurchase,
onSinglePurchaseContinue: () {
if (roomUpgradeList.isSinglePurchase) {
- context
- .pushNamed(AppRoutes.upSaleConfirmation.name, extra: [
- cubit.selectedAddOnUpgrades,
- cubit.extrasTotalPrice,
- roomUpgradeList.roomUpgrade
- ]);
+ cubit.toggleSelectedUpgrade(roomUpgradeList.addOnUpgrade!);
+
+ context.pushNamed(AppRoutes.upSaleConfirmation.name,
+ extra: [
+ cubit.selectedAddOnUpgrades,
+ cubit.extrasTotalPrice,
+ roomUpgradeList.roomUpgrade
+ ]);
}
},
onContinue: () {
diff --git a/comwell_key_app/lib/up_sales/pages/up_sale_confirmation_page.dart b/comwell_key_app/lib/up_sales/pages/up_sale_confirmation_page.dart
index 4555f604..3da81a1b 100644
--- a/comwell_key_app/lib/up_sales/pages/up_sale_confirmation_page.dart
+++ b/comwell_key_app/lib/up_sales/pages/up_sale_confirmation_page.dart
@@ -29,6 +29,7 @@ class UpSaleConfirmationPage extends StatelessWidget {
return BlocBuilder<UpSalesCubit, UpSalesState>(
builder: (context, state) {
final cubit = context.read<UpSalesCubit>();
+ final width = MediaQuery.of(context).size.width;
return Scaffold(
appBar: const ComwellAppBar(),
@@ -136,15 +137,14 @@ class UpSaleConfirmationPage extends StatelessWidget {
child: SliderButton(
backgroundColor: sandColor,
disable: !state.termsAccepted,
+ vibrationFlag: true,
+ width: width - 40,
buttonSize: 58,
- width: double.infinity,
- icon: Center(
- child: state.termsAccepted
- ? Icon(Icons.chevron_right,
- size: 32,
- color: Theme.of(context).colorScheme.onSurface)
- : null,
- ),
+ icon: state.termsAccepted
+ ? Icon(Icons.chevron_right,
+ size: 32,
+ color: Theme.of(context).colorScheme.onSurface)
+ : null,
action: () async {
context.pushNamed(AppRoutes.upSalesProcessing.name,
extra: [selectedUpSales, selectedRoomUpgrade]);
diff --git a/comwell_key_app/lib/up_sales/pages/up_sales_processing_page.dart b/comwell_key_app/lib/up_sales/pages/up_sales_processing_page.dart
deleted file mode 100644
index b395d837..00000000
--- a/comwell_key_app/lib/up_sales/pages/up_sales_processing_page.dart
+++ /dev/null
@@ -1,107 +0,0 @@
-import 'package:comwell_key_app/my_booking/cubit/my_booking_cubit.dart';
-import 'package:comwell_key_app/themes/dark_theme.dart';
-import 'package:comwell_key_app/up_sales/cubit/up_sales_cubit.dart';
-import 'package:comwell_key_app/up_sales/models/up_sales_processing_state.dart';
-import 'package:comwell_key_app/routing/app_routes.dart';
-import 'package:comwell_key_app/utils/lottie_utils.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
-import 'package:lottie/lottie.dart';
-
- class UpSalesProcessingPage extends StatefulWidget {
- const UpSalesProcessingPage({super.key});
-
- @override
- State<UpSalesProcessingPage> createState() => _UpSalesProcessingPageState();
-}
-
-class _UpSalesProcessingPageState extends State<UpSalesProcessingPage>
- with SingleTickerProviderStateMixin {
- LottieComposition? loadingComposition;
- late final AnimationController animationController;
-
- @override
- void initState() {
- animationController = AnimationController(vsync: this);
- super.initState();
- }
-
- @override
- void dispose() {
- animationController.dispose();
- super.dispose();
- }
-
- void playLoading(UpSalesCubit cubit) async {
- loadingComposition?.playBetween(
- animationController,
- "spinner",
- markerEnd: "success",
- repeat: true,
- );
-
- print("processing state in loadinng ${cubit.state.processingState}");
- }
-
- void playError() {
- loadingComposition?.playBetween(
- animationController,
- "error",
- repeat: false,
- );
- }
-
- void playSuccess() async {
- await loadingComposition?.playBetween(
- animationController,
- "success",
- markerEnd: "error",
- );
- await Future<void>.delayed(const Duration(seconds: 2));
- if (mounted) {
-
- Navigator.of(context).popUntil(
- (route) => route.settings.name == AppRoutes.bookingDetails.name);
- }
- }
-
- Future<void> _startConfirmation() async {
- // Start loading animation
-
- playSuccess();
- }
-
- @override
- Widget build(BuildContext context) {
- final cubit = context.read<UpSalesCubit>();
- print("processing state ${cubit.state.processingState}");
-
- return Scaffold(
- body: Container(
- alignment: Alignment.center,
- color: sandColor[80],
- child: Lottie.asset(
- 'assets/animations/load_animation.json',
- controller: animationController,
- onLoaded: (composition) {
- if (loadingComposition == null) {
- loadingComposition = composition;
- animationController.duration = composition.duration;
- switch (cubit.state.processingState) {
- case UpSalesProcessingStateSuccess _:
- playSuccess();
- case UpSalesProcessingStateError _:
- playError();
- default:
- playLoading(cubit);
- }
- }
- },
- fit: BoxFit.cover,
- width: 64,
- height: 64,
- ),
- ),
- );
- }
-}
diff --git a/comwell_key_app/lib/up_sales/up_sales_repository.dart b/comwell_key_app/lib/up_sales/up_sales_repository.dart
index 12d7151d..91b49f90 100644
--- a/comwell_key_app/lib/up_sales/up_sales_repository.dart
+++ b/comwell_key_app/lib/up_sales/up_sales_repository.dart
@@ -1,5 +1,3 @@
-import 'dart:ui';
-
import 'package:comwell_key_app/services/api.dart';
import 'package:comwell_key_app/up_sales/mappers/up_sales_mapper.dart';
import 'package:comwell_key_app/up_sales/models/addon_list.dart';