6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit 102e5b3c

AuthorEdmir Suljic<esu@dwarf.dk>
Date2025-08-11 17:09:09 +0200
Working on pre reg flow for upsales. Made "single purchase flow"

Changed files

.../components/booking_details_bottom_sheet.dart   |   2 +
 .../components/preregister_button.dart             |   5 +-
 .../check_out/pages/check_out_processing_page.dart |   2 +
 .../lib/common/components/comwell_text_field.dart  |   2 +-
 .../pregistration/cubit/preregistration_cubit.dart | 102 +++++++++---------
 .../pregistration/cubit/preregistration_state.dart | 115 +++++++++++++++++++--
 .../pregistration/pages/prereg_address_page.dart   |   4 +-
 .../pregistration/pages/prereg_profile_page.dart   |   5 +-
 .../pages/prereg_up_sales_catalog_page.dart        |  47 ++-------
 .../lib/pregistration/preregistration_flow.dart    |   4 +-
 comwell_key_app/lib/routing/app_router.dart        |  62 ++++++++---
 .../components/catalog/addon_upgrade_catalog.dart  |   5 +-
 .../components/catalog/room_upgrade_catalog.dart   |   6 +-
 .../components/catalog/service_catalog.dart        |  12 ++-
 .../lib/up_sales/components/item_counter.dart      |   4 +-
 .../components/up_sales_bottom_button.dart         |  12 ++-
 .../components/up_sales_continue_button.dart       |   6 +-
 .../components/up_sales_services_widget.dart       |   6 +-
 .../lib/up_sales/cubit/up_sales_cubit.dart         |  47 +++++----
 .../lib/up_sales/cubit/up_sales_state.dart         |  53 +++++++---
 .../lib/up_sales/models/room_upgrade_list.dart     |   5 +-
 .../up_sales/models/up_sales_processing_state.dart |   9 ++
 .../lib/up_sales/pages/addon_upgrade_page.dart     |   6 +-
 .../lib/up_sales/pages/services_upgrade_page.dart  |  52 +++++++---
 .../up_sales/pages/up_sale_confirmation_page.dart  |   4 +-
 .../up_sales/pages/up_sales_processing_page.dart   |  38 ++++---
 comwell_key_app/lib/up_sales/up_sales_catalog.dart |   5 +-
 .../lib/up_sales/up_sales_repository.dart          |   9 +-
 28 files changed, 420 insertions(+), 209 deletions(-)

Diff

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 6e952adb..d211bde4 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
@@ -172,10 +172,12 @@ class BookingDetailsBottomSheet extends StatelessWidget {
const SizedBox(height: 16),
if (cubit.upSales != null)
ServiceCatalog(
+ booking: cubit.booking,
upSales: cubit.upSales!.addOnUpgrades,
height: 252,
selectedUpSales: cubit.state.selectedUpSales,
showRadioButton: false,
+ isSinglePurchase: true,
onTap: (upgrade) {
// No OP
},
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 b26c651d..aa38b4a4 100644
--- a/comwell_key_app/lib/booking_details/components/preregister_button.dart
+++ b/comwell_key_app/lib/booking_details/components/preregister_button.dart
@@ -19,8 +19,9 @@ class PreregisterButton extends StatelessWidget {
margin: const EdgeInsets.symmetric(horizontal: 8),
child: ElevatedButton(
onPressed: () async {
- final (result) = await context
- .pushNamed(AppRoutes.preregistration.name, extra: bloc.booking);
+ final (result) = await context.pushNamed(
+ AppRoutes.preregistration.name,
+ extra: [bloc.booking, bloc.upSales]);
if (result != null) {
bloc.add(InitialEvent());
}
diff --git a/comwell_key_app/lib/check_out/pages/check_out_processing_page.dart b/comwell_key_app/lib/check_out/pages/check_out_processing_page.dart
index 48bc3ad0..6af8aeb8 100644
--- a/comwell_key_app/lib/check_out/pages/check_out_processing_page.dart
+++ b/comwell_key_app/lib/check_out/pages/check_out_processing_page.dart
@@ -204,9 +204,11 @@ class _CheckOutProcessingPageState extends State<CheckOutProcessingPage>
controller: animationController,
onLoaded: (composition) {
if (loadingComposition == null) {
+
loadingComposition = composition;
animationController.duration = composition.duration;
switch (cubit.state.processingState) {
+
case CheckoutProcessingStateSuccess _:
playSuccess();
case CheckoutProcessingStateError _:
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 7a560304..05b0298c 100644
--- a/comwell_key_app/lib/common/components/comwell_text_field.dart
+++ b/comwell_key_app/lib/common/components/comwell_text_field.dart
@@ -67,7 +67,7 @@ class ComwellTextFieldState extends State<ComwellTextField> {
.bodySmall
?.copyWith(color: const Color(0xFFEB0026)),
label: Text(widget.fieldName,
- style: _isFocused
+ 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
diff --git a/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart b/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart
index 7b8783bf..f67769a3 100644
--- a/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart
+++ b/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart
@@ -10,7 +10,6 @@ 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/up_sales/models/upgrade.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:comwell_key_app/utils/phone_utils.dart';
import 'package:country_code_picker/country_code_picker.dart';
@@ -23,11 +22,9 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
final _profileSettingsRepository = locator<ProfileSettingsRepository>();
final _tracking = locator<ComwellTracking>();
final _preregistrationRepository = locator<PreregistrationRepository>();
- final _upSalesRepository = locator<UpSalesRepository>();
- final Locale culture;
final Booking booking;
- List<Upgrade> upSales = [];
+ final UpSales upSales;
final pageController = PageController();
final addressTextController = TextEditingController();
@@ -47,41 +44,54 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
PreregistrationPage.fromIndex(pageController.page?.toInt() ?? 0);
bool _isAnimating = false;
- PreregistrationCubit({required this.booking, required this.culture})
+ PreregistrationCubit({required this.booking, required this.upSales})
: super(const PreregistrationState(
isLoading: false,
selected: false,
availableRoomUpgrades: [],
selectedUpSales: [],
- addOnUpgrades: [],
+ availableAddOnUpgrades: [],
selectedRoomUpgrade: '',
- error: null)) {
+ missingInformation: false,
+ numOfExtras: 0,
+ extrasTotalPrice: 0,
+ termsAndConditionsAccepted: false,
+ forceUpdate: false,
+ user: null,
+ phoneNumber: null,
+ countryCode: null,
+ isPhoneNumberValid: false,
+ isFirstNameValid: false,
+ isLastNameValid: false,
+ isAddressValid: false,
+ isPostalCodeValid: false,
+ isCityValid: false)) {
_tracking.trackScreenView(
"Pre-registration - Betalingskort",
"/pre-registration/betalingskort",
);
addressTextController.addListener(() {
- // emit(state.copyWith(isAddressValid: isAddressValid));
+ emit(state.copyWith(isAddressValid: isAddressValid));
});
postalCodeTextController.addListener(() {
- // emit(state.copyWith(isPostalCodeValid: isPostalCodeValid));
+ emit(state.copyWith(isPostalCodeValid: isPostalCodeValid));
});
cityTextController.addListener(() {
- // emit(state.copyWith(isCityValid: isCityValid));
+ emit(state.copyWith(isCityValid: isCityValid));
});
}
void init() async {
- // emit(state.copyWith(isLoading: true, error: null));
+ emit(state.copyWith(isLoading: true));
try {
final user = await _profileRepository.fetchProfileSettings();
- addressTextController.text = "Bernard Bangs Alle 25";
- postalCodeTextController.text = "2000";
- cityTextController.text = "Copenhagen";
- selectedCountry = "DK";
+ addressTextController.text = user.address.street;
+ postalCodeTextController.text = user.address.zipCode;
+ cityTextController.text = user.address.city;
+ selectedCountry = user.address.country;
countryCode = getCountryCodeFromPhoneNumber(user.phoneNumber).$1;
phoneNumber = getCountryCodeFromPhoneNumber(user.phoneNumber).$2;
@@ -89,15 +99,12 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
firstNameTextController.text = user.firstName;
lastNameTextController.text = user.lastName;
emailTextController.text = user.email;
- phoneNumberTextController.text = "701234567";
+ phoneNumberTextController.text = user.phoneNumber;
- final upSales = await _upSalesRepository.getUpSales(
- booking.confirmationId, booking.hotelCode);
-
- // emit(state.copyWith(
- // isLoading: false, error: null, user: user, upSales: upSales.toUpSales()));
+ emit(state.loaded(upSales: upSales, user: user));
} on Exception catch (e) {
- // emit(state.copyWith(error: e));
+ debugPrint("error fetching preregistration: $e");
+ emit(state.copyWith(isLoading: false));
}
}
@@ -111,10 +118,10 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
country: selectedCountry,
));
- // emit(state.copyWith(user: updatedUser));
+ emit(state.copyWith(user: updatedUser));
_navigateNextPage();
} else {
- // emit(state.copyWith(missingInformation: true));
+ emit(state.copyWith(missingInformation: true));
}
}
@@ -126,7 +133,7 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
firstName: firstNameTextController.text,
lastName: lastNameTextController.text,
phoneNumber: phoneNumber);
- // emit(state.copyWith(user: updatedUser));
+ emit(state.copyWith(user: updatedUser));
_navigateNextPage();
}
@@ -136,10 +143,10 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
}
void onUpSalesContinueClicked() {
- // emit(state.copyWith(
- // selectedUpSales: state.selectedUpSales,
- // numOfExtras: state.selectedUpSales.length,
- // extrasTotalPrice: extrasTotalPrice));
+ emit(state.updateSelectedUpSales(
+ selectedUpSales: state.selectedUpSales,
+ numOfExtras: state.selectedUpSales.length,
+ extrasTotalPrice: extrasTotalPrice));
_navigateNextPage();
}
@@ -194,7 +201,7 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
}
void _onConfirmPressed(BuildContext context) async {
- // emit(state.copyWith(isLoading: true));
+ emit(state.copyWith(isLoading: true));
try {
final confirmationId = booking.confirmationId;
@@ -204,13 +211,13 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
if (preRegResponse != null) {
Future.delayed(const Duration(seconds: 3), () {
- // emit(state.copyWith(isLoading: false));
+ emit(state.copyWith(isLoading: false));
if (!context.mounted) return;
context.pop(preRegResponse);
});
}
} catch (e) {
- // emit(state.copyWith(isLoading: false, error: Exception(e)));
+ emit(state.copyWith(isLoading: false));
}
}
@@ -232,7 +239,7 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
void onPhoneNumberChanged(String phoneNumber) {
phoneNumberTextController.text = phoneNumber;
- // emit(state.copyWith(isPhoneNumberValid: isPhoneNumberValid));
+ emit(state.copyWith(isPhoneNumberValid: isPhoneNumberValid));
}
void onCountryCodeSelected(CountryCode countryCode) {
@@ -255,7 +262,7 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
await pageController.animateToPage(page.index,
duration: const Duration(milliseconds: 500),
curve: Curves.fastOutSlowIn);
- // emit(state.copyWith(forceUpdate: true));
+ emit(state.copyWith(forceUpdate: true));
_isAnimating = false;
}
@@ -265,7 +272,7 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
await pageController.nextPage(
duration: const Duration(milliseconds: 500),
curve: Curves.fastOutSlowIn);
- // emit(state.copyWith(forceUpdate: true));
+ emit(state.copyWith(forceUpdate: true));
_isAnimating = false;
}
@@ -275,7 +282,7 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
await pageController.previousPage(
duration: const Duration(milliseconds: 500),
curve: Curves.fastOutSlowIn);
- // emit(state.copyWith(forceUpdate: true));
+ emit(state.copyWith(forceUpdate: true));
_isAnimating = false;
}
@@ -350,7 +357,7 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
}
void onTermsAndConditionsToggled(bool toggle) {
- // emit(state.copyWith(termsAndConditionsAccepted: toggle));
+ emit(state.copyWith(termsAndConditionsAccepted: toggle));
}
void addSelected(Upgrade upgrade) {
@@ -358,9 +365,10 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
final filteredUpSales = state.selectedUpSales
.where((item) => !item.tags.contains('room'))
.toList();
- // emit(state.copyWith(selectedUpSales: [...filteredUpSales, upgrade]));
+ emit(state.copyWith(selectedUpSales: [...filteredUpSales, upgrade]));
} else {
- // emit(state.copyWith(selectedUpSales: [...state.selectedUpSales, upgrade]));
+ emit(
+ state.copyWith(selectedUpSales: [...state.selectedUpSales, upgrade]));
}
}
@@ -370,19 +378,19 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
void decrement() {
// if (state.addOnUpgrades.firstWhere((e) => e.id == .id).quantity > 0 || state.selectedUpSales.isNotEmpty) {
- // // emit(state.copyWith(quantity: state.quantity - 1));
+ // emit(state.copyWith(quantity: state.quantity - 1));
// }
}
void onContinue() {
- // emit(state.copyWith(selected: false));
+ emit(state.copyWith(selected: false));
}
void updateUpgradeQuantity(Upgrade upgrade, int quantity) {
if (quantity == 0) {
final filteredUpSales =
state.selectedUpSales.where((item) => item.id != upgrade.id).toList();
- // emit(state.copyWith(selectedUpSales: filteredUpSales));
+ emit(state.copyWith(selectedUpSales: filteredUpSales));
return;
} else {
final existingItems =
@@ -391,15 +399,15 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
...existingItems,
...List.generate(quantity, (_) => upgrade)
];
- // emit(state.copyWith(selectedUpSales: newSelectedUpSales));
+ emit(state.copyWith(selectedUpSales: newSelectedUpSales));
}
}
void removeUpgrade(Upgrade upgrade) {
- // emit(state.copyWith(
- // selectedUpSales: state.selectedUpSales
- // .where((item) => item.id != upgrade.id)
- // .toList()));
+ emit(state.copyWith(
+ selectedUpSales: state.selectedUpSales
+ .where((item) => item.id != upgrade.id)
+ .toList()));
}
int extrasTotalQuantity(Upgrade upgrade) {
diff --git a/comwell_key_app/lib/pregistration/cubit/preregistration_state.dart b/comwell_key_app/lib/pregistration/cubit/preregistration_state.dart
index 9283bdd0..0ced04ed 100644
--- a/comwell_key_app/lib/pregistration/cubit/preregistration_state.dart
+++ b/comwell_key_app/lib/pregistration/cubit/preregistration_state.dart
@@ -1,11 +1,20 @@
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';
import 'package:comwell_key_app/up_sales/models/upgrade.dart';
import 'package:country_code_picker/country_code_picker.dart';
+import 'package:equatable/equatable.dart';
import '../../profile_settings/model/user.dart';
-class PreregistrationState extends UpSalesState {
+class PreregistrationState extends Equatable {
+ final bool isLoading;
+ final bool selected;
+ final List<AddOnUpgrade> availableAddOnUpgrades;
+ final List<RoomUpgrade> availableRoomUpgrades;
+ final List<Upgrade> selectedUpSales;
+ final String selectedRoomUpgrade;
final bool forceUpdate;
final User? user;
final CountryCode? countryCode;
@@ -22,13 +31,12 @@ class PreregistrationState extends UpSalesState {
final bool isCityValid;
const PreregistrationState({
- required super.isLoading,
- required super.selected,
- required super.addOnUpgrades,
- required super.availableRoomUpgrades,
- required super.selectedUpSales,
- required super.selectedRoomUpgrade,
- required super.error,
+ required this.isLoading,
+ required this.selected,
+ required this.availableAddOnUpgrades,
+ required this.availableRoomUpgrades,
+ required this.selectedUpSales,
+ required this.selectedRoomUpgrade,
this.missingInformation = false,
this.numOfExtras = 0,
this.extrasTotalPrice = 0,
@@ -45,10 +53,95 @@ class PreregistrationState extends UpSalesState {
this.isCityValid = false,
});
+ PreregistrationState.initial()
+ : isLoading = false,
+ selected = false,
+ availableAddOnUpgrades = [],
+ availableRoomUpgrades = [],
+ selectedUpSales = [],
+ selectedRoomUpgrade = '',
+ missingInformation = false,
+ numOfExtras = 0,
+ extrasTotalPrice = 0,
+ termsAndConditionsAccepted = false,
+ forceUpdate = false,
+ user = null,
+ phoneNumber = null,
+ countryCode = null,
+ isPhoneNumberValid = false,
+ isFirstNameValid = false,
+ isLastNameValid = false,
+ isAddressValid = false,
+ isPostalCodeValid = false,
+ isCityValid = false;
+
+ PreregistrationState loaded({required UpSales upSales, required User user}) =>
+ copyWith(
+ isLoading: false,
+ availableRoomUpgrades: upSales.roomUpgrades,
+ availableAddOnUpgrades: 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 copyWith({
+ bool? isLoading,
+ bool? selected,
+ List<AddOnUpgrade>? availableAddOnUpgrades,
+ List<RoomUpgrade>? availableRoomUpgrades,
+ List<Upgrade>? selectedUpSales,
+ String? selectedRoomUpgrade,
+ bool? missingInformation,
+ int? numOfExtras,
+ int? extrasTotalPrice,
+ bool? termsAndConditionsAccepted,
+ bool? forceUpdate,
+ User? user,
+ String? phoneNumber,
+ CountryCode? countryCode,
+ bool? isPhoneNumberValid,
+ bool? isFirstNameValid,
+ bool? isLastNameValid,
+ bool? isAddressValid,
+ bool? isPostalCodeValid,
+ bool? isCityValid,
+ }) {
+ return PreregistrationState(
+ isLoading: isLoading ?? this.isLoading,
+ selected: selected ?? this.selected,
+ availableAddOnUpgrades:
+ availableAddOnUpgrades ?? this.availableAddOnUpgrades,
+ 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,
+ forceUpdate: forceUpdate ?? this.forceUpdate,
+ user: user ?? this.user,
+ );
+ }
+
@override
List<Object?> get props => [
- super.isLoading,
- super.error,
+ isLoading,
+ selected,
+ availableAddOnUpgrades,
+ availableRoomUpgrades,
+ selectedUpSales,
+ selectedRoomUpgrade,
user,
phoneNumber,
countryCode,
@@ -65,6 +158,6 @@ class PreregistrationState extends UpSalesState {
isCityValid,
selectedUpSales,
availableRoomUpgrades,
+ selectedRoomUpgrade,
];
-
}
diff --git a/comwell_key_app/lib/pregistration/pages/prereg_address_page.dart b/comwell_key_app/lib/pregistration/pages/prereg_address_page.dart
index 46cc2e91..ad75b071 100644
--- a/comwell_key_app/lib/pregistration/pages/prereg_address_page.dart
+++ b/comwell_key_app/lib/pregistration/pages/prereg_address_page.dart
@@ -20,9 +20,7 @@ class PreregAddressPage extends StatelessWidget {
if (state.isLoading) {
return const Center(child: PreregAddressShimmerLoader());
}
- if (state.error != null) {
- return const Center(child: Text("Error"));
- }
+
final addressErrorMessage =
!cubit.isAddressValid && state.missingInformation
? "generic_information_required".tr()
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 d1693f6a..eea6d984 100644
--- a/comwell_key_app/lib/pregistration/pages/prereg_profile_page.dart
+++ b/comwell_key_app/lib/pregistration/pages/prereg_profile_page.dart
@@ -19,6 +19,7 @@ class PreregProfilePage extends StatelessWidget {
if (state.isLoading) {
return const Center(child: PreregProfileShimmerLoader());
}
+
if (state.user != null) {
return _buildProfilePage(theme, state, context);
}
@@ -108,7 +109,9 @@ class PreregProfilePage extends StatelessWidget {
onPhoneNumberChanged: (String phoneNumber) {
cubit.onPhoneNumberChanged(phoneNumber);
},
- onSubmitted: (_) {},
+ onSubmitted: (_) {
+ // NO OP
+ },
),
],
),
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 9e9eee33..2e057003 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
@@ -52,7 +52,8 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
),
const SizedBox(height: 8),
ServiceCatalog(
- upSales: cubit.upSales.whereType<AddOnUpgrade>().toList(),
+ booking: cubit.booking,
+ upSales: cubit.state.availableAddOnUpgrades,
selectedUpSales: state.selectedUpSales,
onServiceSelected: (upgrade, isSelected) {
if (isSelected) {
@@ -79,9 +80,10 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
),
const SizedBox(height: 8),
RoomUpgradeCatalog(
- availableRoomUpgrades: cubit.upSales.whereType<RoomUpgrade>().toList(),
- selectedRoomUpgrade: state.selectedRoomUpgrade,
- selectedUpSales: state.selectedUpSales,
+ booking: cubit.booking,
+ availableRoomUpgrades: cubit.state.availableRoomUpgrades,
+ selectedRoomUpgrade: cubit.state.selectedRoomUpgrade,
+ selectedUpSales: cubit.state.selectedUpSales,
onRoomUpgradeSelected: (upgrade, isSelected) {
if (isSelected) {
cubit.removeUpgrade(upgrade);
@@ -91,7 +93,7 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
},
onTap: (upgrade) {
final isSelected =
- state.selectedUpSales.contains(upgrade);
+ cubit.state.selectedUpSales.contains(upgrade);
if (isSelected) {
cubit.removeUpgrade(upgrade);
} else {
@@ -107,8 +109,8 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
),
const SizedBox(height: 8),
AddOnUpgradeCatalog(
- addOnUpgrades: cubit.upSales.whereType<AddOnUpgrade>().toList(),
- selectedUpSales: state.selectedUpSales.whereType<AddOnUpgrade>().toList(),
+ addOnUpgrades: cubit.state.availableAddOnUpgrades,
+ selectedUpSales: cubit.state.selectedUpSales.whereType<AddOnUpgrade>().toList(),
onAddOnUpgradeSelected: (upgrade) {
cubit.addSelected(upgrade);
},
@@ -120,35 +122,4 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
);
});
}
-
- Future<void> handleReadMoreTapPrereg({
- required BuildContext context,
- required String routeName,
- required dynamic cubit,
- required Upgrade upgrade,
- required int quantity,
- required List<Upgrade> selectedUpSales,
- }) async {
- final dynamic extra;
- if (routeName == AppRoutes.otherUpgrade.name) {
- extra = RoomUpgradeExtra(upgrade: upgrade, quantity: quantity);
- } else if (routeName == AppRoutes.roomUpgrade.name) {
- extra = RoomUpgradeList(
- roomUpgrade: upgrade as RoomUpgrade, isRoomUpgradeSelected: selectedUpSales.any((e) => e.id == upgrade.id));
- } else {
- extra = null;
- }
- final roomUpgradeResponse =
- await context.pushNamed(routeName, extra: extra);
- if (roomUpgradeResponse is List) {
- if (roomUpgradeResponse[1] as bool) {
- cubit.removeUpgrade(roomUpgradeResponse[0] as Upgrade);
- } else {
- cubit.addSelected(roomUpgradeResponse[0] as Upgrade);
- }
- }
- if (roomUpgradeResponse is int) {
- cubit.updateUpgradeQuantity(upgrade, roomUpgradeResponse);
- }
- }
}
diff --git a/comwell_key_app/lib/pregistration/preregistration_flow.dart b/comwell_key_app/lib/pregistration/preregistration_flow.dart
index c208f4d7..ca06e2a4 100644
--- a/comwell_key_app/lib/pregistration/preregistration_flow.dart
+++ b/comwell_key_app/lib/pregistration/preregistration_flow.dart
@@ -55,9 +55,7 @@ class _PreregistrationFlowState extends State<PreregistrationFlow> {
padding:
const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 40.0),
child: ElevatedButton(
- onPressed: cubit.canContinue
- ? () => cubit.onContinueClicked(context)
- : null,
+ onPressed: () => cubit.onContinueClicked(context),
style: ButtonStyle(
backgroundColor:
WidgetStateProperty.resolveWith((states) {
diff --git a/comwell_key_app/lib/routing/app_router.dart b/comwell_key_app/lib/routing/app_router.dart
index 9fbab150..56d53015 100644
--- a/comwell_key_app/lib/routing/app_router.dart
+++ b/comwell_key_app/lib/routing/app_router.dart
@@ -53,6 +53,7 @@ import 'package:comwell_key_app/routing/go_router_observer.dart';
import 'package:comwell_key_app/share/cubit/share_booking_cubit.dart';
import 'package:comwell_key_app/share/share_booking_page.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.dart';
import 'package:comwell_key_app/up_sales/models/room_upgrade_extra.dart';
@@ -333,11 +334,13 @@ GoRouter goRouter() {
path: "/${AppRoutes.preregistration.name}",
name: AppRoutes.preregistration.name,
builder: (context, state) {
- final booking = state.extra as Booking;
+ final extras = state.extra as List<dynamic>;
+ final booking = extras[0] as Booking;
+ final upSales = extras[1] as UpSales;
return BlocProvider(
- create: (context) => PreregistrationCubit(
- booking: booking, culture: context.locale)
- ..init(),
+ create: (context) =>
+ PreregistrationCubit(booking: booking, upSales: upSales)
+ ..init(),
child: const PreregistrationFlow(),
);
}),
@@ -381,11 +384,33 @@ GoRouter goRouter() {
return CustomTransitionPage<void>(
key: state.pageKey,
child: BlocProvider(
- create: (_) => UpSalesCubit(
- upSaleRepository: locator<UpSalesRepository>(),
- upSales: (state.extra as List<dynamic>)[0] as UpSales,
- booking: (state.extra as List<dynamic>)[1] as Booking,
- )..init(),
+ create: (_) {
+ final extras = state.extra;
+ if (extras is List<dynamic> && extras.length == 2) {
+ return UpSalesCubit(
+ upSaleRepository: locator<UpSalesRepository>(),
+ upSales: extras[0] as UpSales,
+ booking: extras[1] as Booking,
+ )..init();
+ } else if (extras is RoomUpgradeList) {
+ final upSales = UpSales(
+ property: extras.booking.hotelName,
+ confirmationNumber: extras.booking.confirmationId,
+ roomUpgrades: extras.roomUpgrade != null
+ ? [extras.roomUpgrade!]
+ : [],
+ addOnUpgrades: extras.addOnUpgrade != null
+ ? [extras.addOnUpgrade!]
+ : []);
+ return UpSalesCubit(
+ upSaleRepository: locator<UpSalesRepository>(),
+ upSales: upSales,
+ booking: (extras.booking),
+ )..init();
+ } else {
+ throw Exception('Invalid extra type');
+ }
+ },
child: child,
),
transitionsBuilder:
@@ -441,11 +466,12 @@ GoRouter goRouter() {
name: AppRoutes.upSaleConfirmation.name,
builder: (context, state) {
final extras = state.extra as List<dynamic>;
- final selectedUpSales = extras[0] as List<Upgrade>;
+ final selectedUpSales = extras[0] as List<AddOnUpgrade?>;
final extrasTotalPrice = extras[1] as int;
final selectedRoomUpgrade = extras[2] as RoomUpgrade?;
return UpSaleConfirmationPage(
- selectedUpSales: selectedUpSales,
+ selectedUpSales:
+ selectedUpSales.whereType<AddOnUpgrade>().toList(),
extrasTotalPrice: extrasTotalPrice,
selectedRoomUpgrade: selectedRoomUpgrade);
},
@@ -455,11 +481,17 @@ GoRouter goRouter() {
name: AppRoutes.upSalesProcessing.name,
builder: (context, state) {
final extras = state.extra as List<dynamic>;
- final selectedUpSales = extras[0] as List<Upgrade>;
+ final selectedUpSales = extras[0] as List<AddOnUpgrade?>;
final selectedRoomUpgrade = extras[1] as RoomUpgrade?;
- return UpSalesProcessingPage(
- selectedUpSales: selectedUpSales,
- selectedRoomUpgrade: selectedRoomUpgrade);
+ final cubit = context.read<UpSalesCubit>();
+ cubit.addUpSalesToBooking(
+ selectedUpSales.whereType<AddOnUpgrade>().toList(),
+ selectedRoomUpgrade);
+ return BlocBuilder<UpSalesCubit, UpSalesState>(
+ builder: (context, state) {
+ return UpSalesProcessingPage(
+ key: ValueKey(state));
+ });
},
),
]),
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 c2f4c35a..84e2b4a1 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
@@ -22,6 +22,7 @@ class AddOnUpgradeCatalog extends StatelessWidget {
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
+
if (addOnUpgrades.isEmpty) {
return Padding(
@@ -38,12 +39,14 @@ class AddOnUpgradeCatalog extends StatelessWidget {
scrollDirection: Axis.horizontal,
itemCount: addOnUpgrades.length,
itemBuilder: (context, index) {
+ final isSelected = selectedUpSales.any((e) => e.id == addOnUpgrades.elementAt(index).id);
return GestureDetector(
onTap: () async {
final result = await context.pushNamed(
AppRoutes.otherUpgrade.name,
extra: addOnUpgrades.elementAt(index)
);
+ print("result ${addOnUpgrades.elementAt(index)}");
if (result is AddOnUpgrade) {
onAddOnUpgradeSelected?.call(result);
}
@@ -52,7 +55,7 @@ class AddOnUpgradeCatalog extends StatelessWidget {
width: 328,
height: 268,
upgrade: addOnUpgrades.elementAt(index),
- isSelected: selectedUpSales.any((e) => e.id == addOnUpgrades.elementAt(index).id),
+ isSelected: isSelected,
routeName: AppRoutes.otherUpgrade.name,
showCounter: true,
selectedUpSales: selectedUpSales,
diff --git a/comwell_key_app/lib/up_sales/components/catalog/room_upgrade_catalog.dart b/comwell_key_app/lib/up_sales/components/catalog/room_upgrade_catalog.dart
index 57d44237..3ccea389 100644
--- a/comwell_key_app/lib/up_sales/components/catalog/room_upgrade_catalog.dart
+++ b/comwell_key_app/lib/up_sales/components/catalog/room_upgrade_catalog.dart
@@ -1,4 +1,5 @@
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/themes/light_theme.dart';
import 'package:comwell_key_app/up_sales/components/up_sales_upgrades_widget.dart';
@@ -16,13 +17,15 @@ class RoomUpgradeCatalog extends StatelessWidget {
final List<Upgrade> selectedUpSales;
final void Function(RoomUpgrade, bool)? onRoomUpgradeSelected;
final void Function(Upgrade)? onTap;
+ final Booking booking;
const RoomUpgradeCatalog({
super.key,
required this.availableRoomUpgrades,
required this.selectedRoomUpgrade,
required this.selectedUpSales,
this.onRoomUpgradeSelected,
- this.onTap
+ this.onTap,
+ required this.booking
});
@override
@@ -52,6 +55,7 @@ class RoomUpgradeCatalog extends StatelessWidget {
final result = await context.pushNamed(
AppRoutes.roomUpgrade.name,
extra: RoomUpgradeList(
+ booking: booking,
roomUpgrade: roomUpgrade,
isRoomUpgradeSelected: isSelected,
)
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 0bd96d1c..26662e86 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,4 +1,5 @@
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/themes/light_theme.dart';
import 'package:comwell_key_app/up_sales/components/up_sales_services_widget.dart';
@@ -17,6 +18,8 @@ class ServiceCatalog extends StatelessWidget {
final List<Upgrade> selectedUpSales;
final bool showRadioButton;
final void Function(AddOnUpgrade, bool) onServiceSelected;
+ final Booking booking;
+ final bool isSinglePurchase;
const ServiceCatalog(
{super.key,
required this.upSales,
@@ -24,10 +27,13 @@ class ServiceCatalog extends StatelessWidget {
required this.onTap,
required this.selectedUpSales,
this.showRadioButton = true,
- required this.onServiceSelected});
+ required this.onServiceSelected,
+ required this.booking,
+ this.isSinglePurchase = false});
@override
Widget build(BuildContext context) {
+ print("single purchase in catalog: $isSinglePurchase");
return SizedBox(
height: height ?? kUpSalesServiceWidgetHeightSmall,
@@ -42,8 +48,10 @@ class ServiceCatalog extends StatelessWidget {
final result = await context.pushNamed(
AppRoutes.servicesUpgrade.name,
extra: RoomUpgradeList(
+ booking: booking,
addOnUpgrade: upSales.elementAt(index),
- isRoomUpgradeSelected: isSelected
+ isRoomUpgradeSelected: isSelected,
+ isSinglePurchase: isSinglePurchase
));
if (result is List && result.length == 2) {
final upgrade = result[0] as AddOnUpgrade;
diff --git a/comwell_key_app/lib/up_sales/components/item_counter.dart b/comwell_key_app/lib/up_sales/components/item_counter.dart
index ee9a351c..23768d08 100644
--- a/comwell_key_app/lib/up_sales/components/item_counter.dart
+++ b/comwell_key_app/lib/up_sales/components/item_counter.dart
@@ -31,7 +31,7 @@ class ItemCounter extends StatelessWidget {
Row(
children: [
InkWell(
- onTap: () => cubit.decrement(addonUpgrade.id),
+ onTap: () => cubit.decrement(addonUpgrade),
borderRadius: BorderRadius.circular(24),
child: Container(
width: 44,
@@ -49,7 +49,7 @@ class ItemCounter extends StatelessWidget {
const SizedBox(width: 16),
// Plus button
InkWell(
- onTap: () => cubit.increment(addonUpgrade.id),
+ onTap: () => cubit.increment(addonUpgrade),
borderRadius: BorderRadius.circular(24),
child: Container(
width: 44,
diff --git a/comwell_key_app/lib/up_sales/components/up_sales_bottom_button.dart b/comwell_key_app/lib/up_sales/components/up_sales_bottom_button.dart
index 4026c5dd..4a139d0a 100644
--- a/comwell_key_app/lib/up_sales/components/up_sales_bottom_button.dart
+++ b/comwell_key_app/lib/up_sales/components/up_sales_bottom_button.dart
@@ -9,9 +9,11 @@ class UpSalesBottomButton extends StatelessWidget {
final List<Widget> children;
final VoidCallback onContinue;
final VoidCallback? onAddUpSale;
+ final VoidCallback? onSinglePurchaseContinue;
final List<Upgrade> selectedUpSales;
final int extrasTotalPrice;
final String selectedRoomUpgrade;
+ final bool isSinglePurchase;
const UpSalesBottomButton({
super.key,
required this.onContinue,
@@ -20,6 +22,8 @@ class UpSalesBottomButton extends StatelessWidget {
required this.extrasTotalPrice,
this.onAddUpSale,
required this.selectedRoomUpgrade,
+ this.onSinglePurchaseContinue,
+ this.isSinglePurchase = false,
});
@override
@@ -35,11 +39,15 @@ class UpSalesBottomButton extends StatelessWidget {
),
child: ElevatedButton(
onPressed: () {
- onContinue();
+ if (isSinglePurchase) {
+ onSinglePurchaseContinue!();
+ } else {
+ onContinue();
+ }
},
style: ButtonStyle(
elevation: WidgetStateProperty.all(0),
- backgroundColor: WidgetStateProperty.all(sandColor[80]),
+ backgroundColor: WidgetStateProperty.all(sandColor),
foregroundColor: const WidgetStatePropertyAll(Colors.white),
),
child: Padding(
diff --git a/comwell_key_app/lib/up_sales/components/up_sales_continue_button.dart b/comwell_key_app/lib/up_sales/components/up_sales_continue_button.dart
index 5ba243b9..21849f33 100644
--- a/comwell_key_app/lib/up_sales/components/up_sales_continue_button.dart
+++ b/comwell_key_app/lib/up_sales/components/up_sales_continue_button.dart
@@ -1,13 +1,13 @@
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/themes/light_theme.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/upgrade.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
class UpSalesContinueButton extends StatelessWidget {
- final List<Upgrade> selectedUpSales;
+ final List<AddOnUpgrade> selectedUpSales;
final RoomUpgrade? selectedRoomUpgrade;
final int extrasTotalPrice;
const UpSalesContinueButton(
@@ -43,7 +43,7 @@ class UpSalesContinueButton extends StatelessWidget {
style: ButtonStyle(
elevation: WidgetStateProperty.all(0),
backgroundColor: WidgetStateProperty.all(
- isUpSalesEmpty ? Colors.grey : sandColor[80]),
+ isUpSalesEmpty ? Colors.grey : sandColor),
foregroundColor: const WidgetStatePropertyAll(Colors.white),
),
child: Padding(
diff --git a/comwell_key_app/lib/up_sales/components/up_sales_services_widget.dart b/comwell_key_app/lib/up_sales/components/up_sales_services_widget.dart
index dfba384e..edd8be24 100644
--- a/comwell_key_app/lib/up_sales/components/up_sales_services_widget.dart
+++ b/comwell_key_app/lib/up_sales/components/up_sales_services_widget.dart
@@ -14,7 +14,7 @@ class UpSalesServicesWidget extends StatelessWidget {
final bool? isPopular;
final void Function(Upgrade)? onTap;
final bool showRadioButton;
- final List<Upgrade>? selectedUpSales;
+ final List<Upgrade>? selectedUpSales;
const UpSalesServicesWidget(
{super.key,
this.width = 328,
@@ -24,12 +24,12 @@ class UpSalesServicesWidget extends StatelessWidget {
this.isPopular,
this.onTap,
this.showRadioButton = true,
- this.selectedUpSales});
+ this.selectedUpSales,
+ });
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
-
return AnimatedContainer(
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
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 ed7c1caa..73c8a3de 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
@@ -4,6 +4,7 @@ import 'package:comwell_key_app/up_sales/cubit/up_sales_state.dart';
import 'package:comwell_key_app/up_sales/models/addon_list.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_processing_state.dart';
import 'package:comwell_key_app/up_sales/models/upgrade.dart';
import 'package:comwell_key_app/up_sales/models/up_sales.dart';
import 'package:comwell_key_app/up_sales/up_sales_repository.dart';
@@ -33,6 +34,7 @@ class UpSalesCubit extends Cubit<UpSalesState> {
selectedUpSales: const [],
selectedRoomUpgrade: '',
isLoading: true,
+ processingState: UpSalesProcessingStateNotStarted(),
error: null));
try {
emit(state.loaded(upSales: upSales));
@@ -41,12 +43,12 @@ class UpSalesCubit extends Cubit<UpSalesState> {
}
}
- void increment(String upgradeId) {
- emit(state.addQuantity());
+ void increment(AddOnUpgrade upgrade) {
+ emit(state.addQuantity(upgrade));
}
- void decrement(String upgradeId) {
- emit(state.removeQuantity());
+ void decrement(AddOnUpgrade upgrade) {
+ emit(state.removeQuantity(upgrade));
}
void onContinue() {
@@ -94,21 +96,28 @@ class UpSalesCubit extends Cubit<UpSalesState> {
emit(state.copyWith(termsAccepted: !state.termsAccepted));
}
- Future<void> addUpSalesToBooking(List<Upgrade> selectedUpSales, RoomUpgrade? selectedRoomUpgrade) async {
- print("selectedUpSales in cubit: ${selectedUpSales}");
- // Extract RoomUpgrade from selectedUpSales to get the roomType
- final roomType = selectedRoomUpgrade?.id ?? '';
+ Future<void> addUpSalesToBooking(
+ List<Upgrade> selectedUpSales, RoomUpgrade? selectedRoomUpgrade) async {
- // 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();
-
- print("addonList: ${addonList}");
- print("roomType: ${roomType}");
-
- await upSaleRepository.addUpSalesToBooking(
- booking.confirmationId, booking.hotelCode, roomType, addonList);
- await Future.delayed(const Duration(seconds: 2));
+ emit(state.processingStateUpdated(UpSalesProcessingStateProcessing()));
+ try {
+ // Extract RoomUpgrade from selectedUpSales to get the roomType
+ final roomType = selectedRoomUpgrade?.id ?? '';
+
+ // 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();
+
+ await upSaleRepository.addUpSalesToBooking(
+ booking.confirmationId, booking.hotelCode, roomType, addonList);
+ await Future.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 051a2a8a..e8499a2b 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
@@ -1,5 +1,6 @@
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_processing_state.dart';
import 'package:comwell_key_app/up_sales/models/upgrade.dart';
import 'package:comwell_key_app/up_sales/models/up_sales.dart';
import 'package:equatable/equatable.dart';
@@ -13,6 +14,7 @@ class UpSalesState extends Equatable {
final Exception? error;
final bool isLoading;
final bool termsAccepted;
+ final UpSalesProcessingState processingState;
const UpSalesState({
required this.selected,
required this.addOnUpgrades,
@@ -22,6 +24,7 @@ class UpSalesState extends Equatable {
this.error,
required this.isLoading,
this.termsAccepted = false,
+ required this.processingState,
});
@override
@@ -31,7 +34,9 @@ class UpSalesState extends Equatable {
availableRoomUpgrades,
selectedUpSales,
selectedRoomUpgrade,
- termsAccepted
+ termsAccepted,
+ isLoading,
+ processingState
];
UpSalesState.initial()
@@ -42,7 +47,8 @@ class UpSalesState extends Equatable {
selectedRoomUpgrade = '',
error = null,
isLoading = false,
- termsAccepted = false;
+ termsAccepted = false,
+ processingState = UpSalesProcessingStateNotStarted();
UpSalesState setupError({required Exception error}) =>
copyWith(isLoading: false, error: error);
@@ -55,9 +61,13 @@ class UpSalesState extends Equatable {
UpSalesState addSelectedUpsales({required Upgrade upgrade}) {
if (upgrade is AddOnUpgrade) {
final newUpsale = upgrade.copyWith(quantity: 1);
- return copyWith(selectedUpSales: [...selectedUpSales, newUpsale], selectedRoomUpgrade: selectedRoomUpgrade);
+ return copyWith(
+ selectedUpSales: [...selectedUpSales, newUpsale],
+ selectedRoomUpgrade: selectedRoomUpgrade);
} else {
- return copyWith(selectedUpSales: [...selectedUpSales, upgrade], selectedRoomUpgrade: selectedRoomUpgrade);
+ return copyWith(
+ selectedUpSales: [...selectedUpSales, upgrade],
+ selectedRoomUpgrade: selectedRoomUpgrade);
}
}
@@ -65,7 +75,8 @@ class UpSalesState extends Equatable {
required List<Upgrade> upgradeList,
}) {
if (upgradeList.isEmpty) return this;
- return copyWith(selectedUpSales: upgradeList, selectedRoomUpgrade: selectedRoomUpgrade);
+ return copyWith(
+ selectedUpSales: upgradeList, selectedRoomUpgrade: selectedRoomUpgrade);
}
UpSalesState updateOtherUpgradeWithQuantity(
@@ -80,7 +91,9 @@ class UpSalesState extends Equatable {
selectedUpSales.where((upgrade) => upgrade.id != updateItemId).toList();
// Add the new items while preserving other items
- return copyWith(selectedUpSales: [...existingItems, ...upgradeList], selectedRoomUpgrade: selectedRoomUpgrade);
+ return copyWith(
+ selectedUpSales: [...existingItems, ...upgradeList],
+ selectedRoomUpgrade: selectedRoomUpgrade);
}
UpSalesState updateRoomUpgrade({required RoomUpgrade roomUpgrade}) =>
@@ -93,15 +106,15 @@ class UpSalesState extends Equatable {
selectedUpSales.where((item) => item.id != upgrade.id).toList(),
selectedRoomUpgrade: selectedRoomUpgrade);
- UpSalesState addQuantity() => copyWith(
+ UpSalesState addQuantity(AddOnUpgrade upgrade) => copyWith(
addOnUpgrades: addOnUpgrades
- .map((e) => e.copyWith(quantity: e.quantity + 1))
+ .map((e) => e.id == upgrade.id ? e.copyWith(quantity: e.quantity + 1) : e)
.toList(),
selectedRoomUpgrade: selectedRoomUpgrade);
- UpSalesState removeQuantity() => copyWith(
+ UpSalesState removeQuantity(AddOnUpgrade upgrade) => copyWith(
addOnUpgrades: addOnUpgrades
- .map((e) => e.copyWith(quantity: e.quantity - 1))
+ .map((e) => e.id == upgrade.id ? e.copyWith(quantity: e.quantity - 1) : e)
.toList(),
selectedRoomUpgrade: selectedRoomUpgrade);
@@ -125,17 +138,31 @@ class UpSalesState extends Equatable {
final existingItems =
selectedUpSales.where((item) => item.id != upgrade.id).toList();
+ print("existingItems ${existingItems}");
+
+ print("upgrade ${upgrade.quantity}");
+
+
// If quantity is 0, just remove the upgrade from selectedUpSales
if (upgrade.quantity <= 0) {
- return copyWith(selectedUpSales: existingItems, selectedRoomUpgrade: selectedRoomUpgrade);
+ return copyWith(
+ selectedUpSales: existingItems,
+ selectedRoomUpgrade: selectedRoomUpgrade);
}
// Add the new upgrade to selectedUpSales
final updatedSelectedUpSales = [...existingItems, upgrade];
- return copyWith(selectedUpSales: updatedSelectedUpSales, selectedRoomUpgrade: selectedRoomUpgrade);
+ print("updatedSelectedUpSales ${updatedSelectedUpSales}");
+
+ return copyWith(
+ selectedUpSales: updatedSelectedUpSales,
+ selectedRoomUpgrade: selectedRoomUpgrade);
}
+ UpSalesState processingStateUpdated(UpSalesProcessingState processingState) =>
+ copyWith(processingState: processingState, error: Exception(""));
+
UpSalesState copyWith({
bool? selected,
List<AddOnUpgrade>? addOnUpgrades,
@@ -145,6 +172,7 @@ class UpSalesState extends Equatable {
bool? isLoading,
Exception? error,
bool? termsAccepted,
+ UpSalesProcessingState? processingState,
}) {
return UpSalesState(
selected: selected ?? this.selected,
@@ -156,6 +184,7 @@ class UpSalesState extends Equatable {
isLoading: isLoading ?? this.isLoading,
error: error ?? this.error,
termsAccepted: termsAccepted ?? this.termsAccepted,
+ processingState: processingState ?? this.processingState,
);
}
}
diff --git a/comwell_key_app/lib/up_sales/models/room_upgrade_list.dart b/comwell_key_app/lib/up_sales/models/room_upgrade_list.dart
index 82267dd2..82399a5c 100644
--- a/comwell_key_app/lib/up_sales/models/room_upgrade_list.dart
+++ b/comwell_key_app/lib/up_sales/models/room_upgrade_list.dart
@@ -1,12 +1,15 @@
+import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
class RoomUpgradeList {
+ final Booking booking;
final RoomUpgrade? roomUpgrade;
final AddOnUpgrade? addOnUpgrade;
final bool isRoomUpgradeSelected;
+ final bool isSinglePurchase;
- RoomUpgradeList({this.roomUpgrade, this.addOnUpgrade, required this.isRoomUpgradeSelected});
+ RoomUpgradeList({required this.booking, this.roomUpgrade, this.addOnUpgrade, required this.isRoomUpgradeSelected, this.isSinglePurchase = false});
}
diff --git a/comwell_key_app/lib/up_sales/models/up_sales_processing_state.dart b/comwell_key_app/lib/up_sales/models/up_sales_processing_state.dart
new file mode 100644
index 00000000..ee0a981f
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/models/up_sales_processing_state.dart
@@ -0,0 +1,9 @@
+sealed class UpSalesProcessingState {}
+
+class UpSalesProcessingStateNotStarted extends UpSalesProcessingState {}
+
+class UpSalesProcessingStateProcessing extends UpSalesProcessingState {}
+
+class UpSalesProcessingStateSuccess extends UpSalesProcessingState {}
+
+class UpSalesProcessingStateError extends UpSalesProcessingState {}
\ No newline at end of file
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 d91f4085..9c79f4d2 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
@@ -19,7 +19,7 @@ class AddonUpgradePage extends StatelessWidget {
final width = MediaQuery.of(context).size.width;
final height = MediaQuery.of(context).size.height;
final cubit = context.read<UpSalesCubit>();
-
+ final quantity = cubit.state.addOnUpgrades.firstWhere((e) => e.id == addonUpgrade.id).quantity;
return Scaffold(
backgroundColor: Theme.of(context).colorScheme.surface,
@@ -105,10 +105,10 @@ class AddonUpgradePage extends StatelessWidget {
flex: 2,
child: UpSalesBottomButton(
onAddUpSale: () {
- Navigator.pop(context, addonUpgrade.copyWith(quantity: cubit.state.addOnUpgrades.firstWhere((e) => e.id == addonUpgrade.id).quantity));
+ Navigator.pop(context, addonUpgrade.copyWith(quantity: quantity));
},
onContinue: () {
- Navigator.pop(context, addonUpgrade.copyWith(quantity: cubit.state.addOnUpgrades.firstWhere((e) => e.id == addonUpgrade.id).quantity));
+ Navigator.pop(context, addonUpgrade.copyWith(quantity: quantity));
},
selectedUpSales: cubit.state.selectedUpSales,
extrasTotalPrice: cubit.extrasTotalPrice,
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 ae40afd1..4f378b7a 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
@@ -1,17 +1,23 @@
import 'package:comwell_key_app/common/components/comwell_app_bar.dart';
+import 'package:comwell_key_app/routing/app_routes.dart';
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';
import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:go_router/go_router.dart';
class ServicesUpgradePage extends StatelessWidget {
final RoomUpgradeList roomUpgradeList;
- const ServicesUpgradePage({super.key, required this.roomUpgradeList});
+ const ServicesUpgradePage({
+ super.key,
+ required this.roomUpgradeList,
+ });
@override
Widget build(BuildContext context) {
@@ -20,12 +26,10 @@ class ServicesUpgradePage extends StatelessWidget {
final height = MediaQuery.of(context).size.height;
final isSelected = roomUpgradeList.isRoomUpgradeSelected;
- print("roomUpgradeList: ${roomUpgradeList.addOnUpgrade}");
-
return BlocBuilder<UpSalesCubit, UpSalesState>(
builder: (context, state) {
final cubit = context.read<UpSalesCubit>();
-
+
return Scaffold(
backgroundColor: Theme.of(context).colorScheme.surface,
appBar: const ComwellAppBar(),
@@ -75,7 +79,11 @@ class ServicesUpgradePage extends StatelessWidget {
children: [
Text(roomUpgradeList.addOnUpgrade?.name ?? '',
style: theme.textTheme.headlineLarge),
- Text("total_charge_value".tr(args: [roomUpgradeList.addOnUpgrade?.price.toString() ?? '0']),
+ Text(
+ "total_charge_value".tr(args: [
+ roomUpgradeList.addOnUpgrade?.price.toString() ??
+ '0'
+ ]),
style: theme.textTheme.headlineLarge),
],
),
@@ -84,8 +92,8 @@ class ServicesUpgradePage extends StatelessWidget {
width: width * 0.8,
child: Text(
roomUpgradeList.addOnUpgrade?.description ?? '',
- style: theme.textTheme.bodySmall
- ?.copyWith(color: Theme.of(context).colorScheme.onSurface),
+ style: theme.textTheme.bodySmall?.copyWith(
+ color: Theme.of(context).colorScheme.onSurface),
),
),
],
@@ -98,14 +106,26 @@ class ServicesUpgradePage extends StatelessWidget {
children: [
const Divider(color: colorDivider),
UpSalesBottomButton(
+ isSinglePurchase: roomUpgradeList.isSinglePurchase,
onAddUpSale: () {
-
- Navigator.pop(context,
- [roomUpgradeList.addOnUpgrade, isSelected]);
+ Navigator.pop(
+ context, [roomUpgradeList.addOnUpgrade, isSelected]);
+ },
+ onSinglePurchaseContinue: () {
+ if (roomUpgradeList.isSinglePurchase) {
+ cubit.addSelected(roomUpgradeList.addOnUpgrade!);
+ print("selected up sales ${cubit.state.selectedUpSales}");
+ context
+ .pushNamed(AppRoutes.upSaleConfirmation.name, extra: [
+ cubit.state.selectedUpSales.whereType<AddOnUpgrade>().toList(),
+ cubit.extrasTotalPrice,
+ roomUpgradeList.roomUpgrade
+ ]);
+ }
},
onContinue: () {
- Navigator.pop(context,
- [roomUpgradeList.addOnUpgrade, isSelected]);
+ Navigator.pop(
+ context, [roomUpgradeList.addOnUpgrade, isSelected]);
},
selectedUpSales: state.selectedUpSales,
extrasTotalPrice: cubit.extrasTotalPrice,
@@ -125,14 +145,18 @@ class ServicesUpgradePage extends StatelessWidget {
isSelected
? Text(
"-${"total_charge_value".tr(args: [
- roomUpgradeList.addOnUpgrade?.price.toString() ?? '0'
+ roomUpgradeList.addOnUpgrade?.price
+ .toString() ??
+ '0'
])}",
style: theme.textTheme.headlineSmall
?.copyWith(color: Colors.white),
)
: Text(
"+${"total_charge_value".tr(args: [
- roomUpgradeList.addOnUpgrade?.price.toString() ?? '0'
+ roomUpgradeList.addOnUpgrade?.price
+ .toString() ??
+ '0'
])}",
style: theme.textTheme.headlineSmall
?.copyWith(color: Colors.white),
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 607fe1cf..4555f604 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
@@ -3,9 +3,9 @@ import 'package:comwell_key_app/profile/utils/urls.dart';
import 'package:comwell_key_app/routing/app_routes.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.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
-import 'package:comwell_key_app/up_sales/models/upgrade.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -14,7 +14,7 @@ import 'package:slider_button/slider_button.dart';
import 'package:url_launcher/url_launcher.dart';
class UpSaleConfirmationPage extends StatelessWidget {
- final List<Upgrade> selectedUpSales;
+ final List<AddOnUpgrade> selectedUpSales;
final RoomUpgrade? selectedRoomUpgrade;
final int extrasTotalPrice;
const UpSaleConfirmationPage(
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
index 47522890..b395d837 100644
--- 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
@@ -1,21 +1,15 @@
+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/room_upgrade.dart';
-import 'package:comwell_key_app/up_sales/models/upgrade.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:go_router/go_router.dart';
import 'package:lottie/lottie.dart';
-class UpSalesProcessingPage extends StatefulWidget {
- final List<Upgrade> selectedUpSales;
- final RoomUpgrade? selectedRoomUpgrade;
- const UpSalesProcessingPage(
- {super.key,
- required this.selectedUpSales,
- required this.selectedRoomUpgrade});
+ class UpSalesProcessingPage extends StatefulWidget {
+ const UpSalesProcessingPage({super.key});
@override
State<UpSalesProcessingPage> createState() => _UpSalesProcessingPageState();
@@ -30,7 +24,6 @@ class _UpSalesProcessingPageState extends State<UpSalesProcessingPage>
void initState() {
animationController = AnimationController(vsync: this);
super.initState();
- _startConfirmation();
}
@override
@@ -39,13 +32,15 @@ class _UpSalesProcessingPageState extends State<UpSalesProcessingPage>
super.dispose();
}
- void playLoading() {
+ void playLoading(UpSalesCubit cubit) async {
loadingComposition?.playBetween(
animationController,
"spinner",
markerEnd: "success",
repeat: true,
);
+
+ print("processing state in loadinng ${cubit.state.processingState}");
}
void playError() {
@@ -62,8 +57,9 @@ class _UpSalesProcessingPageState extends State<UpSalesProcessingPage>
"success",
markerEnd: "error",
);
- await Future<void>.delayed(const Duration(seconds: 1));
+ await Future<void>.delayed(const Duration(seconds: 2));
if (mounted) {
+
Navigator.of(context).popUntil(
(route) => route.settings.name == AppRoutes.bookingDetails.name);
}
@@ -71,14 +67,15 @@ class _UpSalesProcessingPageState extends State<UpSalesProcessingPage>
Future<void> _startConfirmation() async {
// Start loading animation
- playLoading();
- await context.read<UpSalesCubit>().addUpSalesToBooking(
- widget.selectedUpSales, widget.selectedRoomUpgrade);
+
playSuccess();
}
@override
Widget build(BuildContext context) {
+ final cubit = context.read<UpSalesCubit>();
+ print("processing state ${cubit.state.processingState}");
+
return Scaffold(
body: Container(
alignment: Alignment.center,
@@ -90,7 +87,14 @@ class _UpSalesProcessingPageState extends State<UpSalesProcessingPage>
if (loadingComposition == null) {
loadingComposition = composition;
animationController.duration = composition.duration;
- playLoading();
+ switch (cubit.state.processingState) {
+ case UpSalesProcessingStateSuccess _:
+ playSuccess();
+ case UpSalesProcessingStateError _:
+ playError();
+ default:
+ playLoading(cubit);
+ }
}
},
fit: BoxFit.cover,
diff --git a/comwell_key_app/lib/up_sales/up_sales_catalog.dart b/comwell_key_app/lib/up_sales/up_sales_catalog.dart
index 6138cf6f..9dbdfc3b 100644
--- a/comwell_key_app/lib/up_sales/up_sales_catalog.dart
+++ b/comwell_key_app/lib/up_sales/up_sales_catalog.dart
@@ -58,6 +58,7 @@ class UpSalesCatalog extends StatelessWidget {
),
const SizedBox(height: 8),
ServiceCatalog(
+ booking: cubit.booking,
upSales: serviceUpgrades,
selectedUpSales: cubit.state.selectedUpSales,
onServiceSelected: (upgrade, isSelected) {
@@ -87,6 +88,7 @@ class UpSalesCatalog extends StatelessWidget {
),
const SizedBox(height: 8),
RoomUpgradeCatalog(
+ booking: cubit.booking,
availableRoomUpgrades: cubit.upSales.roomUpgrades,
selectedRoomUpgrade: cubit.state.selectedRoomUpgrade,
selectedUpSales: cubit.state.selectedUpSales,
@@ -122,6 +124,7 @@ class UpSalesCatalog extends StatelessWidget {
.whereType<AddOnUpgrade>()
.toList(),
onAddOnUpgradeSelected: (upgrade) {
+ print("onAddOnUpgradeSelected ${upgrade.quantity}");
cubit.updateAddonUpgradeQuantity(upgrade);
},
),
@@ -134,7 +137,7 @@ class UpSalesCatalog extends StatelessWidget {
bottomNavigationBar: Column(mainAxisSize: MainAxisSize.min, children: [
const Divider(color: colorDivider),
UpSalesContinueButton(
- selectedUpSales: cubit.state.selectedUpSales,
+ selectedUpSales: cubit.state.selectedUpSales.whereType<AddOnUpgrade>().toList(),
extrasTotalPrice: cubit.extrasTotalPrice,
selectedRoomUpgrade: selectedRoomUpgrade,
)
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 db938be3..12d7151d 100644
--- a/comwell_key_app/lib/up_sales/up_sales_repository.dart
+++ b/comwell_key_app/lib/up_sales/up_sales_repository.dart
@@ -15,10 +15,9 @@ class UpSalesRepository {
return response.toUpSales();
}
- Future<void> addUpSalesToBooking(String confirmationId, String hotelCode, String roomType, List<AddOnList> selectedUpSales) async {
- await api.addUpSalesToBooking(confirmationId, hotelCode, roomType, selectedUpSales);
+ Future<void> addUpSalesToBooking(String confirmationId, String hotelCode,
+ String roomType, List<AddOnList> selectedUpSales) async {
+ await api.addUpSalesToBooking(
+ confirmationId, hotelCode, roomType, selectedUpSales);
}
-
}
-
-