6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit 310d0fb0
Changed files
comwell_key_app/assets/translations/da-DK.json | 4 +- comwell_key_app/assets/translations/en-US.json | 4 +- .../ios/Runner/RunnerDebug-debugtest.entitlements | 1 + .../hotel_information/models/hotel.g.dart | 7 + .../models/structured_text.g.dart | 52 +-- .../.generated/services/models/booking_dto.g.dart | 22 ++ .../lib/.generated/services/models/room_dto.g.dart | 4 - .../.generated/up_sales/models/addon_list.g.dart | 17 + .../up_sales/models/dto/addon_upgrade_dto.g.dart | 34 ++ .../up_sales/models/dto/room_facility_dto.g.dart | 20 -- .../up_sales/models/dto/room_upgrade_dto.g.dart | 15 +- .../up_sales/models/dto/up_sales_dto.g.dart | 30 ++ .../booking_details/bloc/booking_details_bloc.dart | 26 +- .../bloc/booking_details_event.dart | 8 +- .../bloc/booking_details_state.dart | 19 +- .../lib/booking_details/booking_details_page.dart | 16 +- .../components/booking_details_bottom_sheet.dart | 53 ++- .../choose_share_room_repository.dart | 93 +----- .../choose_share_room/pages/room_info_page.dart | 13 +- .../lib/common/components/room_image_carousel.dart | 8 +- .../cubit/hotel_information_cubit.dart | 5 +- .../lib/hotel_information/models/hotel.dart | 8 +- .../hotel_information/models/structured_text.dart | 30 +- .../repository/hotel_information_repository.dart | 4 +- .../lib/login/components/create_user_button.dart | 2 +- .../lib/my_booking/my_booking_page.dart | 2 + .../components/current_bookings_tab_view.dart | 1 + comwell_key_app/lib/overview/models/booking.dart | 10 +- comwell_key_app/lib/overview/models/room.dart | 4 +- comwell_key_app/lib/overview/overview_page.dart | 2 +- .../pregistration/cubit/preregistration_cubit.dart | 117 ++++--- .../pregistration/cubit/preregistration_state.dart | 57 +--- .../pages/prereg_up_sales_catalog_page.dart | 65 ++-- .../lib/pregistration/preregistration_flow.dart | 3 +- comwell_key_app/lib/routing/app_router.dart | 173 +++++----- comwell_key_app/lib/routing/app_routes.dart | 2 +- comwell_key_app/lib/services/api.dart | 70 +++- .../lib/services/mappers/addon_item_mapper.dart | 42 +++ .../lib/services/mappers/booking_mapper.dart | 12 +- .../lib/services/mappers/room_mapper.dart | 4 +- .../lib/services/models/booking_dto.dart | 23 ++ comwell_key_app/lib/services/models/room_dto.dart | 5 +- .../lib/services/utils/api_endpoints.dart | 5 +- comwell_key_app/lib/themes/dark_theme.dart | 2 +- .../components/catalog/addon_upgrade_catalog.dart | 65 ++++ .../components/catalog/other_upgrade_catalog.dart | 72 ---- .../components/catalog/room_upgrade_catalog.dart | 79 +++++ .../components/catalog/room_uprade_catalog.dart | 79 ----- .../components/catalog/service_catalog.dart | 62 ++-- .../components/facilities_bottom_sheet.dart | 55 ++- .../up_sales/components/facility_icon_text.dart | 6 +- .../lib/up_sales/components/item_counter.dart | 11 +- .../components/up_sales_bottom_button.dart | 27 +- .../components/up_sales_catalog_button.dart | 8 +- .../components/up_sales_continue_button.dart | 65 ++++ .../components/up_sales_services_widget.dart | 22 +- .../components/up_sales_upgrades_widget.dart | 62 ++-- .../lib/up_sales/cubit/up_sales_cubit.dart | 106 +++--- .../lib/up_sales/cubit/up_sales_state.dart | 138 ++++++-- .../lib/up_sales/mappers/addon_upgrade_mapper.dart | 23 ++ .../lib/up_sales/mappers/room_facility_mapper.dart | 14 - .../lib/up_sales/mappers/room_upgrade_mapper.dart | 10 +- .../lib/up_sales/mappers/up_sales_mapper.dart | 14 + .../lib/up_sales/models/addon_list.dart | 19 ++ .../lib/up_sales/models/addon_upgrade.dart | 56 ++++ .../lib/up_sales/models/dto/addon_upgrade_dto.dart | 35 ++ .../lib/up_sales/models/dto/room_facility_dto.dart | 19 -- .../lib/up_sales/models/dto/room_upgrade_dto.dart | 18 +- .../lib/up_sales/models/dto/up_sales_dto.dart | 21 ++ .../lib/up_sales/models/room_facility.dart | 25 -- .../lib/up_sales/models/room_upgrade.dart | 45 ++- .../lib/up_sales/models/room_upgrade_extra.dart | 6 +- .../lib/up_sales/models/room_upgrade_list.dart | 12 +- comwell_key_app/lib/up_sales/models/up_sales.dart | 20 ++ comwell_key_app/lib/up_sales/models/upgrade.dart | 23 ++ .../lib/up_sales/pages/addon_upgrade_page.dart | 125 +++++++ .../lib/up_sales/pages/other_upgrade_page.dart | 121 ------- .../lib/up_sales/pages/room_upgrade_page.dart | 55 +-- .../lib/up_sales/pages/services_upgrade_page.dart | 23 +- .../up_sales/pages/up_sale_confirmation_page.dart | 53 +-- .../up_sales/pages/up_sales_processing_page.dart | 28 +- comwell_key_app/lib/up_sales/up_sales_catalog.dart | 117 +++---- .../lib/up_sales/up_sales_repository.dart | 372 +-------------------- 83 files changed, 1647 insertions(+), 1558 deletions(-)
Diff
diff --git a/comwell_key_app/assets/translations/da-DK.json b/comwell_key_app/assets/translations/da-DK.json
index a4ff3683..bba533ee 100644
--- a/comwell_key_app/assets/translations/da-DK.json
+++ b/comwell_key_app/assets/translations/da-DK.json
@@ -318,5 +318,7 @@
"force_update_description": "Der er en nødvendig opdatering til appen, der gør at du skal opdatere for at kunne fortsætte.",
"force_update_button": "Gå til App Store",
"invalid_birthday": "Ugyldig fødselsdag",
- "invalid_birthday_description": "Din gemte fødselsdag er ikke tilladt. Vælg en ny dato."
+ "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."
}
\ 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 d9ceb0b5..e9b4e446 100644
--- a/comwell_key_app/assets/translations/en-US.json
+++ b/comwell_key_app/assets/translations/en-US.json
@@ -321,5 +321,7 @@
"force_update_description": "To continue using the app, please update to the latest version.",
"force_update_button": "Go to App Store",
"invalid_birthday": "Invalid birthday",
- "invalid_birthday_description": "Your saved birthday is not allowed. Please pick a new date."
+ "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."
}
diff --git a/comwell_key_app/ios/Runner/RunnerDebug-debugtest.entitlements b/comwell_key_app/ios/Runner/RunnerDebug-debugtest.entitlements
new file mode 100644
index 00000000..0519ecba
--- /dev/null
+++ b/comwell_key_app/ios/Runner/RunnerDebug-debugtest.entitlements
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/comwell_key_app/lib/.generated/hotel_information/models/hotel.g.dart b/comwell_key_app/lib/.generated/hotel_information/models/hotel.g.dart
index 62ae9caf..690caff7 100644
--- a/comwell_key_app/lib/.generated/hotel_information/models/hotel.g.dart
+++ b/comwell_key_app/lib/.generated/hotel_information/models/hotel.g.dart
@@ -13,8 +13,12 @@ Hotel _$HotelFromJson(Map json) => Hotel(
city: json['city'] as String,
country: json['country'] as String,
image: json['image'] as String,
+ digitalCheckIn: json['digitalCheckIn'] as bool,
facilities: (json['facilities'] as List<dynamic>)
.map((e) => Facility.fromJson(Map<String, dynamic>.from(e as Map))),
+ roomTypes: (json['roomTypes'] as List<dynamic>).map((e) => e as String),
+ addonUpgrades:
+ (json['addonUpgrades'] as List<dynamic>).map((e) => e as String),
);
Map<String, dynamic> _$HotelToJson(Hotel instance) => <String, dynamic>{
@@ -24,5 +28,8 @@ Map<String, dynamic> _$HotelToJson(Hotel instance) => <String, dynamic>{
'city': instance.city,
'country': instance.country,
'image': instance.image,
+ 'digitalCheckIn': instance.digitalCheckIn,
'facilities': instance.facilities.map((e) => e.toJson()).toList(),
+ 'roomTypes': instance.roomTypes.toList(),
+ 'addonUpgrades': instance.addonUpgrades.toList(),
};
diff --git a/comwell_key_app/lib/.generated/hotel_information/models/structured_text.g.dart b/comwell_key_app/lib/.generated/hotel_information/models/structured_text.g.dart
index 2cc00123..e3363f4f 100644
--- a/comwell_key_app/lib/.generated/hotel_information/models/structured_text.g.dart
+++ b/comwell_key_app/lib/.generated/hotel_information/models/structured_text.g.dart
@@ -8,33 +8,33 @@ part of '../../../hotel_information/models/structured_text.dart';
HeaderStructuredTextModel _$HeaderStructuredTextModelFromJson(Map json) =>
HeaderStructuredTextModel(
- type: json[r'$type'] as String? ?? 'HeaderStructuredTextModel',
+ type: json['type'] as String? ?? 'HeaderStructuredTextModel',
header: json['header'] as String,
);
Map<String, dynamic> _$HeaderStructuredTextModelToJson(
HeaderStructuredTextModel instance) =>
<String, dynamic>{
- r'$type': instance.type,
+ 'type': instance.type,
'header': instance.header,
};
TextModelStructuredTextModel _$TextModelStructuredTextModelFromJson(Map json) =>
TextModelStructuredTextModel(
- type: json[r'$type'] as String? ?? 'TextModelStructuredTextModel',
+ type: json['type'] as String? ?? 'TextModelStructuredTextModel',
text: json['text'] as String,
);
Map<String, dynamic> _$TextModelStructuredTextModelToJson(
TextModelStructuredTextModel instance) =>
<String, dynamic>{
- r'$type': instance.type,
+ 'type': instance.type,
'text': instance.text,
};
AddressStructuredTextModel _$AddressStructuredTextModelFromJson(Map json) =>
AddressStructuredTextModel(
- type: json[r'$type'] as String? ?? 'AddressStructuredTextModel',
+ type: json['type'] as String? ?? 'AddressStructuredTextModel',
headline: json['headline'] as String,
address: json['address'] as String,
);
@@ -42,7 +42,7 @@ AddressStructuredTextModel _$AddressStructuredTextModelFromJson(Map json) =>
Map<String, dynamic> _$AddressStructuredTextModelToJson(
AddressStructuredTextModel instance) =>
<String, dynamic>{
- r'$type': instance.type,
+ 'type': instance.type,
'headline': instance.headline,
'address': instance.address,
};
@@ -50,7 +50,7 @@ Map<String, dynamic> _$AddressStructuredTextModelToJson(
EmailContactStructuredTextModel _$EmailContactStructuredTextModelFromJson(
Map json) =>
EmailContactStructuredTextModel(
- type: json[r'$type'] as String? ?? 'EmailContactStructuredTextModel',
+ type: json['type'] as String? ?? 'EmailContactStructuredTextModel',
headline: json['headline'] as String,
email: json['email'] as String,
);
@@ -58,7 +58,7 @@ EmailContactStructuredTextModel _$EmailContactStructuredTextModelFromJson(
Map<String, dynamic> _$EmailContactStructuredTextModelToJson(
EmailContactStructuredTextModel instance) =>
<String, dynamic>{
- r'$type': instance.type,
+ 'type': instance.type,
'headline': instance.headline,
'email': instance.email,
};
@@ -66,7 +66,7 @@ Map<String, dynamic> _$EmailContactStructuredTextModelToJson(
PhoneContactStructuredTextModel _$PhoneContactStructuredTextModelFromJson(
Map json) =>
PhoneContactStructuredTextModel(
- type: json[r'$type'] as String? ?? 'PhoneContactStructuredTextModel',
+ type: json['type'] as String? ?? 'PhoneContactStructuredTextModel',
headline: json['headline'] as String,
phoneNumber: json['phoneNumber'] as String,
);
@@ -74,7 +74,7 @@ PhoneContactStructuredTextModel _$PhoneContactStructuredTextModelFromJson(
Map<String, dynamic> _$PhoneContactStructuredTextModelToJson(
PhoneContactStructuredTextModel instance) =>
<String, dynamic>{
- r'$type': instance.type,
+ 'type': instance.type,
'headline': instance.headline,
'phoneNumber': instance.phoneNumber,
};
@@ -82,35 +82,35 @@ Map<String, dynamic> _$PhoneContactStructuredTextModelToJson(
ImageWidgetStructuredTextModel _$ImageWidgetStructuredTextModelFromJson(
Map json) =>
ImageWidgetStructuredTextModel(
- type: json[r'$type'] as String? ?? 'ImageWidgetStructuredTextModel',
+ type: json['type'] as String? ?? 'ImageWidgetStructuredTextModel',
image: json['image'] as String,
);
Map<String, dynamic> _$ImageWidgetStructuredTextModelToJson(
ImageWidgetStructuredTextModel instance) =>
<String, dynamic>{
- r'$type': instance.type,
+ 'type': instance.type,
'image': instance.image,
};
SpaBookingLinkStructuredTextModel _$SpaBookingLinkStructuredTextModelFromJson(
Map json) =>
SpaBookingLinkStructuredTextModel(
- type: json[r'$type'] as String? ?? 'SpaBookingLinkStructuredTextModel',
+ type: json['type'] as String? ?? 'SpaBookingLinkStructuredTextModel',
link: json['link'] as String,
);
Map<String, dynamic> _$SpaBookingLinkStructuredTextModelToJson(
SpaBookingLinkStructuredTextModel instance) =>
<String, dynamic>{
- r'$type': instance.type,
+ 'type': instance.type,
'link': instance.link,
};
HotelInformationListTileStructuredTextModel
_$HotelInformationListTileStructuredTextModelFromJson(Map json) =>
HotelInformationListTileStructuredTextModel(
- type: json[r'$type'] as String? ??
+ type: json['type'] as String? ??
'HotelInformationListTileStructuredTextModel',
iconPath: json['iconPath'] as String,
title: json['title'] as String,
@@ -119,7 +119,7 @@ HotelInformationListTileStructuredTextModel
Map<String, dynamic> _$HotelInformationListTileStructuredTextModelToJson(
HotelInformationListTileStructuredTextModel instance) =>
<String, dynamic>{
- r'$type': instance.type,
+ 'type': instance.type,
'iconPath': instance.iconPath,
'title': instance.title,
};
@@ -127,48 +127,48 @@ Map<String, dynamic> _$HotelInformationListTileStructuredTextModelToJson(
MapsBottomModalStructuredTextModel _$MapsBottomModalStructuredTextModelFromJson(
Map json) =>
MapsBottomModalStructuredTextModel(
- type: json[r'$type'] as String? ?? 'MapsBottomModalStructuredTextModel',
+ type: json['type'] as String? ?? 'MapsBottomModalStructuredTextModel',
address: json['address'] as String,
);
Map<String, dynamic> _$MapsBottomModalStructuredTextModelToJson(
MapsBottomModalStructuredTextModel instance) =>
<String, dynamic>{
- r'$type': instance.type,
+ 'type': instance.type,
'address': instance.address,
};
OpeningHoursStructuredTextModel _$OpeningHoursStructuredTextModelFromJson(
Map json) =>
OpeningHoursStructuredTextModel(
- type: json[r'$type'] as String? ?? 'OpeningHoursStructuredTextModel',
+ type: json['type'] as String? ?? 'OpeningHoursStructuredTextModel',
openingHours: json['openingHours'] as String,
);
Map<String, dynamic> _$OpeningHoursStructuredTextModelToJson(
OpeningHoursStructuredTextModel instance) =>
<String, dynamic>{
- r'$type': instance.type,
+ 'type': instance.type,
'openingHours': instance.openingHours,
};
PageTitleStructuredTextModel _$PageTitleStructuredTextModelFromJson(Map json) =>
PageTitleStructuredTextModel(
- type: json[r'$type'] as String? ?? 'PageTitleStructuredTextModel',
+ type: json['type'] as String? ?? 'PageTitleStructuredTextModel',
title: json['title'] as String,
);
Map<String, dynamic> _$PageTitleStructuredTextModelToJson(
PageTitleStructuredTextModel instance) =>
<String, dynamic>{
- r'$type': instance.type,
+ 'type': instance.type,
'title': instance.title,
};
PracticalInformationStructuredTextModel
_$PracticalInformationStructuredTextModelFromJson(Map json) =>
PracticalInformationStructuredTextModel(
- type: json[r'$type'] as String? ??
+ type: json['type'] as String? ??
'PracticalInformationStructuredTextModel',
restaurantId: json['restaurantId'] as String,
);
@@ -176,19 +176,19 @@ PracticalInformationStructuredTextModel
Map<String, dynamic> _$PracticalInformationStructuredTextModelToJson(
PracticalInformationStructuredTextModel instance) =>
<String, dynamic>{
- r'$type': instance.type,
+ 'type': instance.type,
'restaurantId': instance.restaurantId,
};
EmailStructuredTextModel _$EmailStructuredTextModelFromJson(Map json) =>
EmailStructuredTextModel(
- type: json[r'$type'] as String? ?? 'EmailStructuredTextModel',
+ type: json['type'] as String? ?? 'EmailStructuredTextModel',
email: json['email'] as String,
);
Map<String, dynamic> _$EmailStructuredTextModelToJson(
EmailStructuredTextModel instance) =>
<String, dynamic>{
- r'$type': instance.type,
+ 'type': instance.type,
'email': instance.email,
};
diff --git a/comwell_key_app/lib/.generated/services/models/booking_dto.g.dart b/comwell_key_app/lib/.generated/services/models/booking_dto.g.dart
index e5f80a00..59b2c35c 100644
--- a/comwell_key_app/lib/.generated/services/models/booking_dto.g.dart
+++ b/comwell_key_app/lib/.generated/services/models/booking_dto.g.dart
@@ -25,6 +25,10 @@ BookingDTO _$BookingDTOFromJson(Map json) => BookingDTO(
totalCharge: json['totalCharge'] as num?,
balance: json['balance'] as num?,
maskedCardNumber: json['maskedCardNumber'] as String?,
+ addOnItems: (json['addOnItems'] as List<dynamic>?)
+ ?.map(
+ (e) => AddOnItemDTO.fromJson(Map<String, dynamic>.from(e as Map)))
+ .toList(),
);
Map<String, dynamic> _$BookingDTOToJson(BookingDTO instance) =>
@@ -47,4 +51,22 @@ Map<String, dynamic> _$BookingDTOToJson(BookingDTO instance) =>
'totalCharge': instance.totalCharge,
'balance': instance.balance,
'maskedCardNumber': instance.maskedCardNumber,
+ 'addOnItems': instance.addOnItems?.map((e) => e.toJson()).toList(),
+ };
+
+AddOnItemDTO _$AddOnItemDTOFromJson(Map json) => AddOnItemDTO(
+ code: json['code'] as String,
+ description: json['description'] as String,
+ price: (json['price'] as num).toDouble(),
+ currency: json['currency'] as String,
+ quantity: (json['quantity'] as num).toInt(),
+ );
+
+Map<String, dynamic> _$AddOnItemDTOToJson(AddOnItemDTO instance) =>
+ <String, dynamic>{
+ 'code': instance.code,
+ 'description': instance.description,
+ 'price': instance.price,
+ 'currency': instance.currency,
+ 'quantity': instance.quantity,
};
diff --git a/comwell_key_app/lib/.generated/services/models/room_dto.g.dart b/comwell_key_app/lib/.generated/services/models/room_dto.g.dart
index 2b5496f8..b24e1378 100644
--- a/comwell_key_app/lib/.generated/services/models/room_dto.g.dart
+++ b/comwell_key_app/lib/.generated/services/models/room_dto.g.dart
@@ -15,9 +15,6 @@ RoomDto _$RoomDtoFromJson(Map json) => RoomDto(
imageAssets:
(json['imageAssets'] as List<dynamic>?)?.map((e) => e as String) ??
[],
- roomFacilities: (json['roomFacilities'] as List<dynamic>?)?.map((e) =>
- RoomFacilityDTO.fromJson(Map<String, dynamic>.from(e as Map))) ??
- [],
tags: (json['tags'] as List<dynamic>?)?.map((e) => e as String) ?? [],
);
@@ -28,6 +25,5 @@ Map<String, dynamic> _$RoomDtoToJson(RoomDto instance) => <String, dynamic>{
'description': instance.description,
'guests': instance.guests,
'imageAssets': instance.imageAssets.toList(),
- 'roomFacilities': instance.roomFacilities.map((e) => e.toJson()).toList(),
'tags': instance.tags.toList(),
};
diff --git a/comwell_key_app/lib/.generated/up_sales/models/addon_list.g.dart b/comwell_key_app/lib/.generated/up_sales/models/addon_list.g.dart
new file mode 100644
index 00000000..ee7b0f8f
--- /dev/null
+++ b/comwell_key_app/lib/.generated/up_sales/models/addon_list.g.dart
@@ -0,0 +1,17 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of '../../../up_sales/models/addon_list.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+AddOnList _$AddOnListFromJson(Map json) => AddOnList(
+ itemCode: json['itemCode'] as String,
+ quantity: (json['quantity'] as num).toInt(),
+ );
+
+Map<String, dynamic> _$AddOnListToJson(AddOnList instance) => <String, dynamic>{
+ 'itemCode': instance.itemCode,
+ 'quantity': instance.quantity,
+ };
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
new file mode 100644
index 00000000..11780278
--- /dev/null
+++ b/comwell_key_app/lib/.generated/up_sales/models/dto/addon_upgrade_dto.g.dart
@@ -0,0 +1,34 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of '../../../../up_sales/models/dto/addon_upgrade_dto.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+AddOnUpgradeDTO _$AddOnUpgradeDTOFromJson(Map json) => AddOnUpgradeDTO(
+ id: json['id'] as String,
+ name: json['name'] as String,
+ price: (json['price'] as num).toInt(),
+ currency: json['currency'] as String,
+ isSelected: json['isSelected'] as bool,
+ 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(),
+ isService: json['isService'] as bool? ?? false,
+ );
+
+Map<String, dynamic> _$AddOnUpgradeDTOToJson(AddOnUpgradeDTO instance) =>
+ <String, dynamic>{
+ 'id': instance.id,
+ 'name': instance.name,
+ 'price': instance.price,
+ 'currency': instance.currency,
+ 'isSelected': instance.isSelected,
+ 'images': instance.images.toList(),
+ 'description': instance.description,
+ 'tags': instance.tags.toList(),
+ 'quantity': instance.quantity,
+ 'isService': instance.isService,
+ };
diff --git a/comwell_key_app/lib/.generated/up_sales/models/dto/room_facility_dto.g.dart b/comwell_key_app/lib/.generated/up_sales/models/dto/room_facility_dto.g.dart
deleted file mode 100644
index b31829b2..00000000
--- a/comwell_key_app/lib/.generated/up_sales/models/dto/room_facility_dto.g.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of '../../../../up_sales/models/dto/room_facility_dto.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-RoomFacilityDTO _$RoomFacilityDTOFromJson(Map json) => RoomFacilityDTO(
- name: json['name'] as String,
- icon: json['icon'] as String,
- facilityType: json['facilityType'] as String,
- );
-
-Map<String, dynamic> _$RoomFacilityDTOToJson(RoomFacilityDTO instance) =>
- <String, dynamic>{
- 'name': instance.name,
- 'icon': instance.icon,
- 'facilityType': instance.facilityType,
- };
diff --git a/comwell_key_app/lib/.generated/up_sales/models/dto/room_upgrade_dto.g.dart b/comwell_key_app/lib/.generated/up_sales/models/dto/room_upgrade_dto.g.dart
index 0c82106a..ccaf58a4 100644
--- a/comwell_key_app/lib/.generated/up_sales/models/dto/room_upgrade_dto.g.dart
+++ b/comwell_key_app/lib/.generated/up_sales/models/dto/room_upgrade_dto.g.dart
@@ -7,25 +7,24 @@ part of '../../../../up_sales/models/dto/room_upgrade_dto.dart';
// **************************************************************************
RoomUpgradeDTO _$RoomUpgradeDTOFromJson(Map json) => RoomUpgradeDTO(
+ id: json['id'] as String,
name: json['name'] as String,
- price: json['price'] as String,
+ price: (json['price'] as num).toInt(),
images: (json['images'] as List<dynamic>).map((e) => e as String),
description: json['description'] as String,
- id: json['id'] as String,
tags: (json['tags'] as List<dynamic>).map((e) => e as String),
- facilities: (json['facilities'] as List<dynamic>).map(
- (e) => RoomFacilityDTO.fromJson(Map<String, dynamic>.from(e as Map))),
- type: json['type'] as String,
+ currency: json['currency'] as String,
+ quantity: (json['quantity'] as num?)?.toInt(),
);
Map<String, dynamic> _$RoomUpgradeDTOToJson(RoomUpgradeDTO instance) =>
<String, dynamic>{
+ 'id': instance.id,
'name': instance.name,
'price': instance.price,
+ 'currency': instance.currency,
'images': instance.images.toList(),
'description': instance.description,
- 'id': instance.id,
'tags': instance.tags.toList(),
- 'facilities': instance.facilities.map((e) => e.toJson()).toList(),
- 'type': instance.type,
+ 'quantity': instance.quantity,
};
diff --git a/comwell_key_app/lib/.generated/up_sales/models/dto/up_sales_dto.g.dart b/comwell_key_app/lib/.generated/up_sales/models/dto/up_sales_dto.g.dart
new file mode 100644
index 00000000..d5b89870
--- /dev/null
+++ b/comwell_key_app/lib/.generated/up_sales/models/dto/up_sales_dto.g.dart
@@ -0,0 +1,30 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of '../../../../up_sales/models/dto/up_sales_dto.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+UpSalesDTO _$UpSalesDTOFromJson(Map json) => UpSalesDTO(
+ property: json['property'] as String,
+ confirmationNumber: json['confirmationNumber'] as String,
+ roomUpgrades: (json['roomUpgrades'] as List<dynamic>?)
+ ?.map((e) =>
+ RoomUpgradeDTO.fromJson(Map<String, dynamic>.from(e as Map)))
+ .toList() ??
+ [],
+ addOnUpgrades: (json['addonUpgrades'] as List<dynamic>?)
+ ?.map((e) =>
+ AddOnUpgradeDTO.fromJson(Map<String, dynamic>.from(e as Map)))
+ .toList() ??
+ [],
+ );
+
+Map<String, dynamic> _$UpSalesDTOToJson(UpSalesDTO instance) =>
+ <String, dynamic>{
+ 'property': instance.property,
+ 'confirmationNumber': instance.confirmationNumber,
+ 'roomUpgrades': instance.roomUpgrades.map((e) => e.toJson()).toList(),
+ 'addonUpgrades': instance.addOnUpgrades.map((e) => e.toJson()).toList(),
+ };
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 01da86e3..f0d5c1b4 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,10 +1,13 @@
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';
import 'package:comwell_key_app/utils/seos_repository.dart';
import 'package:equatable/equatable.dart';
@@ -29,7 +32,7 @@ class BookingDetailsBloc
final SeosRepository seosRepository = locator<SeosRepository>();
Duration _remainingTime = Duration.zero;
final UpSalesRepository upSaleRepository;
- List<RoomUpgrade> upSales = [];
+ UpSales? upSales;
BookingDetailsBloc(
@@ -41,13 +44,15 @@ class BookingDetailsBloc
on<InitialEvent>((event, emit) async {
try {
emit(state.loading());
- _startTimer();
+
+ add(StartTimerEvent());
add(CheckIfHouseKeepingOrdered());
add(CheckMobileKeys());
- //add(GetBookingDetailsEvent(booking.confirmationId));
+ add(GetBookingDetailsEvent(booking.confirmationId));
add(GetUserEvent());
+ add(GetUpSalesEvent());
add(UpdateRemainingEvent(getCheckInTime().difference(DateTime.now())));
- add(GetUpSalesEvent(upSales));
+
} catch (e, st) {
if (kDebugMode) print("err=$e, $st");
@@ -55,6 +60,10 @@ class BookingDetailsBloc
}
});
+ on<StartTimerEvent>((event, emit) async {
+ _startTimer();
+ });
+
on<GetUpSalesEvent>((event, emit) async {
await getUpSales(emit);
emit(state.main());
@@ -87,8 +96,11 @@ class BookingDetailsBloc
}
Future<void> getUpSales(Emitter<BookingDetailsState> emit) async {
- upSales = await upSaleRepository.getMockUpSales();
- emit(state.getUpSales(upSales));
+ upSales = await upSaleRepository.getUpSales(booking.confirmationId, booking.hotelCode);
+
+ if (upSales != null) {
+ emit(state.getUpSales(upSales!));
+ }
}
Future<Booking> getBookingDetails(
@@ -97,7 +109,7 @@ class BookingDetailsBloc
final bookingDetails =
await profileRepository.getBookingDetails(bookingId);
booking = bookingDetails;
- emit(state.copyWith(status: BookingDetailsStatus.main));
+
return bookingDetails;
} catch (e) {
if (kDebugMode) print("err=$e");
diff --git a/comwell_key_app/lib/booking_details/bloc/booking_details_event.dart b/comwell_key_app/lib/booking_details/bloc/booking_details_event.dart
index 2b386a8c..8230291d 100644
--- a/comwell_key_app/lib/booking_details/bloc/booking_details_event.dart
+++ b/comwell_key_app/lib/booking_details/bloc/booking_details_event.dart
@@ -10,12 +10,6 @@ sealed class BookingDetailsEvent extends Equatable {
final class InitialEvent extends BookingDetailsEvent {}
final class GetUpSalesEvent extends BookingDetailsEvent {
- final List<RoomUpgrade> upSales;
-
- const GetUpSalesEvent(this.upSales);
-
- @override
- List<Object> get props => [upSales];
}
final class CheckIfHouseKeepingOrdered extends BookingDetailsEvent {}
@@ -29,6 +23,8 @@ final class GetBookingDetailsEvent extends BookingDetailsEvent {
List<Object> get props => [bookingId];
}
+final class StartTimerEvent extends BookingDetailsEvent {}
+
final class GetUserEvent extends BookingDetailsEvent {}
final class CheckMobileKeys extends BookingDetailsEvent {}
diff --git a/comwell_key_app/lib/booking_details/bloc/booking_details_state.dart b/comwell_key_app/lib/booking_details/bloc/booking_details_state.dart
index 54789e66..2da1b76a 100644
--- a/comwell_key_app/lib/booking_details/bloc/booking_details_state.dart
+++ b/comwell_key_app/lib/booking_details/bloc/booking_details_state.dart
@@ -8,7 +8,8 @@ class BookingDetailsState extends Equatable {
final Iterable<Guest> guests;
final Duration remainingTime;
final bool isLoading;
- final List<RoomUpgrade> upSales;
+ final UpSales? upSales;
+ final List<Upgrade> selectedUpSales;
const BookingDetailsState._(
{required this.status,
required this.key,
@@ -17,7 +18,8 @@ class BookingDetailsState extends Equatable {
required this.guests,
required this.remainingTime,
required this.isLoading,
- required this.upSales});
+ this.upSales,
+ required this.selectedUpSales});
BookingDetailsState.initial(Booking booking)
: this._(
@@ -28,7 +30,8 @@ class BookingDetailsState extends Equatable {
guests: booking.guests,
remainingTime: Duration.zero,
isLoading: false,
- upSales: []);
+ upSales: null,
+ selectedUpSales: []);
BookingDetailsState setupError() =>
copyWith(status: BookingDetailsStatus.setupError);
BookingDetailsState updateKeys(List<MobileKeysKey> keys) =>
@@ -41,10 +44,10 @@ class BookingDetailsState extends Equatable {
BookingDetailsState loading() => copyWith(status: BookingDetailsStatus.loading);
BookingDetailsState updateRemainingTime(Duration remainingTime) => copyWith(remainingTime: remainingTime);
BookingDetailsState main() => copyWith(status: BookingDetailsStatus.main);
- BookingDetailsState getUpSales(List<RoomUpgrade> upSales) => copyWith(upSales: upSales);
+ BookingDetailsState getUpSales(UpSales upSales) => copyWith(upSales: upSales);
@override
- List<Object?> get props => [status, guests, isLoading, remainingTime];
+ List<Object?> get props => [status, guests, isLoading, remainingTime, upSales];
BookingDetailsState copyWith({
BookingDetailsStatus? status,
@@ -54,7 +57,8 @@ class BookingDetailsState extends Equatable {
Iterable<Guest>? guests,
bool? isLoading,
Duration? remainingTime,
- List<RoomUpgrade>? upSales,
+ UpSales? upSales,
+ List<Upgrade>? selectedUpSales,
}) {
return BookingDetailsState._(
status: status ?? this.status,
@@ -66,12 +70,13 @@ class BookingDetailsState extends Equatable {
isLoading: isLoading ?? this.isLoading,
remainingTime: remainingTime ?? this.remainingTime,
upSales: upSales ?? this.upSales,
+ selectedUpSales: selectedUpSales ?? this.selectedUpSales
);
}
@override
String toString() {
- return "BookingDetailsState(status=$status, key=$key, keys=$keys, isHouseKeepingOrdered=$isHouseKeepingOrdered, isLoading=$isLoading)";
+ return "BookingDetailsState(status=$status, key=$key, keys=$keys, isHouseKeepingOrdered=$isHouseKeepingOrdered, isLoading=$isLoading, upSales=$upSales)";
}
}
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 c5f0d0f4..768b744c 100644
--- a/comwell_key_app/lib/booking_details/booking_details_page.dart
+++ b/comwell_key_app/lib/booking_details/booking_details_page.dart
@@ -14,7 +14,7 @@ import 'package:go_router/go_router.dart';
import 'bloc/booking_details_bloc.dart';
import 'components/unlock_room_button.dart';
-
+
class BookingDetailsPage extends StatelessWidget {
const BookingDetailsPage({super.key});
@@ -23,21 +23,21 @@ class BookingDetailsPage extends StatelessWidget {
return BlocConsumer<BookingDetailsBloc, BookingDetailsState>(
listener: (context, state) {},
builder: (context, state) {
-
final cubit = context.read<BookingDetailsBloc>();
if (state.status == BookingDetailsStatus.initial) {
cubit.add(InitialEvent());
- //cubit.add(GetBookingDetailsEvent(cubit.booking.confirmationId));
+ // cubit.add(GetBookingDetailsEvent(cubit.booking.confirmationId));
}
-
+ print(cubit.booking);
return Scaffold(
extendBodyBehindAppBar: true,
- backgroundColor: Colors.transparent,
+ backgroundColor: Colors.white,
appBar: const ComwellAppBar(),
body: Builder(
builder: (context) {
if (state.status == BookingDetailsStatus.loading) {
+ print('loading');
return const Center(
child: BookingDetailsShimmerLoader(),
);
@@ -96,9 +96,11 @@ class BookingDetailsPage extends StatelessWidget {
const SizedBox(height: 10),
if (state.keys.isNotEmpty && cubit.booking.roomNumber != '')
const UnlockRoomButton()
- else if (cubit.booking.reservationStatus == ReservationStatus.preregistered)
+ else if (cubit.booking.reservationStatus ==
+ ReservationStatus.preregistered)
const CheckInButtonTimer()
- else if (cubit.booking.reservationStatus == ReservationStatus.newreservation)
+ else if (cubit.booking.reservationStatus ==
+ ReservationStatus.newreservation)
const PreregisterButton()
else
const SizedBox(),
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 88f8e6a2..6e952adb 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
@@ -24,7 +24,8 @@ class BookingDetailsBottomSheet extends StatelessWidget {
return BottomSheetWidget(
widgetChildren: [
const SizedBox(height: 16),
- cubit.booking.reservationStatus == ReservationStatus.checkedin && cubit.getCheckOutTime().isBefore(DateTime.now())
+ cubit.booking.reservationStatus == ReservationStatus.checkedin &&
+ cubit.getCheckOutTime().isBefore(DateTime.now())
? const Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: CheckOutButton(),
@@ -80,18 +81,20 @@ class BookingDetailsBottomSheet extends StatelessWidget {
]),
const SizedBox(height: 16),
if (cubit.booking.roomNumber != '')
- Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Text('rooms'.tr(), style: theme.textTheme.headlineMedium),
- ),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Text('rooms'.tr(), style: theme.textTheme.headlineMedium),
+ ),
const SizedBox(height: 16),
if (state.keys.isNotEmpty)
- Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Text('room_keys'.tr(), style: theme.textTheme.headlineMedium),
- ),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child:
+ Text('room_keys'.tr(), style: theme.textTheme.headlineMedium),
+ ),
const SizedBox(height: 16),
- cubit.booking.reservationStatus == ReservationStatus.checkedin && cubit.isHouseKeepingTime
+ cubit.booking.reservationStatus == ReservationStatus.checkedin &&
+ cubit.isHouseKeepingTime
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -119,9 +122,12 @@ class BookingDetailsBottomSheet extends StatelessWidget {
ReservationStatus reservationStatus, BuildContext context) {
switch (reservationStatus) {
case ReservationStatus.checkedin:
- return const Padding(
- padding: EdgeInsets.symmetric(horizontal: 16.0),
- child: UpSalesCatalogButton(),
+ return Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16.0),
+ child: cubit.upSales != null
+ ? UpSalesCatalogButton(
+ upSales: cubit.upSales!, booking: cubit.booking)
+ : const SizedBox(),
);
case ReservationStatus.newreservation:
return _buildServices(context);
@@ -154,17 +160,28 @@ class BookingDetailsBottomSheet extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 16),
child: OutlinedPillButton(
text: 'up_sales_see_all'.tr(),
- onTap: () {
- context.pushNamed(AppRoutes.upSalesCatalog.name);
+ onTap: () async {
+ await context.pushNamed(AppRoutes.upSalesCatalog.name,
+ extra: [cubit.upSales, cubit.booking]);
+ cubit.add(InitialEvent());
},
),
),
],
),
const SizedBox(height: 16),
- ServiceCatalog(
- upSales: cubit.upSales, height: 252, showRadioButton: false,
- ),
+ if (cubit.upSales != null)
+ ServiceCatalog(
+ upSales: cubit.upSales!.addOnUpgrades,
+ height: 252,
+ selectedUpSales: cubit.state.selectedUpSales,
+ showRadioButton: false,
+ onTap: (upgrade) {
+ // No OP
+ },
+ onServiceSelected: (upgrade, isSelected) {
+ // No OP
+ }),
],
);
}
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 4b3df905..a6680737 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,7 @@
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/room_facility_dto.dart';
+import 'package:comwell_key_app/up_sales/models/dto/addon_upgrade_dto.dart';
class ChooseShareRoomRepository {
String baseUrl;
@@ -33,20 +33,7 @@ class ChooseShareRoomRepository {
'assets/images/current_room.png'
],
tags: ['34'],
- roomFacilities: [
- RoomFacilityDTO(
- name: '1x dobbelseng',
- icon: 'assets/icons/ic_double_bed.svg',
- facilityType: 'Bed'),
- RoomFacilityDTO(
- name: 'TV',
- icon: 'assets/icons/ic_tv.svg',
- facilityType: 'Electronics'),
- RoomFacilityDTO(
- name: 'Gratis WiFi',
- icon: 'assets/icons/ic_wifi.svg',
- facilityType: 'Electronics'),
- ],
+
),
RoomDto(
confirmationNumber: 'CONF002',
@@ -57,24 +44,7 @@ class ChooseShareRoomRepository {
guests: 2,
imageAssets: ['assets/images/no_current_bookings_background.jpeg'],
tags: ['27'],
- roomFacilities: [
- RoomFacilityDTO(
- name: '2x dobbelseng',
- icon: 'assets/icons/ic_double_bed.svg',
- facilityType: 'Bed'),
- RoomFacilityDTO(
- name: 'Badekar',
- icon: 'assets/icons/ic_bathtub.svg',
- facilityType: 'Bathroom'),
- RoomFacilityDTO(
- name: 'Terrasse',
- icon: 'assets/icons/ic_balcony.svg',
- facilityType: 'Room'),
- RoomFacilityDTO(
- name: 'Minibar',
- icon: 'assets/icons/ic_minibar.svg',
- facilityType: 'Room'),
- ],
+
),
RoomDto(
confirmationNumber: 'CONF003',
@@ -85,28 +55,7 @@ class ChooseShareRoomRepository {
guests: 2,
imageAssets: ['assets/images/current_room.png'],
tags: ['45'],
- roomFacilities: [
- RoomFacilityDTO(
- name: '1x enkelseng',
- icon: 'assets/icons/ic_single_bed.svg',
- facilityType: 'Bed'),
- RoomFacilityDTO(
- name: 'Stue',
- icon: 'assets/icons/ic_leather_chair.svg',
- facilityType: 'Room'),
- RoomFacilityDTO(
- name: 'Hårtørrer',
- icon: 'assets/icons/ic_hairdryer.svg',
- facilityType: 'Bathroom'),
- RoomFacilityDTO(
- name: 'Arbejdsplads',
- icon: 'assets/icons/ic_desk.svg',
- facilityType: 'Business'),
- RoomFacilityDTO(
- name: 'Roomservice',
- icon: 'assets/icons/ic_service_bowl.svg',
- facilityType: 'Service'),
- ],
+
),
RoomDto(
confirmationNumber: 'CONF004',
@@ -117,24 +66,7 @@ class ChooseShareRoomRepository {
guests: 2,
imageAssets: ['assets/images/login_screen_background.png'],
tags: ['45'],
- roomFacilities: [
- RoomFacilityDTO(
- name: '2x dobbelseng',
- icon: 'assets/icons/ic_double_bed.svg',
- facilityType: 'Bed'),
- RoomFacilityDTO(
- name: 'TV',
- icon: 'assets/icons/ic_tv.svg',
- facilityType: 'Electronics'),
- RoomFacilityDTO(
- name: 'Gratis WiFi',
- icon: 'assets/icons/ic_wifi.svg',
- facilityType: 'Electronics'),
- RoomFacilityDTO(
- name: 'Arbejdsplads',
- icon: 'assets/icons/ic_desk.svg',
- facilityType: 'Business'),
- ],
+
),
RoomDto(
confirmationNumber: 'CONF005',
@@ -145,20 +77,7 @@ class ChooseShareRoomRepository {
guests: 2,
imageAssets: ['assets/images/login_screen_background.png'],
tags: ['32'],
- roomFacilities: [
- RoomFacilityDTO(
- name: '2x enkelseng',
- icon: 'assets/icons/ic_single_bed.svg',
- facilityType: 'Bed'),
- RoomFacilityDTO(
- name: 'Minibar',
- icon: 'assets/icons/ic_minibar.svg',
- facilityType: 'Room'),
- RoomFacilityDTO(
- name: 'Strygejern & -bræt',
- icon: 'assets/icons/ic_iron.svg',
- facilityType: 'Room'),
- ],
+
),
];
}
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 1218e88e..12c3861f 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
@@ -7,12 +7,13 @@ import 'package:comwell_key_app/routing/app_routes.dart';
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/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/room_facility.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';
@@ -37,7 +38,7 @@ class _RoomInfoPageState extends State<RoomInfoPage> {
.toList(); // Use booking image
final room =
widget.booking.rooms.isNotEmpty ? widget.booking.rooms.first : null;
- final facilities = room?.roomFacilities.toList() ?? <RoomFacility>[];
+ final facilities = room?.roomFacilities.toList() ?? <AddOnUpgrade>[];
final hasFacilities = facilities.isNotEmpty;
final description = room?.description ?? '';
final height = MediaQuery.of(context).size.height;
@@ -121,7 +122,7 @@ class _RoomInfoPageState extends State<RoomInfoPage> {
runSpacing: 8,
children: [
...facilities.map((f) => FacilityIconText(
- facility: f, showDivider: true)),
+ facility: f as AddOnUpgrade, showDivider: true)),
GestureDetector(
onTap: () =>
_showFacilitiesSheet(context, facilities),
@@ -193,7 +194,7 @@ class _RoomInfoPageState extends State<RoomInfoPage> {
}
void _showFacilitiesSheet(
- BuildContext context, List<RoomFacility> facilities) {
+ BuildContext context, List<Upgrade> facilities) {
final height = MediaQuery.of(context).size.height;
showModalBottomSheet<void>(
context: context,
@@ -207,7 +208,9 @@ class _RoomInfoPageState extends State<RoomInfoPage> {
constraints: BoxConstraints(
maxHeight: height - kComwellAppBarHeight,
),
- child: FacilitiesBottomSheet(facilities: facilities),
+ child: FacilitiesBottomSheet(
+ tags: facilities.map((f) => f.tags).expand((tags) => tags).toList(),
+ ),
);
},
);
diff --git a/comwell_key_app/lib/common/components/room_image_carousel.dart b/comwell_key_app/lib/common/components/room_image_carousel.dart
index 74da843a..3829fede 100644
--- a/comwell_key_app/lib/common/components/room_image_carousel.dart
+++ b/comwell_key_app/lib/common/components/room_image_carousel.dart
@@ -1,3 +1,4 @@
+import 'package:comwell_key_app/common/const.dart';
import 'package:flutter/material.dart';
class RoomImageCarousel extends StatefulWidget {
@@ -41,13 +42,16 @@ class _RoomImageCarouselState extends State<RoomImageCarousel> {
},
itemCount: widget.images.length,
itemBuilder: (context, index) {
- return Image.asset(
+ return Image.network(
widget.images[index],
fit: BoxFit.cover,
+ errorBuilder: (context, error, stackTrace) {
+ return Image.asset(kPlaceholderImage, fit: BoxFit.cover);
+ },
);
},
),
- // This snippet conditionally displays a left arrow button for the image carousel only if
+ // This snippet conditionally displays a left arrow button for the image carousel only if
// there is more than one image and the currently displayed image is not the first one.
if (widget.images.length > 1 && _currentPage > 0)
Positioned(
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 9e89f8ab..53077fac 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
@@ -14,18 +14,17 @@ class HotelInformationCubit extends Cubit<HotelInformationState> {
final api = Api();
final HotelInformationRepository hotelInformationRepository;
late final Hotel hotel;
- final Locale culture;
final Booking booking;
HotelInformationCubit(
- {required this.hotelInformationRepository, required this.booking, required this.culture})
+ {required this.hotelInformationRepository, required this.booking})
: super(const HotelInformationState.initial());
void init() async {
emit(state.hotelLoading());
try {
hotel = await hotelInformationRepository
- .fetchHotelInformation(booking.hotelCode, culture);
+ .fetchHotelInformation(booking.hotelCode);
emit(state.hotelSuccess());
} catch (e) {
diff --git a/comwell_key_app/lib/hotel_information/models/hotel.dart b/comwell_key_app/lib/hotel_information/models/hotel.dart
index 1a27b168..98cf397c 100644
--- a/comwell_key_app/lib/hotel_information/models/hotel.dart
+++ b/comwell_key_app/lib/hotel_information/models/hotel.dart
@@ -12,7 +12,10 @@ class Hotel {
final String city;
final String country;
final String image;
+ final bool digitalCheckIn;
final Iterable<Facility> facilities;
+ final Iterable<String> roomTypes;
+ final Iterable<String> addonUpgrades;
Hotel({
required this.hotelCode,
@@ -21,7 +24,10 @@ class Hotel {
required this.city,
required this.country,
required this.image,
+ required this.digitalCheckIn,
required this.facilities,
+ required this.roomTypes,
+ required this.addonUpgrades,
});
factory Hotel.fromJson(Json json) => _$HotelFromJson(json);
@@ -30,7 +36,7 @@ class Hotel {
@override
String toString() {
- return "Hotel(hotelCode: $hotelCode, hotelName: $hotelName, address: $address, city: $city, country: $country, image: $image, facilities: $facilities)";
+ return "Hotel(hotelCode: $hotelCode, hotelName: $hotelName, address: $address, city: $city, country: $country, image: $image, digitalCheckIn: $digitalCheckIn, facilities: $facilities)";
}
}
diff --git a/comwell_key_app/lib/hotel_information/models/structured_text.dart b/comwell_key_app/lib/hotel_information/models/structured_text.dart
index 2505f3b2..7524dff8 100644
--- a/comwell_key_app/lib/hotel_information/models/structured_text.dart
+++ b/comwell_key_app/lib/hotel_information/models/structured_text.dart
@@ -5,7 +5,7 @@ part '../../.generated/hotel_information/models/structured_text.g.dart';
sealed class StructuredTextBlock {
factory StructuredTextBlock.fromJson(Json json) {
- switch (json['\$type'] as String) {
+ switch (json['type'] as String) {
case 'HeaderStructuredTextModel':
return HeaderStructuredTextModel.fromJson(json);
case 'TextModelStructuredTextModel':
@@ -33,7 +33,7 @@ sealed class StructuredTextBlock {
case 'EmailStructuredTextModel':
return EmailStructuredTextModel.fromJson(json);
default:
- throw Exception('Unknown StructuredTextBlock type: \'${json['\$type']}\'');
+ throw Exception('Unknown StructuredTextBlock type: \'${json['type']}\'');
}
}
Json toJson();
@@ -41,7 +41,7 @@ sealed class StructuredTextBlock {
@JsonSerializable()
class HeaderStructuredTextModel implements StructuredTextBlock {
- @JsonKey(name: '\$type')
+ @JsonKey(name: 'type')
final String type;
final String header;
@@ -62,7 +62,7 @@ class HeaderStructuredTextModel implements StructuredTextBlock {
@JsonSerializable()
class TextModelStructuredTextModel implements StructuredTextBlock {
- @JsonKey(name: '\$type')
+ @JsonKey(name: 'type')
final String type;
final String text;
@@ -83,7 +83,7 @@ class TextModelStructuredTextModel implements StructuredTextBlock {
@JsonSerializable()
class AddressStructuredTextModel implements StructuredTextBlock {
- @JsonKey(name: '\$type')
+ @JsonKey(name: 'type')
final String type;
final String headline;
final String address;
@@ -106,7 +106,7 @@ class AddressStructuredTextModel implements StructuredTextBlock {
@JsonSerializable()
class EmailContactStructuredTextModel implements StructuredTextBlock {
- @JsonKey(name: '\$type')
+ @JsonKey(name: 'type')
final String type;
final String headline;
final String email;
@@ -129,7 +129,7 @@ class EmailContactStructuredTextModel implements StructuredTextBlock {
@JsonSerializable()
class PhoneContactStructuredTextModel implements StructuredTextBlock {
- @JsonKey(name: '\$type')
+ @JsonKey(name: 'type')
final String type;
final String headline;
final String phoneNumber;
@@ -152,7 +152,7 @@ class PhoneContactStructuredTextModel implements StructuredTextBlock {
@JsonSerializable()
class ImageWidgetStructuredTextModel implements StructuredTextBlock {
- @JsonKey(name: '\$type')
+ @JsonKey(name: 'type')
final String type;
final String image;
@@ -171,7 +171,7 @@ class ImageWidgetStructuredTextModel implements StructuredTextBlock {
@JsonSerializable()
class SpaBookingLinkStructuredTextModel implements StructuredTextBlock {
- @JsonKey(name: '\$type')
+ @JsonKey(name: 'type')
final String type;
final String link;
@@ -190,7 +190,7 @@ class SpaBookingLinkStructuredTextModel implements StructuredTextBlock {
@JsonSerializable()
class HotelInformationListTileStructuredTextModel implements StructuredTextBlock {
- @JsonKey(name: '\$type')
+ @JsonKey(name: 'type')
final String type;
final String iconPath;
final String title;
@@ -211,7 +211,7 @@ class HotelInformationListTileStructuredTextModel implements StructuredTextBlock
@JsonSerializable()
class MapsBottomModalStructuredTextModel implements StructuredTextBlock {
- @JsonKey(name: '\$type')
+ @JsonKey(name: 'type')
final String type;
final String address;
@@ -230,7 +230,7 @@ class MapsBottomModalStructuredTextModel implements StructuredTextBlock {
@JsonSerializable()
class OpeningHoursStructuredTextModel implements StructuredTextBlock {
- @JsonKey(name: '\$type')
+ @JsonKey(name: 'type')
final String type;
final String openingHours;
@@ -249,7 +249,7 @@ class OpeningHoursStructuredTextModel implements StructuredTextBlock {
@JsonSerializable()
class PageTitleStructuredTextModel implements StructuredTextBlock {
- @JsonKey(name: '\$type')
+ @JsonKey(name: 'type')
final String type;
final String title;
@@ -268,7 +268,7 @@ class PageTitleStructuredTextModel implements StructuredTextBlock {
@JsonSerializable()
class PracticalInformationStructuredTextModel implements StructuredTextBlock {
- @JsonKey(name: '\$type')
+ @JsonKey(name: 'type')
final String type;
final String restaurantId;
@@ -287,7 +287,7 @@ class PracticalInformationStructuredTextModel implements StructuredTextBlock {
@JsonSerializable()
class EmailStructuredTextModel implements StructuredTextBlock {
- @JsonKey(name: '\$type')
+ @JsonKey(name: 'type')
final String type;
final String email;
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 14e7ac3c..6880dfe7 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
@@ -7,9 +7,9 @@ import 'package:comwell_key_app/utils/json.dart';
class HotelInformationRepository {
final api = Api();
- Future<Hotel> fetchHotelInformation(String hotelCode, Locale culture) async {
+ Future<Hotel> fetchHotelInformation(String hotelCode) async {
try {
- final response = await api.getHotelInfo(hotelCode, culture);
+ final response = await api.getHotelInfo(hotelCode);
final data = response.data as Json;
final hotelInfo = Hotel.fromJson(data);
return hotelInfo;
diff --git a/comwell_key_app/lib/login/components/create_user_button.dart b/comwell_key_app/lib/login/components/create_user_button.dart
index 69702b55..57311cd3 100644
--- a/comwell_key_app/lib/login/components/create_user_button.dart
+++ b/comwell_key_app/lib/login/components/create_user_button.dart
@@ -21,7 +21,7 @@ class CreateUserButton extends StatelessWidget {
},
child: Text(
'create_user_button'.tr(),
- style: TextStyle(color: Theme.of(context).colorScheme.surface, fontSize: 16, fontWeight: FontWeight.w600, backgroundColor: Colors.transparents),
+ style: TextStyle(color: Theme.of(context).colorScheme.surface, fontSize: 16, fontWeight: FontWeight.w600, backgroundColor: Colors.transparent),
),
);
}
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 93bdd231..e481cab0 100644
--- a/comwell_key_app/lib/my_booking/my_booking_page.dart
+++ b/comwell_key_app/lib/my_booking/my_booking_page.dart
@@ -6,6 +6,7 @@ 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';
@@ -201,6 +202,7 @@ class MyBookingPage extends StatelessWidget {
child: BlocProvider(
create: (context) => BookingDetailsBloc(
booking,
+
bookingDetailsRepository: locator<BookingDetailsRepository>(),
profileRepository: locator<ProfileRepository>(),
upSaleRepository: locator<UpSalesRepository>(),
diff --git a/comwell_key_app/lib/overview/components/current_bookings_tab_view.dart b/comwell_key_app/lib/overview/components/current_bookings_tab_view.dart
index 7702b2a2..4ffb05b9 100644
--- a/comwell_key_app/lib/overview/components/current_bookings_tab_view.dart
+++ b/comwell_key_app/lib/overview/components/current_bookings_tab_view.dart
@@ -97,6 +97,7 @@ class CurrentBookingsTabView extends StatelessWidget {
itemCount: bookings.length,
itemBuilder: (context, index) {
final booking = bookings.elementAt(index);
+
return Column(
children: [
CurrentBookingListItem(booking: booking),
diff --git a/comwell_key_app/lib/overview/models/booking.dart b/comwell_key_app/lib/overview/models/booking.dart
index 7b889ebf..24e647f5 100644
--- a/comwell_key_app/lib/overview/models/booking.dart
+++ b/comwell_key_app/lib/overview/models/booking.dart
@@ -1,6 +1,7 @@
import 'package:comwell_key_app/overview/models/guest.dart';
import 'package:comwell_key_app/overview/models/payment_details.dart';
import 'package:comwell_key_app/overview/models/room.dart';
+import 'package:comwell_key_app/up_sales/models/upgrade.dart';
import 'package:equatable/equatable.dart';
class Booking extends Equatable {
@@ -25,7 +26,8 @@ class Booking extends Equatable {
final num? balance;
final String? maskedCardNumber;
final List<Room> rooms;
-
+ final List<Upgrade>? addOnItems;
+
Booking({
required this.id,
required this.confirmationId,
@@ -48,6 +50,7 @@ class Booking extends Equatable {
required this.maskedCardNumber,
required this.rooms,
Iterable<Guest>? guests,
+ this.addOnItems,
}) : guests = _ensureBookerInGuestList(booker, guests ?? []);
static Iterable<Guest> _ensureBookerInGuestList(
@@ -64,7 +67,7 @@ class Booking extends Equatable {
@override
String toString() {
- return "Booking(id: $id, confirmationId: $confirmationId, roomNumber: $roomNumber, startDate: $startDate, endDate: $endDate, status: $bookingStatus, reservationStatus: $reservationStatus, image: $image, hotelName: $hotelName, hotelCode: $hotelCode, roomType: $roomType, adults: $adults, children: $children, booker: $booker, bookingDate: $bookingDate, digitalCard: $digitalCard, guests: $guests)";
+ return "Booking(id: $id, confirmationId: $confirmationId, roomNumber: $roomNumber, startDate: $startDate, endDate: $endDate, status: $bookingStatus, reservationStatus: $reservationStatus, image: $image, hotelName: $hotelName, hotelCode: $hotelCode, roomType: $roomType, adults: $adults, children: $children, booker: $booker, bookingDate: $bookingDate, digitalCard: $digitalCard, guests: $guests, addOnItems: $addOnItems)";
}
@override
@@ -88,6 +91,7 @@ class Booking extends Equatable {
maskedCardNumber,
reservationStatus,
rooms,
+ addOnItems,
];
Booking copyWith({
@@ -111,6 +115,7 @@ class Booking extends Equatable {
Iterable<Guest>? guests,
num? totalCharge,
List<Room>? rooms,
+ List<Upgrade>? addOnItems,
}) {
return Booking(
id: id ?? this.id,
@@ -134,6 +139,7 @@ class Booking extends Equatable {
balance: balance,
maskedCardNumber: maskedCardNumber,
rooms: rooms ?? this.rooms,
+ addOnItems: addOnItems ?? this.addOnItems,
);
}
diff --git a/comwell_key_app/lib/overview/models/room.dart b/comwell_key_app/lib/overview/models/room.dart
index 34cf0ec8..4b324dde 100644
--- a/comwell_key_app/lib/overview/models/room.dart
+++ b/comwell_key_app/lib/overview/models/room.dart
@@ -1,4 +1,4 @@
-import 'package:comwell_key_app/up_sales/models/room_facility.dart';
+import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
class Room {
final String confirmationNumber;
@@ -7,7 +7,7 @@ class Room {
final String description;
final int guests;
final Iterable<String> imageAssets;
- final Iterable<RoomFacility> roomFacilities;
+ final Iterable<RoomUpgrade> roomFacilities;
final Iterable<String> tags;
Room({
diff --git a/comwell_key_app/lib/overview/overview_page.dart b/comwell_key_app/lib/overview/overview_page.dart
index 0401066d..97b56877 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: Theme.of(context).colorScheme.surface,
+ backgroundColor: Colors.white,
appBar: const ComwellAppBar(
shouldShowBackButton: false,
),
diff --git a/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart b/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart
index 6848ca94..7b8783bf 100644
--- a/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart
+++ b/comwell_key_app/lib/pregistration/cubit/preregistration_cubit.dart
@@ -8,7 +8,8 @@ import 'package:comwell_key_app/profile_settings/model/address.dart';
import 'package:comwell_key_app/profile_settings/repostiory/profile_settings_repository.dart';
import 'package:comwell_key_app/tracking/comwell_tracking.dart';
import 'package:comwell_key_app/tracking/models/analytics_event_item.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.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';
@@ -23,9 +24,10 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
final _tracking = locator<ComwellTracking>();
final _preregistrationRepository = locator<PreregistrationRepository>();
final _upSalesRepository = locator<UpSalesRepository>();
+ final Locale culture;
final Booking booking;
- List<RoomUpgrade> upSales = [];
+ List<Upgrade> upSales = [];
final pageController = PageController();
final addressTextController = TextEditingController();
@@ -45,12 +47,14 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
PreregistrationPage.fromIndex(pageController.page?.toInt() ?? 0);
bool _isAnimating = false;
- PreregistrationCubit({required this.booking})
+ PreregistrationCubit({required this.booking, required this.culture})
: super(const PreregistrationState(
isLoading: false,
selected: false,
- upSales: [],
+ availableRoomUpgrades: [],
selectedUpSales: [],
+ addOnUpgrades: [],
+ selectedRoomUpgrade: '',
error: null)) {
_tracking.trackScreenView(
"Pre-registration - Betalingskort",
@@ -58,20 +62,20 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
);
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, error: null));
try {
final user = await _profileRepository.fetchProfileSettings();
addressTextController.text = "Bernard Bangs Alle 25";
@@ -87,12 +91,13 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
emailTextController.text = user.email;
phoneNumberTextController.text = "701234567";
- upSales = await _upSalesRepository.getMockUpSales();
+ final upSales = await _upSalesRepository.getUpSales(
+ booking.confirmationId, booking.hotelCode);
- emit(state.copyWith(
- isLoading: false, error: null, user: user, upSales: upSales));
+ // emit(state.copyWith(
+ // isLoading: false, error: null, user: user, upSales: upSales.toUpSales()));
} on Exception catch (e) {
- emit(state.copyWith(error: e));
+ // emit(state.copyWith(error: e));
}
}
@@ -106,10 +111,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));
}
}
@@ -121,7 +126,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();
}
@@ -131,10 +136,10 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
}
void onUpSalesContinueClicked() {
- emit(state.copyWith(
- selectedUpSales: state.selectedUpSales,
- numOfExtras: state.selectedUpSales.length,
- extrasTotalPrice: extrasTotalPrice));
+ // emit(state.copyWith(
+ // selectedUpSales: state.selectedUpSales,
+ // numOfExtras: state.selectedUpSales.length,
+ // extrasTotalPrice: extrasTotalPrice));
_navigateNextPage();
}
@@ -189,7 +194,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;
@@ -199,13 +204,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, error: Exception(e)));
}
}
@@ -227,7 +232,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) {
@@ -250,7 +255,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;
}
@@ -260,7 +265,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;
}
@@ -270,13 +275,12 @@ 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;
}
int get extrasTotalPrice {
- return state.selectedUpSales
- .fold(0, (sum, upgrade) => sum + int.parse(upgrade.price));
+ return state.selectedUpSales.fold(0, (sum, upgrade) => sum + upgrade.price);
}
@override
@@ -346,66 +350,61 @@ class PreregistrationCubit extends Cubit<PreregistrationState> {
}
void onTermsAndConditionsToggled(bool toggle) {
- emit(state.copyWith(termsAndConditionsAccepted: toggle));
+ // emit(state.copyWith(termsAndConditionsAccepted: toggle));
}
- void addSelected(RoomUpgrade roomUpgrade) {
- // If the new upgrade is of type "room", remove any existing room upgrades
- if (roomUpgrade.type == UpgradeType.room) {
+ void addSelected(Upgrade upgrade) {
+ if (upgrade.tags.contains('room')) {
final filteredUpSales = state.selectedUpSales
- .where((upgrade) => upgrade.type != UpgradeType.room)
+ .where((item) => !item.tags.contains('room'))
.toList();
- emit(state.copyWith(selectedUpSales: [...filteredUpSales, roomUpgrade]));
+ // emit(state.copyWith(selectedUpSales: [...filteredUpSales, upgrade]));
} else {
- emit(state
- .copyWith(selectedUpSales: [...state.selectedUpSales, roomUpgrade]));
+ // emit(state.copyWith(selectedUpSales: [...state.selectedUpSales, upgrade]));
}
}
void increment() {
- emit(state.copyWith(quantity: state.quantity + 1));
+ // emit(state.copyWith(quantity: state.quantity + 1));
}
void decrement() {
- if (state.quantity > 0 || state.selectedUpSales.isNotEmpty) {
- emit(state.copyWith(quantity: state.quantity - 1));
- }
+ // if (state.addOnUpgrades.firstWhere((e) => e.id == .id).quantity > 0 || state.selectedUpSales.isNotEmpty) {
+ // // emit(state.copyWith(quantity: state.quantity - 1));
+ // }
}
void onContinue() {
- emit(state.copyWith(selected: false));
+ // emit(state.copyWith(selected: false));
}
- void updateUpgradeQuantity(RoomUpgrade roomUpgrade, int quantity) {
+ void updateUpgradeQuantity(Upgrade upgrade, int quantity) {
if (quantity == 0) {
- // Remove all instances of this upgrade from selected upgrades
- final filteredUpSales = state.selectedUpSales
- .where((upgrade) => upgrade.id != roomUpgrade.id)
- .toList();
- emit(state.copyWith(selectedUpSales: filteredUpSales));
+ final filteredUpSales =
+ state.selectedUpSales.where((item) => item.id != upgrade.id).toList();
+ // emit(state.copyWith(selectedUpSales: filteredUpSales));
return;
} else {
- final existingItems = state.selectedUpSales
- .where((upgrade) => upgrade.id != roomUpgrade.id)
- .toList();
+ final existingItems =
+ state.selectedUpSales.where((item) => item.id != upgrade.id).toList();
final newSelectedUpSales = [
...existingItems,
- ...List.generate(quantity, (_) => roomUpgrade)
+ ...List.generate(quantity, (_) => upgrade)
];
- emit(state.copyWith(selectedUpSales: newSelectedUpSales));
+ // emit(state.copyWith(selectedUpSales: newSelectedUpSales));
}
}
- void removeUpgrade(RoomUpgrade roomUpgrade) {
- emit(state.copyWith(
- selectedUpSales: state.selectedUpSales
- .where((upgrade) => upgrade.id != roomUpgrade.id)
- .toList()));
+ void removeUpgrade(Upgrade upgrade) {
+ // emit(state.copyWith(
+ // selectedUpSales: state.selectedUpSales
+ // .where((item) => item.id != upgrade.id)
+ // .toList()));
}
- int extrasTotalQuantity(RoomUpgrade roomUpgrade) {
+ int extrasTotalQuantity(Upgrade upgrade) {
return state.selectedUpSales
- .where((element) => element.id == roomUpgrade.id)
+ .where((element) => element.id == upgrade.id)
.length;
}
}
diff --git a/comwell_key_app/lib/pregistration/cubit/preregistration_state.dart b/comwell_key_app/lib/pregistration/cubit/preregistration_state.dart
index d842d56e..9283bdd0 100644
--- a/comwell_key_app/lib/pregistration/cubit/preregistration_state.dart
+++ b/comwell_key_app/lib/pregistration/cubit/preregistration_state.dart
@@ -1,5 +1,6 @@
import 'package:comwell_key_app/up_sales/cubit/up_sales_state.dart';
-import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
+import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
+import 'package:comwell_key_app/up_sales/models/upgrade.dart';
import 'package:country_code_picker/country_code_picker.dart';
import '../../profile_settings/model/user.dart';
@@ -23,8 +24,10 @@ class PreregistrationState extends UpSalesState {
const PreregistrationState({
required super.isLoading,
required super.selected,
- required super.upSales,
+ required super.addOnUpgrades,
+ required super.availableRoomUpgrades,
required super.selectedUpSales,
+ required super.selectedRoomUpgrade,
required super.error,
this.missingInformation = false,
this.numOfExtras = 0,
@@ -61,53 +64,7 @@ class PreregistrationState extends UpSalesState {
isPostalCodeValid,
isCityValid,
selectedUpSales,
- upSales,
+ availableRoomUpgrades,
];
- @override
- PreregistrationState copyWith({
- bool? selected,
- List<RoomUpgrade>? upSales,
- List<RoomUpgrade>? selectedUpSales,
- bool? isLoading,
- Exception? error,
- int? quantity,
- User? user,
- String? phoneNumber,
- bool? missingInformation,
- int? numOfExtras,
- int? extrasTotalPrice,
- String? buttonTextStringId,
- bool? termsAndConditionsAccepted,
- bool forceUpdate = false,
- bool? isPhoneNumberValid,
- bool? isFirstNameValid,
- bool? isLastNameValid,
- bool? termsAccepted,
- bool? isAddressValid,
- bool? isPostalCodeValid,
- bool? isCityValid,
- }) {
- return PreregistrationState(
- selected: selected ?? super.selected,
- isLoading: isLoading ?? super.isLoading,
- error: error ?? this.error,
- forceUpdate: forceUpdate ? !this.forceUpdate : this.forceUpdate,
- missingInformation: missingInformation ?? this.missingInformation,
- user: user ?? this.user,
- numOfExtras: numOfExtras ?? this.numOfExtras,
- termsAndConditionsAccepted:
- termsAndConditionsAccepted ?? this.termsAndConditionsAccepted,
- extrasTotalPrice: extrasTotalPrice ?? this.extrasTotalPrice,
- phoneNumber: phoneNumber ?? this.phoneNumber,
- countryCode: countryCode,
- isPhoneNumberValid: isPhoneNumberValid ?? this.isPhoneNumberValid,
- isFirstNameValid: isFirstNameValid ?? this.isFirstNameValid,
- isLastNameValid: isLastNameValid ?? this.isLastNameValid,
- isAddressValid: isAddressValid ?? this.isAddressValid,
- isPostalCodeValid: isPostalCodeValid ?? this.isPostalCodeValid,
- isCityValid: isCityValid ?? this.isCityValid,
- selectedUpSales: selectedUpSales ?? this.selectedUpSales,
- upSales: upSales ?? this.upSales,
- );
- }
+
}
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 f51994e5..9e9eee33 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
@@ -1,9 +1,11 @@
import 'package:comwell_key_app/routing/app_routes.dart';
-import 'package:comwell_key_app/up_sales/components/catalog/other_upgrade_catalog.dart';
-import 'package:comwell_key_app/up_sales/components/catalog/room_uprade_catalog.dart';
+import 'package:comwell_key_app/up_sales/components/catalog/addon_upgrade_catalog.dart';
+import 'package:comwell_key_app/up_sales/components/catalog/room_upgrade_catalog.dart';
import 'package:comwell_key_app/up_sales/components/catalog/service_catalog.dart';
import 'package:comwell_key_app/pregistration/cubit/preregistration_cubit.dart';
import 'package:comwell_key_app/pregistration/cubit/preregistration_state.dart';
+import 'package:comwell_key_app/up_sales/models/upgrade.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_list.dart';
@@ -50,22 +52,22 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
),
const SizedBox(height: 8),
ServiceCatalog(
- upSales: state.upSales,
+ upSales: cubit.upSales.whereType<AddOnUpgrade>().toList(),
selectedUpSales: state.selectedUpSales,
- onServiceSelected: (roomUpgrade, isSelected) {
+ onServiceSelected: (upgrade, isSelected) {
if (isSelected) {
- cubit.removeUpgrade(roomUpgrade);
+ cubit.removeUpgrade(upgrade);
} else {
- cubit.addSelected(roomUpgrade);
+ cubit.addSelected(upgrade);
}
},
- onTap: (roomUpgrade) {
+ onTap: (upgrade) {
final isSelected =
- state.selectedUpSales.contains(roomUpgrade);
+ state.selectedUpSales.contains(upgrade);
if (isSelected) {
- cubit.removeUpgrade(roomUpgrade);
+ cubit.removeUpgrade(upgrade);
} else {
- cubit.addSelected(roomUpgrade);
+ cubit.addSelected(upgrade);
}
},
),
@@ -77,22 +79,23 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
),
const SizedBox(height: 8),
RoomUpgradeCatalog(
- upSales: state.upSales,
+ availableRoomUpgrades: cubit.upSales.whereType<RoomUpgrade>().toList(),
+ selectedRoomUpgrade: state.selectedRoomUpgrade,
selectedUpSales: state.selectedUpSales,
- onRoomUpgradeSelected: (roomUpgrade, isSelected) {
+ onRoomUpgradeSelected: (upgrade, isSelected) {
if (isSelected) {
- cubit.removeUpgrade(roomUpgrade);
+ cubit.removeUpgrade(upgrade);
} else {
- cubit.addSelected(roomUpgrade);
+ cubit.addSelected(upgrade);
}
},
- onTap: (roomUpgrade) {
+ onTap: (upgrade) {
final isSelected =
- state.selectedUpSales.contains(roomUpgrade);
+ state.selectedUpSales.contains(upgrade);
if (isSelected) {
- cubit.removeUpgrade(roomUpgrade);
+ cubit.removeUpgrade(upgrade);
} else {
- cubit.addSelected(roomUpgrade);
+ cubit.addSelected(upgrade);
}
},
),
@@ -103,11 +106,11 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
style: theme.textTheme.headlineMedium),
),
const SizedBox(height: 8),
- OtherUpgradeCatalog(
- upSales: state.upSales,
- selectedUpSales: state.selectedUpSales,
- onOtherUpgradeSelected: (roomUpgrade, quantity) {
- cubit.updateUpgradeQuantity(roomUpgrade, quantity);
+ AddOnUpgradeCatalog(
+ addOnUpgrades: cubit.upSales.whereType<AddOnUpgrade>().toList(),
+ selectedUpSales: state.selectedUpSales.whereType<AddOnUpgrade>().toList(),
+ onAddOnUpgradeSelected: (upgrade) {
+ cubit.addSelected(upgrade);
},
),
const SizedBox(height: 24),
@@ -122,16 +125,16 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
required BuildContext context,
required String routeName,
required dynamic cubit,
- required RoomUpgrade roomUpgrade,
+ required Upgrade upgrade,
required int quantity,
- required List<RoomUpgrade> selectedUpSales,
+ required List<Upgrade> selectedUpSales,
}) async {
final dynamic extra;
if (routeName == AppRoutes.otherUpgrade.name) {
- extra = RoomUpgradeExtra(roomUpgrade: roomUpgrade, quantity: quantity);
- } else if (routeName == AppRoutes.roomUpgrade.name) {
+ extra = RoomUpgradeExtra(upgrade: upgrade, quantity: quantity);
+ } else if (routeName == AppRoutes.roomUpgrade.name) {
extra = RoomUpgradeList(
- roomUpgrade: roomUpgrade, roomUpgrades: selectedUpSales);
+ roomUpgrade: upgrade as RoomUpgrade, isRoomUpgradeSelected: selectedUpSales.any((e) => e.id == upgrade.id));
} else {
extra = null;
}
@@ -139,13 +142,13 @@ class PreregUpSalesCatalogPage extends StatelessWidget {
await context.pushNamed(routeName, extra: extra);
if (roomUpgradeResponse is List) {
if (roomUpgradeResponse[1] as bool) {
- cubit.removeUpgrade(roomUpgradeResponse[0] as RoomUpgrade);
+ cubit.removeUpgrade(roomUpgradeResponse[0] as Upgrade);
} else {
- cubit.addSelected(roomUpgradeResponse[0] as RoomUpgrade);
+ cubit.addSelected(roomUpgradeResponse[0] as Upgrade);
}
}
if (roomUpgradeResponse is int) {
- cubit.updateUpgradeQuantity(roomUpgrade, roomUpgradeResponse);
+ 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 57113e0d..7183dc6f 100644
--- a/comwell_key_app/lib/pregistration/preregistration_flow.dart
+++ b/comwell_key_app/lib/pregistration/preregistration_flow.dart
@@ -3,6 +3,7 @@ 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:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../common/components/shimmer_loader/prereg_flow_shimmer_loader.dart';
@@ -21,7 +22,7 @@ class _PreregistrationFlowState extends State<PreregistrationFlow> {
Widget build(BuildContext context) {
return BlocProvider(
create: (context) =>
- PreregistrationCubit(booking: widget.booking)..init(),
+ PreregistrationCubit(booking: widget.booking, culture: context.locale)..init(),
child: BlocConsumer<PreregistrationCubit, PreregistrationState>(
listener: (context, state) {},
builder: (context, state) {
diff --git a/comwell_key_app/lib/routing/app_router.dart b/comwell_key_app/lib/routing/app_router.dart
index 9cf7ae08..51db5238 100644
--- a/comwell_key_app/lib/routing/app_router.dart
+++ b/comwell_key_app/lib/routing/app_router.dart
@@ -52,10 +52,14 @@ 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/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/pages/other_upgrade_page.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/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';
@@ -125,7 +129,6 @@ GoRouter goRouter() {
hotelInformationRepository:
locator<HotelInformationRepository>(),
booking: state.extra as Booking,
- culture: context.locale,
)..init(),
child: HotelInformationPage(child: child),
),
@@ -367,92 +370,96 @@ GoRouter goRouter() {
);
},
),
- GoRoute(
- path: "/${AppRoutes.upSalesCatalog.name}",
- name: AppRoutes.upSalesCatalog.name,
- builder: (context, state) {
- return BlocProvider(
- create: (context) =>
- UpSalesCubit(upSaleRepository: locator<UpSalesRepository>())
- ..init(),
- child: const UpSalesCatalog(),
- );
- },
- ),
- GoRoute(
- path: "/${AppRoutes.roomUpgrade.name}",
- name: AppRoutes.roomUpgrade.name,
- builder: (context, state) {
- final roomUpgradeList = state.extra as RoomUpgradeList;
- return BlocProvider(
- create: (context) =>
- UpSalesCubit(upSaleRepository: locator<UpSalesRepository>())
- ..init(),
- child: RoomUpgradePage(roomUpgradeList: roomUpgradeList),
- );
- },
- ),
- GoRoute(
- path: "/${AppRoutes.otherUpgrade.name}",
- name: AppRoutes.otherUpgrade.name,
- builder: (context, state) {
- final roomUpgrade = state.extra as RoomUpgradeExtra;
- return BlocProvider(
- create: (context) => UpSalesCubit.withExtra(
+ ShellRoute(
+ pageBuilder: (context, state, child) {
+ return CustomTransitionPage<void>(
+ key: state.pageKey,
+ child: BlocProvider(
+ create: (_) => UpSalesCubit(
upSaleRepository: locator<UpSalesRepository>(),
- extra: roomUpgrade),
- child: OtherUpgradePage(extra: roomUpgrade),
+ upSales: (state.extra as List<dynamic>)[0] as UpSales,
+ booking: (state.extra as List<dynamic>)[1] as Booking,
+ )..init(),
+ child: child,
+ ),
+ transitionsBuilder: (context, animation, secondaryAnimation, child) {
+ return SlideTransition(
+ position: Tween<Offset>(
+ begin: const Offset(1.0, 0.0),
+ end: Offset.zero,
+ ).animate(CurvedAnimation(
+ parent: animation,
+ curve: Curves.easeInOut,
+ )),
+ child: child,
+ );
+ },
+ transitionDuration: const Duration(milliseconds: 250),
);
- }),
- GoRoute(
- path: "/${AppRoutes.servicesUpgrade.name}",
- name: AppRoutes.servicesUpgrade.name,
- builder: (context, state) {
- final roomUpgradeList = state.extra as RoomUpgradeList;
- return BlocProvider(
- create: (context) =>
- UpSalesCubit(upSaleRepository: locator<UpSalesRepository>())
- ..init(),
- child: ServicesUpgradePage(roomUpgradeList: roomUpgradeList),
- );
- },
- ),
- GoRoute(
- path: "/${AppRoutes.upSaleConfirmation.name}",
- name: AppRoutes.upSaleConfirmation.name,
- builder: (context, state) {
- final extras = state.extra as List<dynamic>;
- final selectedUpSales = extras[0] as List<RoomUpgrade>;
- final extrasTotalPrice = extras[1] as int;
- return BlocProvider(
- create: (context) =>
- UpSalesCubit(upSaleRepository: locator<UpSalesRepository>())
- ..init(),
- child: UpSaleConfirmationPage(
- selectedUpSales: selectedUpSales,
- extrasTotalPrice: extrasTotalPrice),
- );
- },
- ),
- GoRoute(
- path: "/${AppRoutes.upSalesAnimation.name}",
- name: AppRoutes.upSalesAnimation.name,
- builder: (context, state) {
- return BlocProvider(
- create: (context) =>
- UpSalesCubit(upSaleRepository: locator<UpSalesRepository>())
- ..init(),
- child: const UpSalesProcessingPage(),
- );
- },
- ),
+ },
+ routes: [
+ GoRoute(
+ path: "/${AppRoutes.upSalesCatalog.name}",
+ name: AppRoutes.upSalesCatalog.name,
+ builder: (context, state) {
+ return const UpSalesCatalog();
+ },
+ ),
+ GoRoute(
+ path: "/${AppRoutes.roomUpgrade.name}",
+ name: AppRoutes.roomUpgrade.name,
+ builder: (context, state) {
+ return RoomUpgradePage(roomUpgradeList: state.extra as RoomUpgradeList);
+ },
+ ),
+ GoRoute(
+ path: "/${AppRoutes.otherUpgrade.name}",
+ name: AppRoutes.otherUpgrade.name,
+ builder: (context, state) {
+ //with extra
+ return AddonUpgradePage(addonUpgrade: state.extra as AddOnUpgrade);
+ }),
+ GoRoute(
+ path: "/${AppRoutes.servicesUpgrade.name}",
+ name: AppRoutes.servicesUpgrade.name,
+ builder: (context, state) {
+ return ServicesUpgradePage(roomUpgradeList: state.extra as RoomUpgradeList);
+ },
+ ),
+ GoRoute(
+ path: "/${AppRoutes.upSaleConfirmation.name}",
+ name: AppRoutes.upSaleConfirmation.name,
+ builder: (context, state) {
+ final extras = state.extra as List<dynamic>;
+ final selectedUpSales = extras[0] as List<Upgrade>;
+ final extrasTotalPrice = extras[1] as int;
+ final selectedRoomUpgrade = extras[2] as RoomUpgrade?;
+ return UpSaleConfirmationPage(
+ selectedUpSales: selectedUpSales,
+ extrasTotalPrice: extrasTotalPrice,
+ selectedRoomUpgrade: selectedRoomUpgrade);
+ },
+ ),
+ GoRoute(
+ path: "/${AppRoutes.upSalesProcessing.name}",
+ name: AppRoutes.upSalesProcessing.name,
+ builder: (context, state) {
+ final extras = state.extra as List<dynamic>;
+ final selectedUpSales = extras[0] as List<Upgrade>;
+ final selectedRoomUpgrade = extras[1] as RoomUpgrade?;
+ return UpSalesProcessingPage(selectedUpSales: selectedUpSales, selectedRoomUpgrade: selectedRoomUpgrade);
+ },
+ ),
+ ]),
GoRoute(
path: "/${AppRoutes.chooseShareRoom.name}",
name: AppRoutes.chooseShareRoom.name,
builder: (context, state) {
final booking = state.extra as Booking;
return BlocProvider(
- create: (context) => ChooseShareRoomCubit(locator<ChooseShareRoomRepository>())..init(),
+ create: (context) =>
+ ChooseShareRoomCubit(locator<ChooseShareRoomRepository>())
+ ..init(),
child: ChooseShareRoomPage(booking: booking),
);
},
@@ -465,7 +472,8 @@ GoRouter goRouter() {
final booking = extras[0] as Booking;
final isAssigned = extras[1] as bool;
return BlocProvider(
- create: (context) => ChooseShareRoomCubit(locator<ChooseShareRoomRepository>()),
+ create: (context) =>
+ ChooseShareRoomCubit(locator<ChooseShareRoomRepository>()),
child: RoomInfoPage(booking: booking, isAssigned: isAssigned),
);
},
@@ -476,7 +484,8 @@ GoRouter goRouter() {
builder: (context, state) {
final booking = state.extra as Booking;
return BlocProvider(
- create: (context) => ChooseShareRoomCubit(locator<ChooseShareRoomRepository>()),
+ create: (context) =>
+ ChooseShareRoomCubit(locator<ChooseShareRoomRepository>()),
child: ShareRoomPage(booking: booking),
);
},
diff --git a/comwell_key_app/lib/routing/app_routes.dart b/comwell_key_app/lib/routing/app_routes.dart
index 483f5c6b..fb0583d9 100644
--- a/comwell_key_app/lib/routing/app_routes.dart
+++ b/comwell_key_app/lib/routing/app_routes.dart
@@ -31,7 +31,7 @@ enum AppRoutes {
otherUpgrade,
servicesUpgrade,
upSaleConfirmation,
- upSalesAnimation,
+ upSalesProcessing,
chooseShareRoom,
roomInfo,
shareRoom,
diff --git a/comwell_key_app/lib/services/api.dart b/comwell_key_app/lib/services/api.dart
index 24ee76b9..27dc58b9 100644
--- a/comwell_key_app/lib/services/api.dart
+++ b/comwell_key_app/lib/services/api.dart
@@ -8,10 +8,17 @@ import 'package:comwell_key_app/services/models/booking_dto.dart';
import 'package:comwell_key_app/services/models/bookings_dto.dart';
import 'package:comwell_key_app/services/models/user_dto.dart';
import 'package:comwell_key_app/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';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
+import 'package:easy_localization/easy_localization.dart';
import 'adyen/stored_payment_methods_response.dart';
@@ -27,6 +34,13 @@ class Api {
}
}
+ // Get current locale globally
+ Locale get _currentLocale {
+ final navigatorKey = locator<GlobalKey<NavigatorState>>();
+ return EasyLocalization.of(navigatorKey.currentContext!)?.locale ??
+ const Locale('da', 'DK');
+ }
+
Future<Response<dynamic>> logout() async {
return await dio.post(ApiEndpoints.logout);
}
@@ -80,7 +94,7 @@ class Api {
Future<Response<dynamic>> fetchProfileSettings() async {
final response = await dio.get<dynamic>(ApiEndpoints.getGuestProfile);
-
+
return response;
}
@@ -152,10 +166,11 @@ class Api {
return response;
}
- Future<dynamic> getHotelInfo(String hotelCode, Locale culture) async {
- final cultureString = culture.toString().replaceAll('_', '-');
- final response = await dio.get<Json>('/Content/v1/api/v1/hotel?hotelCode=$hotelCode&culture=$cultureString');
-
+ Future<dynamic> getHotelInfo(String hotelCode) async {
+ final cultureString = _currentLocale.toString().replaceAll('_', '-');
+ final response = await dio.get<Json>(
+ '/Content/v1/api/v1/hotel?hotelCode=$hotelCode&culture=$cultureString');
+
return response;
}
@@ -164,9 +179,9 @@ class Api {
"confirmationId": confirmationId,
};
final data = jsonEncode(body);
-
+
final response = await dio.post<Json>(ApiEndpoints.checkIn, data: data);
-
+
return response.data;
}
@@ -181,7 +196,8 @@ class Api {
"refill": housekeeping.refill,
};
final data = jsonEncode(body);
- final response = await dio.post<Json>(ApiEndpoints.orderHousekeeping, data: data);
+ final response =
+ await dio.post<Json>(ApiEndpoints.orderHousekeeping, data: data);
return response.data;
}
@@ -230,24 +246,46 @@ class Api {
}
Future<BookingDTO?> getBookingDetails(String bookingId) async {
- final response = await dio.get<Json>('${ApiEndpoints.getBookingDetails}$bookingId');
-
+ final response =
+ await dio.get<Json>('${ApiEndpoints.getBookingDetails}$bookingId');
+
return BookingDTO.fromJson(response.data!);
}
- Future<Json> postRoomSelection(String bookingId, String userId ) async {
+ Future<Json> postRoomSelection(String bookingId, String userId) async {
final body = {
"bookingConfirmationId": bookingId,
"userId": userId,
};
final data = jsonEncode(body);
- final response = await dio.post<Json>('ApiEndpoints.roomSelection', data: data);
+ final response =
+ await dio.post<Json>('ApiEndpoints.roomSelection', data: data);
return response.data!;
}
- Future<Json> fetchUpSales() async {
- // final response = await dio.get<Json>(ApiEndpoints.upSales);
- // return response.data!.map((json) => RoomUpgrade.fromJson(json)).toList();
- return {};
+ Future<UpSalesDTO> fetchUpSales(
+ String confirmationId, String hotelCode) async {
+ final body = {
+ "confirmationId": confirmationId,
+ "property": hotelCode,
+ "culture": _currentLocale.toString().replaceAll('_', '-'),
+ };
+ final data = jsonEncode(body);
+ final response = await dio.post<Json>(ApiEndpoints.upSales, data: data);
+ return UpSalesDTO.fromJson(response.data!);
+ }
+
+ Future<void> addUpSalesToBooking(String confirmationId, String hotelCode,
+ String roomType, List<AddOnList> selectedUpSales) async {
+ final body = {
+ "confirmationNumber": confirmationId,
+ "property": hotelCode,
+ "roomType": roomType,
+ "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
new file mode 100644
index 00000000..6e1a206d
--- /dev/null
+++ b/comwell_key_app/lib/services/mappers/addon_item_mapper.dart
@@ -0,0 +1,42 @@
+import 'package:comwell_key_app/services/models/booking_dto.dart';
+import 'package:comwell_key_app/up_sales/models/upgrade.dart';
+import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
+import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
+
+extension AddOnItemDTOMapper on AddOnItemDTO {
+ Upgrade toUpgrade() {
+ // Determine if this is a room upgrade or addon based on the code
+ // You may need to adjust this logic based on your business rules
+ if (code.contains('ROOM') || code.contains('SDP') || code.contains('STD')) {
+ // This is a room upgrade
+ return RoomUpgrade(
+ id: code,
+ name: description,
+ price: price.toInt(),
+ currency: currency,
+ images: ['assets/images/room_upgrade_placeholder.png'],
+ description: description,
+ tags: ['room'],
+ quantity: quantity,
+ );
+ } else {
+ // This is an addon upgrade
+ return AddOnUpgrade(
+ id: code,
+ name: description,
+ price: price.toInt(),
+ currency: currency,
+ images: ['assets/images/addon_placeholder.png'],
+ description: description,
+ tags: ['service'],
+ isSelected: true, // Since it's already in the booking
+ quantity: quantity,
+ isService: true,
+ );
+ }
+ }
+}
+
+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 a11208d6..349e1980 100644
--- a/comwell_key_app/lib/services/mappers/booking_mapper.dart
+++ b/comwell_key_app/lib/services/mappers/booking_mapper.dart
@@ -4,6 +4,7 @@ import 'package:comwell_key_app/overview/models/room.dart';
import 'package:comwell_key_app/services/models/booking_dto.dart';
import 'package:comwell_key_app/services/models/room_dto.dart';
import 'package:comwell_key_app/services/mappers/room_mapper.dart';
+import 'package:comwell_key_app/services/mappers/addon_item_mapper.dart';
//TODO: Fix actual image
extension BookingDTOMapper on BookingDTO {
@@ -31,6 +32,7 @@ extension BookingDTOMapper on BookingDTO {
balance: balance,
maskedCardNumber: maskedCardNumber,
rooms: rooms,
+ addOnItems: addOnItems?.toUpgrades() ?? [],
);
}
}
@@ -55,7 +57,14 @@ extension BookingMapper on Booking {
children: children,
totalCharge: 200,
balance: 0,
- maskedCardNumber: "1234567890");
+ maskedCardNumber: "1234567890",
+ addOnItems: addOnItems?.map((upgrade) => AddOnItemDTO(
+ code: upgrade.id,
+ description: upgrade.description,
+ price: upgrade.price.toDouble(),
+ currency: upgrade.currency,
+ quantity: 1, // Default quantity
+ )).toList());
}
}
@@ -82,6 +91,7 @@ extension BookingWithRoomsMapper on Booking {
balance: balance,
maskedCardNumber: maskedCardNumber,
rooms: rooms,
+ addOnItems: addOnItems,
);
}
}
diff --git a/comwell_key_app/lib/services/mappers/room_mapper.dart b/comwell_key_app/lib/services/mappers/room_mapper.dart
index 80dc11ae..1209b045 100644
--- a/comwell_key_app/lib/services/mappers/room_mapper.dart
+++ b/comwell_key_app/lib/services/mappers/room_mapper.dart
@@ -1,6 +1,6 @@
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/room_facility_mapper.dart';
+import 'package:comwell_key_app/up_sales/mappers/addon_upgrade_mapper.dart';
extension RoomDTOMapper on RoomDto {
Room toRoom() {
@@ -11,7 +11,7 @@ extension RoomDTOMapper on RoomDto {
description: description,
guests: guests,
imageAssets: imageAssets,
- roomFacilities: roomFacilities.toRoomFacilities(),
+ roomFacilities: [],
tags: tags,
);
}
diff --git a/comwell_key_app/lib/services/models/booking_dto.dart b/comwell_key_app/lib/services/models/booking_dto.dart
index b7a132ac..07742914 100644
--- a/comwell_key_app/lib/services/models/booking_dto.dart
+++ b/comwell_key_app/lib/services/models/booking_dto.dart
@@ -23,6 +23,7 @@ class BookingDTO {
final num? totalCharge;
final num? balance;
final String? maskedCardNumber;
+ final List<AddOnItemDTO>? addOnItems;
BookingDTO({
required this.roomNumber,
@@ -43,9 +44,31 @@ class BookingDTO {
required this.totalCharge,
required this.balance,
required this.maskedCardNumber,
+ this.addOnItems,
});
Json toJson() => _$BookingDTOToJson(this);
factory BookingDTO.fromJson(Json json) => _$BookingDTOFromJson(json);
+}
+
+@JsonSerializable()
+class AddOnItemDTO {
+ final String code;
+ final String description;
+ final double price;
+ final String currency;
+ final int quantity;
+
+ AddOnItemDTO({
+ required this.code,
+ required this.description,
+ required this.price,
+ required this.currency,
+ required this.quantity,
+ });
+
+ Json toJson() => _$AddOnItemDTOToJson(this);
+
+ factory AddOnItemDTO.fromJson(Json json) => _$AddOnItemDTOFromJson(json);
}
\ No newline at end of file
diff --git a/comwell_key_app/lib/services/models/room_dto.dart b/comwell_key_app/lib/services/models/room_dto.dart
index e478f873..f09ed2ed 100644
--- a/comwell_key_app/lib/services/models/room_dto.dart
+++ b/comwell_key_app/lib/services/models/room_dto.dart
@@ -1,4 +1,4 @@
-import 'package:comwell_key_app/up_sales/models/dto/room_facility_dto.dart';
+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';
@@ -13,8 +13,6 @@ class RoomDto {
@JsonKey(defaultValue: [])
final Iterable<String> imageAssets;
@JsonKey(defaultValue: [])
- final Iterable<RoomFacilityDTO> roomFacilities;
- @JsonKey(defaultValue: [])
final Iterable<String> tags;
RoomDto({
@@ -24,7 +22,6 @@ class RoomDto {
required this.description,
required this.guests,
required this.imageAssets,
- required this.roomFacilities,
required this.tags,
});
diff --git a/comwell_key_app/lib/services/utils/api_endpoints.dart b/comwell_key_app/lib/services/utils/api_endpoints.dart
index b7d63c9a..8b4ecf07 100644
--- a/comwell_key_app/lib/services/utils/api_endpoints.dart
+++ b/comwell_key_app/lib/services/utils/api_endpoints.dart
@@ -7,7 +7,10 @@ class ApiEndpoints {
static const String preRegistration = '/booking/v1/Preregistration';
static const String checkIn = '/booking/v1/CheckIn';
static const String getBookingDetails = '/booking/v1/GetBookingDetails?confirmationId=';
-
+
+ //Up sales endpoints
+ static const String upSales = '/booking/v1/GetAvailableUpsells';
+ static const String addUpSalesToBooking = '/booking/v1/AddUpsellOptions';
//Default endpoints
static const String orderHousekeeping = '/Content/v1/api/v1/house-keeping';
diff --git a/comwell_key_app/lib/themes/dark_theme.dart b/comwell_key_app/lib/themes/dark_theme.dart
index 424c3174..078e2cfc 100644
--- a/comwell_key_app/lib/themes/dark_theme.dart
+++ b/comwell_key_app/lib/themes/dark_theme.dart
@@ -35,7 +35,7 @@ ThemeData darkTheme = ThemeData(
scrim: colorPrimarySystem,
brightness: Brightness.light,
// Material 3+ surface roles:
- surfaceContainerLow: colorCallReceivedBackground, // custom container background
+ surfaceContainerLow: colorSecondary, // custom container background colorCallReceivedBackground
tertiary: colorTertiary,
onTertiary: colorTertiaryText,
tertiaryContainer: colorTertiarySystem,
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
new file mode 100644
index 00000000..0c5504bf
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/components/catalog/addon_upgrade_catalog.dart
@@ -0,0 +1,65 @@
+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';
+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_extra.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+
+class AddOnUpgradeCatalog extends StatelessWidget {
+ final List<AddOnUpgrade> addOnUpgrades;
+ final List<AddOnUpgrade> selectedUpSales;
+ final Function(AddOnUpgrade)? onAddOnUpgradeSelected;
+ const AddOnUpgradeCatalog({
+ super.key,
+ required this.addOnUpgrades,
+ required this.selectedUpSales,
+ this.onAddOnUpgradeSelected
+ });
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+
+ if (addOnUpgrades.isEmpty) {
+ return Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Text('no_room_upgrades_available'.tr(),
+ style: theme.textTheme.headlineMedium?.copyWith(color: colorHeadlineText)),
+ );
+ }
+
+ return SizedBox(
+ height: 289,
+ child: ListView.builder(
+ scrollDirection: Axis.horizontal,
+ itemCount: addOnUpgrades.length,
+ itemBuilder: (context, index) {
+ return GestureDetector(
+ onTap: () async {
+ final result = await context.pushNamed(
+ AppRoutes.otherUpgrade.name,
+ extra: addOnUpgrades.elementAt(index)
+ );
+ if (result is AddOnUpgrade) {
+ onAddOnUpgradeSelected?.call(result);
+ }
+ },
+ child: UpSalesUpgradesWidget(
+ width: 328,
+ height: 268,
+ upgrade: addOnUpgrades.elementAt(index),
+ isSelected: selectedUpSales.any((e) => e.id == addOnUpgrades.elementAt(index).id),
+ routeName: AppRoutes.otherUpgrade.name,
+ showCounter: true,
+ selectedUpSales: selectedUpSales,
+ onTap: (upgrade) {},
+ ),
+ );
+ },
+ ),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/up_sales/components/catalog/other_upgrade_catalog.dart b/comwell_key_app/lib/up_sales/components/catalog/other_upgrade_catalog.dart
deleted file mode 100644
index d8dc52c9..00000000
--- a/comwell_key_app/lib/up_sales/components/catalog/other_upgrade_catalog.dart
+++ /dev/null
@@ -1,72 +0,0 @@
-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';
-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:easy_localization/easy_localization.dart';
-import 'package:flutter/material.dart';
-import 'package:go_router/go_router.dart';
-
-class OtherUpgradeCatalog extends StatelessWidget {
- final List<RoomUpgrade> upSales;
- final List<RoomUpgrade> selectedUpSales;
- final Function(RoomUpgrade, int)? onOtherUpgradeSelected;
- const OtherUpgradeCatalog({
- super.key,
- required this.upSales,
- required this.selectedUpSales,
- this.onOtherUpgradeSelected
- });
-
- @override
- Widget build(BuildContext context) {
- final theme = Theme.of(context);
- final otherUpSales = upSales
- .where((roomUpgrade) => roomUpgrade.type == UpgradeType.other)
- .toList();
-
- if (otherUpSales.isEmpty) {
- return Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Text('no_room_upgrades_available'.tr(),
- style: theme.textTheme.headlineMedium?.copyWith(color: colorHeadlineText)),
- );
- }
-
- return SizedBox(
- height: 289,
- child: ListView.builder(
- scrollDirection: Axis.horizontal,
- itemCount: otherUpSales.length,
- itemBuilder: (context, index) {
- return GestureDetector(
- onTap: () async {
- final result = await context.pushNamed(
- AppRoutes.otherUpgrade.name,
- extra: RoomUpgradeExtra(
- roomUpgrade: otherUpSales.elementAt(index),
- quantity: selectedUpSales.where((e) => e.id == otherUpSales.elementAt(index).id).length,
- )
- );
-
- if (result is int) {
- final roomUpgrade = otherUpSales.elementAt(index);
- onOtherUpgradeSelected?.call(roomUpgrade, result);
- }
- },
- child: UpSalesUpgradesWidget(
- width: 328,
- height: 268,
- roomUpgrade: otherUpSales.elementAt(index),
- isSelected: selectedUpSales.contains(otherUpSales.elementAt(index)),
- routeName: AppRoutes.otherUpgrade.name,
- showCounter: true,
- selectedUpSales: selectedUpSales,
- onTap: (roomUpgrade) {},
- ),
- );
- },
- ),
- );
- }
-}
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
new file mode 100644
index 00000000..eac85560
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/components/catalog/room_upgrade_catalog.dart
@@ -0,0 +1,79 @@
+import 'package:comwell_key_app/common/const.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';
+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/room_upgrade_list.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+
+class RoomUpgradeCatalog extends StatelessWidget {
+ final List<RoomUpgrade> availableRoomUpgrades;
+ final String selectedRoomUpgrade;
+ final List<Upgrade> selectedUpSales;
+ final Function(RoomUpgrade, bool)? onRoomUpgradeSelected;
+ final Function(Upgrade)? onTap;
+ const RoomUpgradeCatalog({
+ super.key,
+ required this.availableRoomUpgrades,
+ required this.selectedRoomUpgrade,
+ required this.selectedUpSales,
+ this.onRoomUpgradeSelected,
+ this.onTap
+ });
+
+ @override
+ Widget build(BuildContext context) {
+
+ print("Available room upgrades: ${availableRoomUpgrades.map((e) => e.id)}");
+
+
+ return SizedBox(
+ height: 289,
+ child: ListView.builder(
+ scrollDirection: Axis.horizontal,
+ itemCount: availableRoomUpgrades.length,
+ itemBuilder: (context, index) {
+ final roomUpgrade = availableRoomUpgrades.elementAt(index);
+ final isSelected = selectedRoomUpgrade == roomUpgrade.id;
+
+
+
+ return GestureDetector(
+ onTap: () async {
+ final result = await context.pushNamed(
+ AppRoutes.roomUpgrade.name,
+ extra: RoomUpgradeList(
+ roomUpgrade: roomUpgrade,
+ isRoomUpgradeSelected: isSelected,
+ )
+ );
+
+ if (result is List && result.length == 2) {
+ final upgrade = result[0] as RoomUpgrade;
+ final isSelected = result[1] as bool;
+
+ onRoomUpgradeSelected?.call(upgrade, isSelected);
+ }
+ },
+ child: UpSalesUpgradesWidget(
+ width: kUpSalesServiceWidgetWidthLarge,
+ height: kUpSalesServiceWidgetHeightLarge,
+ upgrade: roomUpgrade,
+ isSelected: isSelected,
+ routeName: AppRoutes.roomUpgrade.name,
+ showCounter: false,
+ selectedUpSales: selectedUpSales,
+ onTap: (upgrade) {
+ onTap?.call(upgrade);
+ },
+ ),
+ );
+ },
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/comwell_key_app/lib/up_sales/components/catalog/room_uprade_catalog.dart b/comwell_key_app/lib/up_sales/components/catalog/room_uprade_catalog.dart
deleted file mode 100644
index 80b05e0f..00000000
--- a/comwell_key_app/lib/up_sales/components/catalog/room_uprade_catalog.dart
+++ /dev/null
@@ -1,79 +0,0 @@
-import 'package:comwell_key_app/common/const.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';
-import 'package:comwell_key_app/up_sales/models/room_upgrade.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:go_router/go_router.dart';
-
-class RoomUpgradeCatalog extends StatelessWidget {
- final List<RoomUpgrade> upSales;
- final List<RoomUpgrade> selectedUpSales;
- final Function(RoomUpgrade, bool)? onRoomUpgradeSelected;
- final Function(RoomUpgrade)? onTap;
- const RoomUpgradeCatalog({
- super.key,
- required this.upSales,
- required this.selectedUpSales,
- this.onRoomUpgradeSelected,
- this.onTap
- });
-
- @override
- Widget build(BuildContext context) {
- final theme = Theme.of(context);
- final roomUpSales = upSales
- .where((roomUpgrade) => roomUpgrade.type == UpgradeType.room)
- .toList();
-
- if (roomUpSales.isEmpty) {
- return Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Text('no_room_upgrades_available'.tr(),
- style: theme.textTheme.headlineMedium?.copyWith(color: colorHeadlineText)),
- );
- }
-
- return SizedBox(
- height: 289,
- child: ListView.builder(
- scrollDirection: Axis.horizontal,
- itemCount: roomUpSales.length,
- itemBuilder: (context, index) {
- return GestureDetector(
- onTap: () async {
- final result = await context.pushNamed(
- AppRoutes.roomUpgrade.name,
- extra: RoomUpgradeList(
- roomUpgrade: roomUpSales.elementAt(index),
- roomUpgrades: selectedUpSales,
- )
- );
-
- if (result is List && result.length == 2) {
- final roomUpgrade = result[0] as RoomUpgrade;
- final isSelected = result[1] as bool;
-
- onRoomUpgradeSelected?.call(roomUpgrade, isSelected);
- }
- },
- child: UpSalesUpgradesWidget(
- width: kUpSalesServiceWidgetWidthLarge,
- height: kUpSalesServiceWidgetHeightLarge,
- roomUpgrade: roomUpSales.elementAt(index),
- isSelected: selectedUpSales.contains(roomUpSales.elementAt(index)),
- routeName: AppRoutes.roomUpgrade.name,
- showCounter: false,
- selectedUpSales: selectedUpSales,
- onTap: (roomUpgrade) {
- onTap?.call(roomUpgrade);
- },
- ),
- );
- },
- ),
- );
- }
-}
\ No newline at end of file
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 357a3b24..11ae4850 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
@@ -2,6 +2,8 @@ import 'package:comwell_key_app/common/const.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';
+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.dart';
import 'package:comwell_key_app/up_sales/models/room_upgrade_list.dart';
import 'package:easy_localization/easy_localization.dart';
@@ -9,68 +11,66 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
class ServiceCatalog extends StatelessWidget {
- final List<RoomUpgrade> upSales;
+ final List<AddOnUpgrade> upSales;
final double? height;
- final Function(RoomUpgrade)? onTap;
- final List<RoomUpgrade>? selectedUpSales;
+ final void Function(Upgrade) onTap;
+ final List<Upgrade> selectedUpSales;
final bool showRadioButton;
- final Function(RoomUpgrade, bool)? onServiceSelected;
+ final void Function(AddOnUpgrade, bool) onServiceSelected;
const ServiceCatalog(
- {super.key,
+ {super.key,
required this.upSales,
this.height,
- this.onTap,
- this.selectedUpSales,
+ required this.onTap,
+ required this.selectedUpSales,
this.showRadioButton = true,
- this.onServiceSelected});
+ required this.onServiceSelected});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
- final services = upSales
- .where((roomUpgrade) => roomUpgrade.type == UpgradeType.service)
- .toList();
- if (services.isEmpty) {
- return Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Text('no_services_available'.tr(),
- style: theme.textTheme.headlineMedium
- ?.copyWith(color: colorHeadlineText)),
- );
- }
+
+ print("Available services: ${upSales.map((e) => e.id)}");
+
+ // if (services.isEmpty) {
+ // return Padding(
+ // padding: const EdgeInsets.symmetric(horizontal: 16),
+ // child: Text('no_services_available'.tr(),
+ // style: theme.textTheme.headlineMedium
+ // ?.copyWith(color: colorHeadlineText)),
+ // );
+ // }
return SizedBox(
height: height ?? kUpSalesServiceWidgetHeightSmall,
child: ListView.builder(
scrollDirection: Axis.horizontal,
- itemCount: services.length,
+ itemCount: upSales.length,
itemBuilder: (context, index) {
- final isPopular = services.elementAt(index).tags.contains('popular');
+ final isSelected = selectedUpSales.any((e) => e.id == upSales.elementAt(index).id);
+ final isPopular = upSales.elementAt(index).tags.contains('popular');
return GestureDetector(
onTap: () async {
final result = await context.pushNamed(
AppRoutes.servicesUpgrade.name,
extra: RoomUpgradeList(
- roomUpgrade: services.elementAt(index),
- roomUpgrades: selectedUpSales ?? []
- )
- );
-
+ addOnUpgrade: upSales.elementAt(index),
+ isRoomUpgradeSelected: isSelected
+ ));
if (result is List && result.length == 2) {
- final roomUpgrade = result[0] as RoomUpgrade;
+ final upgrade = result[0] as AddOnUpgrade;
final isSelected = result[1] as bool;
- onServiceSelected?.call(roomUpgrade, isSelected);
+ onServiceSelected.call(upgrade, isSelected);
}
},
child: UpSalesServicesWidget(
showRadioButton: showRadioButton,
width: kUpSalesServiceWidgetWidthLarge,
- roomUpgrade: services.elementAt(index),
+ upgrade: upSales.elementAt(index),
selectedUpSales: selectedUpSales,
- isSelected:
- selectedUpSales?.contains(services.elementAt(index)) ?? false,
+ isSelected: isSelected,
isPopular: isPopular,
onTap: onTap,
),
diff --git a/comwell_key_app/lib/up_sales/components/facilities_bottom_sheet.dart b/comwell_key_app/lib/up_sales/components/facilities_bottom_sheet.dart
index a90fc22d..3b85e151 100644
--- a/comwell_key_app/lib/up_sales/components/facilities_bottom_sheet.dart
+++ b/comwell_key_app/lib/up_sales/components/facilities_bottom_sheet.dart
@@ -1,22 +1,21 @@
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/up_sales/components/facility_icon_text.dart';
-import 'package:comwell_key_app/up_sales/models/room_facility.dart';
import 'package:flutter/material.dart';
class FacilitiesBottomSheet extends StatelessWidget {
- final List<RoomFacility> facilities;
- const FacilitiesBottomSheet({super.key, required this.facilities});
+ final List<String> tags;
+ const FacilitiesBottomSheet({super.key, required this.tags});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
// Group facilities for display dynamically
- final Map<FacilityType, List<RoomFacility>> grouped = {};
- for (final type in FacilityType.values) {
- final facilitiesOfType = facilities.where((f) => f.facilityType == type).toList();
+ final Map<String, List<String>> grouped = {};
+ for (final tag in tags) {
+ final facilitiesOfType = tags.where((f) => f.contains(tag)).toList();
if (facilitiesOfType.isNotEmpty) {
- grouped[type] = facilitiesOfType;
+ grouped[tag] = facilitiesOfType;
}
}
@@ -48,38 +47,38 @@ class FacilitiesBottomSheet extends StatelessWidget {
...grouped.entries.map((entry) => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- Text(entry.key.name.toUpperCase(),
+ Text(entry.key.toUpperCase(),
style: theme.textTheme.bodySmall?.copyWith(
fontWeight: FontWeight.bold,
color: theme.colorScheme.onSurface)),
const SizedBox(height: 8),
Wrap(
- direction: entry.key == FacilityType.bed
+ direction: entry.key == "bed"
? Axis.horizontal
: Axis.vertical,
spacing: 16,
runSpacing: 8,
- children: entry.key == FacilityType.bed
- ? entry.value
- .map((f) => Container(
- width: 175,
- height: 56,
- decoration: BoxDecoration(
- border: Border.all(
- color: colorDivider,
- ),
- borderRadius: BorderRadius.circular(8),
- ),
- child: Center(
- child: FacilityIconText(facility: f, showDivider: false)),
- ))
- .toList()
- : entry.value
- .map((f) => FacilityIconText(facility: f, showDivider: false))
- .toList(),
+ children: entry.key == "bed" ? [] : []
+ // ? entry.value
+ // .map((f) => Container(
+ // width: 175,
+ // height: 56,
+ // decoration: BoxDecoration(
+ // border: Border.all(
+ // color: colorDivider,
+ // ),
+ // borderRadius: BorderRadius.circular(8),
+ // ),
+ // child: Center(
+ // child: FacilityIconText(facility: f, showDivider: false)),
+ // ))
+ // .toList()
+ // : entry.value
+ // .map((f) => FacilityIconText(facility: f, showDivider: false))
+ // .toList(),
),
const SizedBox(height: 16),
- if (entry.key != FacilityType.bed)
+ if (entry.key != "bed")
const Column(
children: [
Divider(
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 989b4fcf..e69b1dcf 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,10 +1,10 @@
import 'package:comwell_key_app/themes/light_theme.dart';
-import 'package:comwell_key_app/up_sales/models/room_facility.dart';
+import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
class FacilityIconText extends StatelessWidget {
- final RoomFacility facility;
+ final AddOnUpgrade facility;
final bool showDivider;
const FacilityIconText({super.key, required this.facility, this.showDivider = true});
@@ -13,7 +13,7 @@ class FacilityIconText extends StatelessWidget {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
- SvgPicture.asset(facility.icon, width: 20, height: 20),
+ // SvgPicture.asset(facility.icon, width: 20, height: 20),
const SizedBox(width: 4),
Text(facility.name, style: Theme.of(context).textTheme.bodySmall),
const SizedBox(width: 6),
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 fccc1e4b..ee9a351c 100644
--- a/comwell_key_app/lib/up_sales/components/item_counter.dart
+++ b/comwell_key_app/lib/up_sales/components/item_counter.dart
@@ -1,12 +1,13 @@
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:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class ItemCounter extends StatelessWidget {
- final RoomUpgradeExtra extra;
- const ItemCounter({super.key, required this.extra});
+ final AddOnUpgrade addonUpgrade;
+ const ItemCounter({super.key, required this.addonUpgrade});
@override
Widget build(BuildContext context) {
@@ -30,7 +31,7 @@ class ItemCounter extends StatelessWidget {
Row(
children: [
InkWell(
- onTap: cubit.decrement,
+ onTap: () => cubit.decrement(addonUpgrade.id),
borderRadius: BorderRadius.circular(24),
child: Container(
width: 44,
@@ -43,12 +44,12 @@ class ItemCounter extends StatelessWidget {
),
),
const SizedBox(width: 16),
- Text('${cubit.state.quantity}',
+ Text('${cubit.state.addOnUpgrades.firstWhere((e) => e.id == addonUpgrade.id).quantity}',
style: theme.textTheme.headlineMedium),
const SizedBox(width: 16),
// Plus button
InkWell(
- onTap: cubit.increment,
+ onTap: () => cubit.increment(addonUpgrade.id),
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 2d7bf0ff..4026c5dd 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
@@ -1,6 +1,7 @@
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/room_upgrade.dart';
+import 'package:comwell_key_app/up_sales/models/upgrade.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
@@ -8,8 +9,9 @@ class UpSalesBottomButton extends StatelessWidget {
final List<Widget> children;
final VoidCallback onContinue;
final VoidCallback? onAddUpSale;
- final List<RoomUpgrade> selectedUpSales;
+ final List<Upgrade> selectedUpSales;
final int extrasTotalPrice;
+ final String selectedRoomUpgrade;
const UpSalesBottomButton({
super.key,
required this.onContinue,
@@ -17,6 +19,7 @@ class UpSalesBottomButton extends StatelessWidget {
required this.selectedUpSales,
required this.extrasTotalPrice,
this.onAddUpSale,
+ required this.selectedRoomUpgrade,
});
@override
@@ -32,12 +35,7 @@ class UpSalesBottomButton extends StatelessWidget {
),
child: ElevatedButton(
onPressed: () {
- if (onAddUpSale != null) {
- onContinue();
- }
- if (selectedUpSales.isNotEmpty) {
- context.pushNamed(AppRoutes.upSaleConfirmation.name, extra: [selectedUpSales, extrasTotalPrice]);
- }
+ onContinue();
},
style: ButtonStyle(
elevation: WidgetStateProperty.all(0),
@@ -45,14 +43,15 @@ class UpSalesBottomButton extends StatelessWidget {
foregroundColor: const WidgetStatePropertyAll(Colors.white),
),
child: Padding(
- padding: const EdgeInsets.symmetric(vertical: 16.0),
- child: Row(
- mainAxisAlignment: children.length > 1 ? MainAxisAlignment.spaceBetween : MainAxisAlignment.center,
- children: children,
- )
- ),
+ padding: const EdgeInsets.symmetric(vertical: 16.0),
+ child: Row(
+ mainAxisAlignment: children.length > 1
+ ? MainAxisAlignment.spaceBetween
+ : MainAxisAlignment.center,
+ children: children,
+ )),
),
),
);
}
-}
\ No newline at end of file
+}
diff --git a/comwell_key_app/lib/up_sales/components/up_sales_catalog_button.dart b/comwell_key_app/lib/up_sales/components/up_sales_catalog_button.dart
index 75f02bf0..202e808d 100644
--- a/comwell_key_app/lib/up_sales/components/up_sales_catalog_button.dart
+++ b/comwell_key_app/lib/up_sales/components/up_sales_catalog_button.dart
@@ -1,11 +1,15 @@
+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/models/up_sales.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
class UpSalesCatalogButton extends StatelessWidget {
- const UpSalesCatalogButton({super.key});
+ final UpSales upSales;
+ final Booking booking;
+ const UpSalesCatalogButton({super.key, required this.upSales, required this.booking});
@override
Widget build(BuildContext context) {
@@ -13,7 +17,7 @@ class UpSalesCatalogButton extends StatelessWidget {
return GestureDetector(
onTap: () {
- context.pushNamed(AppRoutes.upSalesCatalog.name);
+ context.pushNamed(AppRoutes.upSalesCatalog.name, extra: [upSales, booking]);
},
child: Container(
width: double.infinity,
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
new file mode 100644
index 00000000..5ba243b9
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/components/up_sales_continue_button.dart
@@ -0,0 +1,65 @@
+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/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 RoomUpgrade? selectedRoomUpgrade;
+ final int extrasTotalPrice;
+ const UpSalesContinueButton(
+ {super.key,
+ required this.selectedUpSales,
+ required this.extrasTotalPrice,
+ required this.selectedRoomUpgrade});
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+ final isUpSalesEmpty =
+ selectedUpSales.isEmpty && selectedRoomUpgrade == null;
+ 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: ElevatedButton(
+ onPressed: () {
+ if (!isUpSalesEmpty) {
+ context.pushNamed(AppRoutes.upSaleConfirmation.name, extra: [
+ selectedUpSales,
+ extrasTotalPrice,
+ selectedRoomUpgrade
+ ]);
+ }
+ },
+ style: ButtonStyle(
+ elevation: WidgetStateProperty.all(0),
+ backgroundColor: WidgetStateProperty.all(
+ isUpSalesEmpty ? Colors.grey : sandColor[80]),
+ foregroundColor: const WidgetStatePropertyAll(Colors.white),
+ ),
+ child: Padding(
+ padding: const EdgeInsets.symmetric(vertical: 16.0),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Text(
+ "generic_continue".tr(),
+ style: theme.textTheme.headlineSmall
+ ?.copyWith(color: Colors.white),
+ ),
+ ],
+ )),
+ ),
+ ),
+ );
+ }
+}
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 3f8f0689..b5d77af7 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
@@ -1,24 +1,24 @@
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/up_sales/components/comwell_radio_button.dart';
import 'package:comwell_key_app/up_sales/components/tags.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';
class UpSalesServicesWidget extends StatelessWidget {
final double width;
final double height;
- final RoomUpgrade roomUpgrade;
+ final Upgrade upgrade;
final bool? isSelected;
final bool? isPopular;
- final Function(RoomUpgrade)? onTap;
+ final Function(Upgrade)? onTap;
final bool showRadioButton;
- final List<RoomUpgrade>? selectedUpSales;
+ final List<Upgrade>? selectedUpSales;
const UpSalesServicesWidget(
{super.key,
this.width = 328,
this.height = 252,
- required this.roomUpgrade,
+ required this.upgrade,
this.isSelected,
this.isPopular,
this.onTap,
@@ -55,7 +55,7 @@ class UpSalesServicesWidget extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- Text(roomUpgrade.name,
+ Text(upgrade.name,
style: theme.textTheme.headlineMedium),
],
),
@@ -66,15 +66,15 @@ class UpSalesServicesWidget extends StatelessWidget {
Row(
children: [
Text(
- "total_charge_value".tr(args: [roomUpgrade.price]),
+ "total_charge_value".tr(args: [upgrade.price.toString()]),
style: theme.textTheme.headlineMedium,
),
const SizedBox(width: 8),
if (showRadioButton)
ComwellRadioButton(
- selected: selectedUpSales?.contains(roomUpgrade) ?? false,
+ selected: selectedUpSales?.any((e) => e.id == upgrade.id) ?? false,
onTap: () {
- onTap?.call(roomUpgrade);
+ onTap?.call(upgrade);
}),
],
),
@@ -86,12 +86,12 @@ class UpSalesServicesWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (isPopular!)
- TagWidget(text: roomUpgrade.tags.first.toUpperCase()),
+ TagWidget(text: upgrade.tags.first.toUpperCase()),
const SizedBox(height: 8),
SizedBox(
width: 250,
child: Text(
- roomUpgrade.description,
+ upgrade.description,
style: theme.textTheme.bodySmall?.copyWith(
color: colorHeadlineText,
),
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 31128857..842e28a3 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
@@ -1,37 +1,42 @@
import 'package:comwell_key_app/common/const.dart';
-import 'package:comwell_key_app/up_sales/components/comwell_radio_button.dart';
import 'package:comwell_key_app/up_sales/components/upgrades_counter.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:comwell_key_app/themes/light_theme.dart';
+import 'package:comwell_key_app/up_sales/components/comwell_radio_button.dart';
class UpSalesUpgradesWidget extends StatelessWidget {
final double width;
final double height;
- final RoomUpgrade roomUpgrade;
+ final Upgrade upgrade;
final bool isSelected;
final String routeName;
final bool showCounter;
- final Function(RoomUpgrade) onTap;
- final List<RoomUpgrade> selectedUpSales;
- const UpSalesUpgradesWidget(
- {super.key,
- this.width = 328,
- this.height = 268,
- required this.roomUpgrade,
- this.isSelected = false,
- required this.routeName,
- this.showCounter = false,
- required this.onTap,
- required this.selectedUpSales,
- });
+ final Function(Upgrade) onTap;
+ final List<Upgrade> selectedUpSales;
+ const UpSalesUpgradesWidget({
+ super.key,
+ this.width = 328,
+ this.height = 268,
+ required this.upgrade,
+ this.isSelected = false,
+ required this.routeName,
+ this.showCounter = false,
+ required this.onTap,
+ required this.selectedUpSales,
+ });
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
- final quantity =
- selectedUpSales.where((element) => element.id == roomUpgrade.id).length;
+
+ // Find the AddOnUpgrade with the same ID and get its quantity
+ final quantity = showCounter
+ ? selectedUpSales
+ .where((element) => element.id == upgrade.id)
+ .firstOrNull?.quantity ?? 0
+ : 0;
return AnimatedContainer(
duration: const Duration(milliseconds: 300),
@@ -58,13 +63,13 @@ class UpSalesUpgradesWidget extends StatelessWidget {
topRight: Radius.circular(10),
),
child: Image.asset(
- roomUpgrade.images?.first ?? kPlaceholderImage,
+ kPlaceholderImage,
height: 180,
width: double.infinity,
fit: BoxFit.cover,
),
),
- if (roomUpgrade.tags.firstOrNull != null)
+ if (upgrade.tags.firstOrNull != null)
Positioned(
top: 16,
right: 16,
@@ -76,7 +81,7 @@ class UpSalesUpgradesWidget extends StatelessWidget {
borderRadius: BorderRadius.circular(32),
),
child: Text(
- '${roomUpgrade.tags.first} m2',
+ '${upgrade.tags.first} m2',
style: theme.textTheme.headlineMedium
?.copyWith(fontSize: 11),
),
@@ -99,7 +104,7 @@ class UpSalesUpgradesWidget extends StatelessWidget {
children: [
Flexible(
child: Text(
- roomUpgrade.name,
+ upgrade.name,
style: theme.textTheme.headlineMedium,
maxLines: 1,
overflow: TextOverflow.visible,
@@ -110,18 +115,19 @@ class UpSalesUpgradesWidget extends StatelessWidget {
children: [
Text(
"total_charge_value"
- .tr(args: [roomUpgrade.price]),
+ .tr(args: [upgrade.price.toString()]),
style: theme.textTheme.headlineMedium,
),
const SizedBox(width: 8),
showCounter
? UpgradesCounter(quantity: quantity)
: ComwellRadioButton(
- selected: selectedUpSales.contains(roomUpgrade),
- onTap: () {
- onTap.call(roomUpgrade);
- },
- ),
+ 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 13268fdc..ed7c1caa 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
@@ -1,96 +1,92 @@
import 'package:bloc/bloc.dart';
+import 'package:comwell_key_app/overview/models/booking.dart';
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/room_upgrade_extra.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';
class UpSalesCubit extends Cubit<UpSalesState> {
final UpSalesRepository upSaleRepository;
- List<RoomUpgrade> upSales = [];
- late RoomUpgradeExtra extra;
+ final UpSales upSales;
+ final Booking booking;
- UpSalesCubit({required this.upSaleRepository})
+ UpSalesCubit(
+ {required this.upSaleRepository,
+ required this.upSales,
+ required this.booking})
: super(UpSalesState.initial());
- UpSalesCubit.withExtra({required this.upSaleRepository, required this.extra})
- : super(UpSalesState.initial(quantity: extra.quantity));
-
void toggleSelected(String index) {
emit(state.copyWith(
- selected: !state.selected, quantity: state.quantity, upSales: upSales));
+ selected: !state.selected,
+ availableRoomUpgrades: upSales.roomUpgrades));
}
void init() async {
emit(UpSalesState(
selected: false,
- upSales: upSales,
+ addOnUpgrades: upSales.addOnUpgrades,
+ availableRoomUpgrades: upSales.roomUpgrades,
selectedUpSales: const [],
+ selectedRoomUpgrade: '',
isLoading: true,
error: null));
try {
- upSales = await upSaleRepository.getMockUpSales();
-
emit(state.loaded(upSales: upSales));
} catch (e) {
emit(state.setupError(error: Exception(e)));
}
}
- void addSelected(RoomUpgrade roomUpgrade) {
- // If the new upgrade is of type "room", remove any existing room upgrades
- if (roomUpgrade.type == UpgradeType.room) {
- final filteredUpSales = state.selectedUpSales
- .where((upgrade) => upgrade.type != UpgradeType.room)
- .toList();
- emit(state.updateSelectedUpSales(
- roomUpgradeList: [...filteredUpSales, roomUpgrade]));
-
- } else {
- emit(state.addSelectedUpsales(roomUpgrade: roomUpgrade));
- }
- }
-
- void increment() {
+ void increment(String upgradeId) {
emit(state.addQuantity());
}
- void decrement() {
- if (extra.quantity > 0 || state.quantity > 0) {
- emit(state.removeQuantity());
- }
+ void decrement(String upgradeId) {
+ emit(state.removeQuantity());
}
void onContinue() {
emit(state.copyWith(selected: false));
}
- void updateUpgradeQuantity(RoomUpgrade roomUpgrade, int quantity) {
- if (quantity == 0) {
- // Remove all instances of this upgrade from selected upgrades
- final filteredUpSales = state.selectedUpSales
- .where((upgrade) => upgrade.id != roomUpgrade.id)
- .toList();
- emit(state.updateSelectedUpSales(roomUpgradeList: filteredUpSales));
- return;
+ void updateAddonUpgradeQuantity(AddOnUpgrade upgrade) {
+ emit(state.updateSelectedUpgradeWithQuantity(upgrade));
+ }
+
+ void addSelected(Upgrade upgrade) {
+ if (upgrade is RoomUpgrade) {
+ emit(state.updateRoomUpgrade(roomUpgrade: upgrade));
} else {
- final newSelectedUpSales = List.generate(quantity, (_) => roomUpgrade);
- emit(state.updateOtherUpgradeWithQuantity(
- roomUpgradeList: newSelectedUpSales));
+ emit(state.addSelectedUpsales(upgrade: upgrade));
}
}
- void removeUpgrade(RoomUpgrade roomUpgrade) {
- emit(state.removeSelectedUpSales(roomUpgrade: roomUpgrade));
+ void removeUpgrade(Upgrade upgrade) {
+ if (upgrade is RoomUpgrade) {
+ emit(state.removeRoomUpgrade());
+ } else {
+ emit(state.removeSelectedUpSales(upgrade: upgrade));
+ }
}
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 + int.parse(upgrade.price));
+ .fold(0, (sum, upgrade) => sum + upgrade.price * upgrade.quantity) +
+ (state.selectedRoomUpgrade.isNotEmpty
+ ? upSales.roomUpgrades
+ .firstWhere((e) => e.id == state.selectedRoomUpgrade)
+ .price
+ : 0);
}
- int extrasTotalQuantity(RoomUpgrade roomUpgrade) {
+ int extrasTotalQuantity(Upgrade upgrade) {
return state.selectedUpSales
- .where((element) => element.id == roomUpgrade.id)
+ .where((element) => element.id == upgrade.id)
.length;
}
@@ -98,9 +94,21 @@ class UpSalesCubit extends Cubit<UpSalesState> {
emit(state.copyWith(termsAccepted: !state.termsAccepted));
}
- Future<void> confirmUpSales() async {
- // Simulate network/API call
+ 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 ?? '';
+
+ // 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));
- // You can add logic here to update state if needed
}
}
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 0b9cd7ee..051a2a8a 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,31 +1,45 @@
+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:comwell_key_app/up_sales/models/up_sales.dart';
import 'package:equatable/equatable.dart';
class UpSalesState extends Equatable {
final bool selected;
- final List<RoomUpgrade> upSales;
- final List<RoomUpgrade> selectedUpSales;
+ final List<AddOnUpgrade> addOnUpgrades;
+ final List<RoomUpgrade> availableRoomUpgrades;
+ final List<Upgrade> selectedUpSales;
+ final String selectedRoomUpgrade;
final Exception? error;
final bool isLoading;
- final int quantity;
final bool termsAccepted;
const UpSalesState({
required this.selected,
- required this.upSales,
+ required this.addOnUpgrades,
+ required this.availableRoomUpgrades,
required this.selectedUpSales,
+ required this.selectedRoomUpgrade,
this.error,
required this.isLoading,
- this.quantity = 0,
this.termsAccepted = false,
});
@override
- List<Object?> get props => [selected, upSales, selectedUpSales, quantity, termsAccepted];
+ List<Object?> get props => [
+ selected,
+ addOnUpgrades,
+ availableRoomUpgrades,
+ selectedUpSales,
+ selectedRoomUpgrade,
+ termsAccepted
+ ];
- UpSalesState.initial({this.quantity = 0})
+ UpSalesState.initial()
: selected = false,
- upSales = [],
+ addOnUpgrades = [],
+ availableRoomUpgrades = [],
selectedUpSales = [],
+ selectedRoomUpgrade = '',
error = null,
isLoading = false,
termsAccepted = false;
@@ -35,54 +49,112 @@ class UpSalesState extends Equatable {
UpSalesState preRegLoading() => copyWith(isLoading: true);
- UpSalesState loaded({required List<RoomUpgrade> upSales}) =>
- copyWith(isLoading: false, upSales: upSales);
+ UpSalesState loaded({required UpSales upSales}) =>
+ copyWith(isLoading: false, availableRoomUpgrades: upSales.roomUpgrades);
- UpSalesState addSelectedUpsales({required RoomUpgrade roomUpgrade}) =>
- copyWith(selectedUpSales: [...selectedUpSales, roomUpgrade]);
+ UpSalesState addSelectedUpsales({required Upgrade upgrade}) {
+ if (upgrade is AddOnUpgrade) {
+ final newUpsale = upgrade.copyWith(quantity: 1);
+ return copyWith(selectedUpSales: [...selectedUpSales, newUpsale], selectedRoomUpgrade: selectedRoomUpgrade);
+ } else {
+ return copyWith(selectedUpSales: [...selectedUpSales, upgrade], selectedRoomUpgrade: selectedRoomUpgrade);
+ }
+ }
- UpSalesState updateSelectedUpSales({required List<RoomUpgrade> roomUpgradeList}) =>
- copyWith(selectedUpSales: roomUpgradeList);
+ UpSalesState updateSelectedUpSales({
+ required List<Upgrade> upgradeList,
+ }) {
+ if (upgradeList.isEmpty) return this;
+ return copyWith(selectedUpSales: upgradeList, selectedRoomUpgrade: selectedRoomUpgrade);
+ }
UpSalesState updateOtherUpgradeWithQuantity(
- {required List<RoomUpgrade> roomUpgradeList}) {
- if (roomUpgradeList.isEmpty) return this;
-
+ {required List<Upgrade> upgradeList}) {
+ if (upgradeList.isEmpty) return this;
+
// Get the ID of the item we're updating
- final String updateItemId = roomUpgradeList.first.id;
-
+ final String updateItemId = upgradeList.first.id;
+
// Remove existing items with the same ID
- final existingItems = selectedUpSales
- .where((upgrade) => upgrade.id != updateItemId)
- .toList();
-
+ final existingItems =
+ selectedUpSales.where((upgrade) => upgrade.id != updateItemId).toList();
+
// Add the new items while preserving other items
- return copyWith(selectedUpSales: [...existingItems, ...roomUpgradeList]);
+ return copyWith(selectedUpSales: [...existingItems, ...upgradeList], selectedRoomUpgrade: selectedRoomUpgrade);
}
- UpSalesState removeSelectedUpSales({required RoomUpgrade roomUpgrade}) =>
- copyWith(selectedUpSales: selectedUpSales.where((upgrade) => upgrade.id != roomUpgrade.id).toList());
+ UpSalesState updateRoomUpgrade({required RoomUpgrade roomUpgrade}) =>
+ copyWith(selectedRoomUpgrade: roomUpgrade.id);
+
+ UpSalesState removeRoomUpgrade() => copyWith(selectedRoomUpgrade: '');
+
+ UpSalesState removeSelectedUpSales({required Upgrade upgrade}) => copyWith(
+ selectedUpSales:
+ selectedUpSales.where((item) => item.id != upgrade.id).toList(),
+ selectedRoomUpgrade: selectedRoomUpgrade);
- UpSalesState addQuantity() => copyWith(quantity: quantity + 1);
+ UpSalesState addQuantity() => copyWith(
+ addOnUpgrades: addOnUpgrades
+ .map((e) => e.copyWith(quantity: e.quantity + 1))
+ .toList(),
+ selectedRoomUpgrade: selectedRoomUpgrade);
- UpSalesState removeQuantity() => copyWith(quantity: quantity - 1);
+ UpSalesState removeQuantity() => copyWith(
+ addOnUpgrades: addOnUpgrades
+ .map((e) => e.copyWith(quantity: e.quantity - 1))
+ .toList(),
+ selectedRoomUpgrade: selectedRoomUpgrade);
+
+ UpSalesState addQuantityForUpgrade(String upgradeId) => copyWith(
+ addOnUpgrades: addOnUpgrades
+ .map((e) =>
+ e.id == upgradeId ? e.copyWith(quantity: e.quantity + 1) : e)
+ .toList(),
+ selectedRoomUpgrade: selectedRoomUpgrade);
+
+ UpSalesState removeQuantityForUpgrade(String upgradeId) => copyWith(
+ addOnUpgrades: addOnUpgrades
+ .map((e) => e.id == upgradeId && e.quantity > 0
+ ? e.copyWith(quantity: e.quantity - 1)
+ : e)
+ .toList(),
+ selectedRoomUpgrade: selectedRoomUpgrade);
+
+ UpSalesState updateSelectedUpgradeWithQuantity(AddOnUpgrade upgrade) {
+ // Remove any existing instance of this upgrade from selectedUpSales
+ final existingItems =
+ selectedUpSales.where((item) => item.id != upgrade.id).toList();
+
+ // If quantity is 0, just remove the upgrade from selectedUpSales
+ if (upgrade.quantity <= 0) {
+ return copyWith(selectedUpSales: existingItems, selectedRoomUpgrade: selectedRoomUpgrade);
+ }
+
+ // Add the new upgrade to selectedUpSales
+ final updatedSelectedUpSales = [...existingItems, upgrade];
+
+ return copyWith(selectedUpSales: updatedSelectedUpSales, selectedRoomUpgrade: selectedRoomUpgrade);
+ }
UpSalesState copyWith({
bool? selected,
- List<RoomUpgrade>? upSales,
- List<RoomUpgrade>? selectedUpSales,
+ List<AddOnUpgrade>? addOnUpgrades,
+ List<RoomUpgrade>? availableRoomUpgrades,
+ List<Upgrade>? selectedUpSales,
+ String? selectedRoomUpgrade,
bool? isLoading,
Exception? error,
- int? quantity,
bool? termsAccepted,
}) {
return UpSalesState(
selected: selected ?? this.selected,
- upSales: upSales ?? this.upSales,
+ addOnUpgrades: addOnUpgrades ?? this.addOnUpgrades,
+ availableRoomUpgrades:
+ availableRoomUpgrades ?? this.availableRoomUpgrades,
+ selectedRoomUpgrade: selectedRoomUpgrade ?? this.selectedRoomUpgrade,
selectedUpSales: selectedUpSales ?? this.selectedUpSales,
isLoading: isLoading ?? this.isLoading,
error: error ?? this.error,
- quantity: quantity ?? this.quantity,
termsAccepted: termsAccepted ?? this.termsAccepted,
);
}
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
new file mode 100644
index 00000000..71990201
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/mappers/addon_upgrade_mapper.dart
@@ -0,0 +1,23 @@
+import 'package:comwell_key_app/up_sales/models/dto/addon_upgrade_dto.dart';
+import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
+
+extension AddOnUpgradeDTOMapper on AddOnUpgradeDTO {
+ AddOnUpgrade toAddOnUpgrade() {
+ return AddOnUpgrade(
+ id: id,
+ name: name,
+ price: price,
+ currency: currency,
+ isSelected: isSelected,
+ images: images,
+ description: description,
+ tags: tags,
+ quantity: quantity ?? 0,
+ isService: isService);
+ }
+}
+
+extension ListAddOnUpgradeMapper on List<AddOnUpgradeDTO> {
+ List<AddOnUpgrade> toAddOnUpgrades() =>
+ map((dto) => dto.toAddOnUpgrade()).toList();
+}
diff --git a/comwell_key_app/lib/up_sales/mappers/room_facility_mapper.dart b/comwell_key_app/lib/up_sales/mappers/room_facility_mapper.dart
deleted file mode 100644
index bcb2fdd9..00000000
--- a/comwell_key_app/lib/up_sales/mappers/room_facility_mapper.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-import 'package:comwell_key_app/up_sales/models/dto/room_facility_dto.dart';
-import 'package:comwell_key_app/up_sales/models/room_facility.dart';
-
-extension RoomFacilityDTOMapper on RoomFacilityDTO {
- RoomFacility toRoomFacility() {
- return RoomFacility(name: name, icon: icon, facilityType: FacilityType.fromString(facilityType));
- }
-}
-
-extension ListRoomFacilityMapper on Iterable<RoomFacilityDTO> {
- Iterable<RoomFacility> toRoomFacilities() =>
- map((dto) => dto.toRoomFacility());
-}
-
diff --git a/comwell_key_app/lib/up_sales/mappers/room_upgrade_mapper.dart b/comwell_key_app/lib/up_sales/mappers/room_upgrade_mapper.dart
index 90520963..056bfaf6 100644
--- a/comwell_key_app/lib/up_sales/mappers/room_upgrade_mapper.dart
+++ b/comwell_key_app/lib/up_sales/mappers/room_upgrade_mapper.dart
@@ -1,4 +1,3 @@
-import 'package:comwell_key_app/up_sales/mappers/room_facility_mapper.dart';
import 'package:comwell_key_app/up_sales/models/dto/room_upgrade_dto.dart';
import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
@@ -6,14 +5,15 @@ import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
extension RoomUpgradeDTOMapper on RoomUpgradeDTO {
RoomUpgrade toRoomUpgrade() {
return RoomUpgrade(
+ id: id,
name: name,
price: price,
+ currency: currency,
images: images,
description: description,
- id: id,
- tags: tags,
- facilities: facilities.toRoomFacilities(),
- type: UpgradeType.fromString(type));
+ tags: tags,
+ quantity: quantity ?? 0,
+ );
}
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
new file mode 100644
index 00000000..5d781053
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/mappers/up_sales_mapper.dart
@@ -0,0 +1,14 @@
+import 'package:comwell_key_app/up_sales/mappers/addon_upgrade_mapper.dart';
+import 'package:comwell_key_app/up_sales/mappers/room_upgrade_mapper.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';
+
+extension UpSalesDTOMapper on UpSalesDTO {
+ UpSales toUpSales() {
+ 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_list.dart b/comwell_key_app/lib/up_sales/models/addon_list.dart
new file mode 100644
index 00000000..fc0c8431
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/models/addon_list.dart
@@ -0,0 +1,19 @@
+import 'package:json_annotation/json_annotation.dart';
+
+part '../../.generated/up_sales/models/addon_list.g.dart';
+
+@JsonSerializable()
+class AddOnList {
+ final String itemCode;
+ final int quantity;
+
+ AddOnList({required this.itemCode, required this.quantity});
+
+ @override
+ String toString() {
+ return 'AddOnList(itemCode: $itemCode, quantity: $quantity)';
+ }
+
+ factory AddOnList.fromJson(Map<String, dynamic> json) => _$AddOnListFromJson(json);
+ Map<String, dynamic> toJson() => _$AddOnListToJson(this);
+}
\ 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
new file mode 100644
index 00000000..b783645e
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/models/addon_upgrade.dart
@@ -0,0 +1,56 @@
+import 'package:comwell_key_app/up_sales/models/upgrade.dart';
+
+class AddOnUpgrade extends Upgrade {
+ final bool isSelected;
+ final bool isService;
+ AddOnUpgrade({
+ required super.id,
+ required super.name,
+ required super.price,
+ required super.currency,
+ required super.images,
+ required super.description,
+ required super.tags,
+ required super.quantity,
+ required this.isSelected,
+ required this.isService,
+ });
+
+ @override
+ String toString() {
+ return 'AddOnUpgrade(id: $id, name: $name, price: $price, currency: $currency, isSelected: $isSelected, images: $images, description: $description, tags: $tags, isService: $isService, quantity: $quantity)';
+ }
+
+ AddOnUpgrade copyWith({
+ int? quantity,
+ bool? isSelected,
+ bool? isService,
+ }) {
+ return AddOnUpgrade(
+ id: id,
+ name: name,
+ price: price,
+ currency: currency,
+ images: images,
+ description: description,
+ tags: tags,
+ quantity: quantity ?? this.quantity,
+ isSelected: isSelected ?? this.isSelected,
+ isService: isService ?? this.isService,
+ );
+ }
+
+}
+
+enum FacilityType {
+ bed,
+ electronics,
+ bathroom,
+ business,
+ service,
+ room;
+
+ static FacilityType fromString(String value) {
+ return FacilityType.values.firstWhere((e) => e.name == value.toLowerCase());
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 00000000..e4f7f648
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/models/dto/addon_upgrade_dto.dart
@@ -0,0 +1,35 @@
+import 'package:comwell_key_app/utils/json.dart';
+import 'package:json_annotation/json_annotation.dart';
+
+part '../../../.generated/up_sales/models/dto/addon_upgrade_dto.g.dart';
+
+@JsonSerializable()
+class AddOnUpgradeDTO {
+ final String id;
+ final String name;
+ final int price;
+ final String currency;
+ final bool isSelected;
+ final Iterable<String> images;
+ final String description;
+ final Iterable<String> tags;
+ final int? quantity;
+ final bool isService;
+
+ AddOnUpgradeDTO(
+ {required this.id,
+ required this.name,
+ required this.price,
+ required this.currency,
+ required this.isSelected,
+ required this.images,
+ required this.description,
+ required this.tags,
+ this.quantity,
+ 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_facility_dto.dart b/comwell_key_app/lib/up_sales/models/dto/room_facility_dto.dart
deleted file mode 100644
index a743407c..00000000
--- a/comwell_key_app/lib/up_sales/models/dto/room_facility_dto.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-import 'package:comwell_key_app/utils/json.dart';
-import 'package:json_annotation/json_annotation.dart';
-
-part '../../../.generated/up_sales/models/dto/room_facility_dto.g.dart';
-
-@JsonSerializable()
-class RoomFacilityDTO {
- final String name;
- final String icon;
- final String facilityType;
-
-
- RoomFacilityDTO({required this.name, required this.icon, required this.facilityType});
-
- Json toJson() => _$RoomFacilityDTOToJson(this);
-
- factory RoomFacilityDTO.fromJson(Map<String, dynamic> json) =>
- _$RoomFacilityDTOFromJson(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 22ef0fd3..bd91282e 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,4 +1,4 @@
-import 'package:comwell_key_app/up_sales/models/dto/room_facility_dto.dart';
+import 'package:comwell_key_app/up_sales/models/dto/addon_upgrade_dto.dart';
import 'package:comwell_key_app/utils/json.dart';
import 'package:json_annotation/json_annotation.dart';
@@ -6,24 +6,24 @@ part '../../../.generated/up_sales/models/dto/room_upgrade_dto.g.dart';
@JsonSerializable()
class RoomUpgradeDTO {
+ final String id;
final String name;
- final String price;
+ final int price;
+ final String currency;
final Iterable<String> images;
final String description;
- final String id;
final Iterable<String> tags;
- final Iterable<RoomFacilityDTO> facilities;
- final String type;
+ final int? quantity;
RoomUpgradeDTO(
- {required this.name,
+ {required this.id,
+ required this.name,
required this.price,
required this.images,
required this.description,
- required this.id,
required this.tags,
- required this.facilities,
- required this.type});
+ required this.currency,
+ this.quantity});
Json toJson() => _$RoomUpgradeDTOToJson(this);
diff --git a/comwell_key_app/lib/up_sales/models/dto/up_sales_dto.dart b/comwell_key_app/lib/up_sales/models/dto/up_sales_dto.dart
new file mode 100644
index 00000000..2a5f22a9
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/models/dto/up_sales_dto.dart
@@ -0,0 +1,21 @@
+import 'package:comwell_key_app/up_sales/models/dto/addon_upgrade_dto.dart';
+import 'package:comwell_key_app/up_sales/models/dto/room_upgrade_dto.dart';
+import 'package:json_annotation/json_annotation.dart';
+
+part '../../../.generated/up_sales/models/dto/up_sales_dto.g.dart';
+
+@JsonSerializable()
+class UpSalesDTO {
+ final String property;
+ final String confirmationNumber;
+ @JsonKey(name: 'roomUpgrades', defaultValue: [])
+ final List<RoomUpgradeDTO> roomUpgrades;
+ @JsonKey(name: 'addonUpgrades', defaultValue: [])
+ final List<AddOnUpgradeDTO> addOnUpgrades;
+
+ UpSalesDTO({required this.property, required this.confirmationNumber, required this.roomUpgrades, required this.addOnUpgrades});
+
+ factory UpSalesDTO.fromJson(Map<String, dynamic> json) => _$UpSalesDTOFromJson(json);
+
+ Map<String, dynamic> toJson() => _$UpSalesDTOToJson(this);
+}
\ No newline at end of file
diff --git a/comwell_key_app/lib/up_sales/models/room_facility.dart b/comwell_key_app/lib/up_sales/models/room_facility.dart
deleted file mode 100644
index 6d26bf49..00000000
--- a/comwell_key_app/lib/up_sales/models/room_facility.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-class RoomFacility {
- final String name;
- final String icon;
- final FacilityType facilityType;
- RoomFacility({required this.name, required this.icon, required this.facilityType});
-
- @override
- String toString() {
- return 'RoomFacility(name: $name, icon: $icon)';
- }
-
-}
-
-enum FacilityType {
- bed,
- electronics,
- bathroom,
- business,
- service,
- room;
-
- static FacilityType fromString(String value) {
- return FacilityType.values.firstWhere((e) => e.name == value.toLowerCase());
- }
-}
\ 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 96bbc457..e3e81cf3 100644
--- a/comwell_key_app/lib/up_sales/models/room_upgrade.dart
+++ b/comwell_key_app/lib/up_sales/models/room_upgrade.dart
@@ -1,33 +1,26 @@
-import 'package:comwell_key_app/up_sales/models/room_facility.dart';
+import 'package:comwell_key_app/up_sales/models/upgrade.dart';
-class RoomUpgrade {
- final String name;
- final String price;
- final Iterable<String>? images;
- final String description;
- final String id;
- final Iterable<String> tags;
- final Iterable<RoomFacility>? facilities;
- final UpgradeType type;
- RoomUpgrade(
- {required this.name,
- required this.price,
- required this.images,
- required this.description,
- required this.id,
- required this.tags,
- required this.facilities,
- required this.type});
+class RoomUpgrade extends Upgrade {
+ RoomUpgrade({
+ required super.id,
+ required super.name,
+ required super.price,
+ required super.currency,
+ required super.images,
+ required super.description,
+ required super.tags,
+ required super.quantity,
+ });
RoomUpgrade copyWith({
String? name,
- String? price,
+ int? price,
Iterable<String>? images,
String? description,
String? id,
Iterable<String>? tags,
- Iterable<RoomFacility>? facilities,
- UpgradeType? type,
+ String? currency,
+ int? quantity,
}) {
return RoomUpgrade(
name: name ?? this.name,
@@ -36,19 +29,19 @@ class RoomUpgrade {
description: description ?? this.description,
id: id ?? this.id,
tags: tags ?? this.tags,
- facilities: facilities ?? this.facilities,
- type: type ?? this.type,
+ currency: currency ?? this.currency,
+ quantity: quantity ?? this.quantity,
);
}
@override
String toString() {
- return "RoomUpgrade(name: $name, price: $price, images: $images, description: $description, id: $id, tags: $tags, facilities: $facilities, type: $type)";
+ return "RoomUpgrade(name: $name, price: $price, images: $images, description: $description, id: $id, tags: $tags, currency: $currency)";
}
@override
List<Object?> get props =>
- [name, price, images, description, id, tags, facilities, type];
+ [name, price, images, description, id, tags, currency];
}
enum UpgradeType {
diff --git a/comwell_key_app/lib/up_sales/models/room_upgrade_extra.dart b/comwell_key_app/lib/up_sales/models/room_upgrade_extra.dart
index 7ee4b2d5..1865078f 100644
--- a/comwell_key_app/lib/up_sales/models/room_upgrade_extra.dart
+++ b/comwell_key_app/lib/up_sales/models/room_upgrade_extra.dart
@@ -1,8 +1,8 @@
-import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
+import 'package:comwell_key_app/up_sales/models/upgrade.dart';
class RoomUpgradeExtra {
- final RoomUpgrade roomUpgrade;
+ final Upgrade upgrade;
int quantity = 0;
- RoomUpgradeExtra({required this.roomUpgrade, required this.quantity});
+ RoomUpgradeExtra({required this.upgrade, required this.quantity});
}
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 b0561461..82267dd2 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,8 +1,12 @@
+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 RoomUpgrade roomUpgrade;
- final List<RoomUpgrade> roomUpgrades;
+ final RoomUpgrade? roomUpgrade;
+ final AddOnUpgrade? addOnUpgrade;
+ final bool isRoomUpgradeSelected;
+
+ RoomUpgradeList({this.roomUpgrade, this.addOnUpgrade, required this.isRoomUpgradeSelected});
+
+}
- RoomUpgradeList({required this.roomUpgrade, required this.roomUpgrades});
-}
\ No newline at end of file
diff --git a/comwell_key_app/lib/up_sales/models/up_sales.dart b/comwell_key_app/lib/up_sales/models/up_sales.dart
new file mode 100644
index 00000000..b158e1a4
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/models/up_sales.dart
@@ -0,0 +1,20 @@
+import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
+import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
+import 'package:equatable/equatable.dart';
+
+class UpSales extends Equatable {
+ final String property;
+ final String confirmationNumber;
+ final List<RoomUpgrade> roomUpgrades;
+ final List<AddOnUpgrade> addOnUpgrades;
+
+ const UpSales({required this.property, required this.confirmationNumber, required this.roomUpgrades, required this.addOnUpgrades});
+
+ @override
+ String toString() {
+ return 'UpSales(property: $property, confirmationNumber: $confirmationNumber, roomUpgrades: $roomUpgrades, addOnUpgrades: $addOnUpgrades)';
+ }
+
+ @override
+ List<Object?> get props => [property, confirmationNumber, roomUpgrades, addOnUpgrades];
+}
\ No newline at end of file
diff --git a/comwell_key_app/lib/up_sales/models/upgrade.dart b/comwell_key_app/lib/up_sales/models/upgrade.dart
new file mode 100644
index 00000000..37fcad29
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/models/upgrade.dart
@@ -0,0 +1,23 @@
+
+abstract class Upgrade {
+ final String id;
+ final String name;
+ final int price;
+ final String currency;
+ final Iterable<String> images;
+ final String description;
+ final Iterable<String> tags;
+ final int quantity;
+
+ const Upgrade({
+ required this.id,
+ required this.name,
+ required this.price,
+ required this.currency,
+ required this.images,
+ required this.description,
+ required this.tags,
+ required this.quantity,
+ });
+
+}
\ 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
new file mode 100644
index 00000000..d91f4085
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/pages/addon_upgrade_page.dart
@@ -0,0 +1,125 @@
+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/item_counter.dart';
+import 'package:comwell_key_app/up_sales/cubit/up_sales_cubit.dart';
+import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import '../../themes/light_theme.dart';
+import '../components/up_sales_bottom_button.dart';
+
+class AddonUpgradePage extends StatelessWidget {
+ final AddOnUpgrade addonUpgrade;
+ const AddonUpgradePage({super.key, required this.addonUpgrade});
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+ final width = MediaQuery.of(context).size.width;
+ final height = MediaQuery.of(context).size.height;
+ final cubit = context.read<UpSalesCubit>();
+
+
+ return Scaffold(
+ backgroundColor: Theme.of(context).colorScheme.surface,
+ appBar: const ComwellAppBar(),
+ extendBodyBehindAppBar: true,
+ body: Column(
+ children: [
+ // Image
+ Stack(
+ children: [
+ ClipRRect(
+ borderRadius: const BorderRadius.only(
+ 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,
+ ),
+ ),
+ Container(
+ decoration: const BoxDecoration(
+ borderRadius: BorderRadius.all(Radius.circular(12)),
+ gradient: LinearGradient(
+ begin: Alignment.topCenter,
+ end: Alignment.bottomCenter,
+ colors: [
+ Colors.black26,
+ Colors.black54,
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ Container(
+ width: double.infinity,
+ color: Theme.of(context).colorScheme.surface,
+ padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 24),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(addonUpgrade.name,
+ style: theme.textTheme.headlineLarge),
+ Text(
+ "total_charge_value"
+ .tr(args: [addonUpgrade.price.toString()]),
+ style: theme.textTheme.headlineLarge),
+ ],
+ ),
+ const SizedBox(height: 12),
+ SizedBox(
+ width: width * 0.8,
+ child: Text(
+ addonUpgrade.description,
+ style: theme.textTheme.bodySmall
+ ?.copyWith(color: colorHeadlineText),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ bottomNavigationBar: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ const Divider(color: colorDivider),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ ItemCounter(addonUpgrade: addonUpgrade),
+ Expanded(
+ flex: 2,
+ child: UpSalesBottomButton(
+ onAddUpSale: () {
+ Navigator.pop(context, addonUpgrade.copyWith(quantity: cubit.state.addOnUpgrades.firstWhere((e) => e.id == addonUpgrade.id).quantity));
+ },
+ onContinue: () {
+ Navigator.pop(context, addonUpgrade.copyWith(quantity: cubit.state.addOnUpgrades.firstWhere((e) => e.id == addonUpgrade.id).quantity));
+ },
+ selectedUpSales: cubit.state.selectedUpSales,
+ extrasTotalPrice: cubit.extrasTotalPrice,
+ selectedRoomUpgrade: cubit.state.selectedRoomUpgrade,
+ children: [Text('add_to_booking'.tr())],
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/up_sales/pages/other_upgrade_page.dart b/comwell_key_app/lib/up_sales/pages/other_upgrade_page.dart
deleted file mode 100644
index 7889a528..00000000
--- a/comwell_key_app/lib/up_sales/pages/other_upgrade_page.dart
+++ /dev/null
@@ -1,121 +0,0 @@
-import 'package:comwell_key_app/common/components/comwell_app_bar.dart';
-import 'package:comwell_key_app/up_sales/components/item_counter.dart';
-import 'package:comwell_key_app/up_sales/cubit/up_sales_cubit.dart';
-import 'package:comwell_key_app/up_sales/models/room_upgrade_extra.dart';
-import 'package:easy_localization/easy_localization.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
-import '../../themes/light_theme.dart';
-import '../components/up_sales_bottom_button.dart';
-
-class OtherUpgradePage extends StatelessWidget {
- final RoomUpgradeExtra extra;
- const OtherUpgradePage({super.key, required this.extra});
-
- @override
- Widget build(BuildContext context) {
- final theme = Theme.of(context);
- final width = MediaQuery.of(context).size.width;
- final height = MediaQuery.of(context).size.height;
- final cubit = context.read<UpSalesCubit>();
-
- return Scaffold(
- backgroundColor: Theme.of(context).colorScheme.surface,
- appBar: const ComwellAppBar(),
- extendBodyBehindAppBar: true,
- body: Column(
- children: [
- // Image
- Stack(
- children: [
- ClipRRect(
- borderRadius: const BorderRadius.only(
- topLeft: Radius.circular(10),
- topRight: Radius.circular(10),
- ),
- child: Image.asset(
- extra.roomUpgrade.images!.first,
- height: height * 0.5,
- width: double.infinity,
- fit: BoxFit.cover,
- ),
- ),
- Container(
- decoration: const BoxDecoration(
- borderRadius: BorderRadius.all(Radius.circular(12)),
- gradient: LinearGradient(
- begin: Alignment.topCenter,
- end: Alignment.bottomCenter,
- colors: [
- Colors.black26,
- Colors.black54,
- ],
- ),
- ),
- ),
- ],
- ),
- Container(
- width: double.infinity,
- color: Theme.of(context).colorScheme.surface,
- padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 24),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Text(extra.roomUpgrade.name,
- style: theme.textTheme.headlineLarge),
- Text("total_charge_value"
- .tr(args: [extra.roomUpgrade.price]),
- style: theme.textTheme.headlineLarge),
- ],
- ),
- const SizedBox(height: 12),
- SizedBox(
- width: width * 0.8,
- child: Text(
- extra.roomUpgrade.description,
- style: theme.textTheme.bodySmall
- ?.copyWith(color: colorHeadlineText),
- ),
- ),
- ],
- ),
- ),
- ],
- ),
- bottomNavigationBar: Column(
- mainAxisSize: MainAxisSize.min,
- crossAxisAlignment: CrossAxisAlignment.start,
- mainAxisAlignment: MainAxisAlignment.start,
- children: [
- const Divider(color: colorDivider),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- ItemCounter(extra: extra),
- Expanded(
- flex: 2,
- child: UpSalesBottomButton(
- onAddUpSale: () {
- cubit.increment();
- Navigator.pop(context, cubit.state.quantity);
- },
- onContinue: () {
- Navigator.pop(context, cubit.state.quantity);
- },
- selectedUpSales: cubit.state.selectedUpSales,
- extrasTotalPrice: cubit.extrasTotalPrice,
- children: [Text('add_to_booking'.tr())],
- ),
- ),
- ],
- ),
- ],
- ),
- );
- }
-}
diff --git a/comwell_key_app/lib/up_sales/pages/room_upgrade_page.dart b/comwell_key_app/lib/up_sales/pages/room_upgrade_page.dart
index 743e64e8..98f051bf 100644
--- a/comwell_key_app/lib/up_sales/pages/room_upgrade_page.dart
+++ b/comwell_key_app/lib/up_sales/pages/room_upgrade_page.dart
@@ -1,8 +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/themes/light_theme.dart';
-import 'package:comwell_key_app/up_sales/components/facilities_bottom_sheet.dart';
-import 'package:comwell_key_app/up_sales/components/facility_icon_text.dart';
import 'package:comwell_key_app/common/components/room_image_carousel.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';
@@ -10,7 +8,6 @@ import 'package:comwell_key_app/up_sales/cubit/up_sales_state.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:comwell_key_app/up_sales/models/room_facility.dart';
import 'package:comwell_key_app/up_sales/components/tags.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -24,15 +21,16 @@ class RoomUpgradePage extends StatefulWidget {
class _RoomUpgradePageState extends State<RoomUpgradePage> {
bool _isExpanded = false;
- List<RoomFacility> get allFacilities => [...widget.roomUpgradeList.roomUpgrade.facilities!];
+ List<String> get allFacilities => [...widget.roomUpgradeList.roomUpgrade?.tags ?? []];
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
- final isSelected = widget.roomUpgradeList.roomUpgrades.contains(widget.roomUpgradeList.roomUpgrade);
+ final isSelected = widget.roomUpgradeList.isRoomUpgradeSelected;
+ final height = MediaQuery.of(context).size.height;
return BlocBuilder<UpSalesCubit, UpSalesState>(builder: (context, state) {
- final cubit = context.read<UpSalesCubit>();
+ final cubit = context.read<UpSalesCubit>();
return Scaffold(
extendBodyBehindAppBar: true,
appBar: const ComwellAppBar(),
@@ -41,13 +39,14 @@ class _RoomUpgradePageState extends State<RoomUpgradePage> {
physics: const AlwaysScrollableScrollPhysics(),
child: ConstrainedBox(
constraints: BoxConstraints(
- minHeight: MediaQuery.of(context).size.height -
+ minHeight: height -
kComwellAppBarHeight -
80,
),
child: Column(
children: [
- RoomImageCarousel(images: widget.roomUpgradeList.roomUpgrade.images!.toList()),
+ RoomImageCarousel(
+ images: widget.roomUpgradeList.roomUpgrade?.images.toList() ?? []),
Container(
width: double.infinity,
decoration: BoxDecoration(
@@ -65,22 +64,25 @@ class _RoomUpgradePageState extends State<RoomUpgradePage> {
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
- Text(
- widget.roomUpgradeList.roomUpgrade.name,
- style: theme.textTheme.headlineLarge,
+ Expanded(
+ child: Text(
+ widget.roomUpgradeList.roomUpgrade?.name ?? '',
+ style: theme.textTheme.headlineLarge,
+ ),
),
const SizedBox(width: 12),
- if (widget.roomUpgradeList.roomUpgrade.tags.isNotEmpty)
+ if (widget.roomUpgradeList.roomUpgrade?.tags.isNotEmpty ?? false)
TagWidget(
- text: '${widget.roomUpgradeList.roomUpgrade.tags.first} M2',
+ text: '${widget.roomUpgradeList.roomUpgrade?.tags.first} M2',
textColor: sandColor),
],
),
const SizedBox(height: 12),
Text(
- widget.roomUpgradeList.roomUpgrade.description,
+ widget.roomUpgradeList.roomUpgrade?.description ?? '',
style: theme.textTheme.bodySmall,
maxLines: _isExpanded ? null : 3,
overflow: _isExpanded ? null : TextOverflow.ellipsis,
@@ -107,9 +109,9 @@ class _RoomUpgradePageState extends State<RoomUpgradePage> {
spacing: 8,
runSpacing: 8,
children: [
- ...widget.roomUpgradeList.roomUpgrade.facilities!.map((f) =>
- FacilityIconText(
- facility: f, showDivider: true)),
+ // ...widget.roomUpgradeList.roomUpgrade?.facilities.map((f) =>
+ // FacilityIconText(
+ // facility: f, showDivider: true)),
GestureDetector(
onTap: () => _showFacilitiesSheet(context),
child: Padding(
@@ -150,6 +152,7 @@ class _RoomUpgradePageState extends State<RoomUpgradePage> {
},
selectedUpSales: state.selectedUpSales,
extrasTotalPrice: cubit.extrasTotalPrice,
+ selectedRoomUpgrade: state.selectedRoomUpgrade,
children: [
isSelected
? Text(
@@ -163,11 +166,11 @@ class _RoomUpgradePageState extends State<RoomUpgradePage> {
?.copyWith(color: Colors.white),
),
isSelected ? Text(
- "-${"total_charge_value".tr(args: [widget.roomUpgradeList.roomUpgrade.price])}",
+ "-${"total_charge_value".tr(args: [widget.roomUpgradeList.roomUpgrade?.price.toString() ?? '0'])}",
style: theme.textTheme.headlineSmall
?.copyWith(color: Colors.white),
) : Text(
- "+${"total_charge_value".tr(args: [widget.roomUpgradeList.roomUpgrade.price])}",
+ "+${"total_charge_value".tr(args: [widget.roomUpgradeList.roomUpgrade?.price.toString() ?? '0'])}",
style: theme.textTheme.headlineSmall
?.copyWith(color: Colors.white),
),
@@ -179,7 +182,6 @@ class _RoomUpgradePageState extends State<RoomUpgradePage> {
}
void _showFacilitiesSheet(BuildContext context) {
- final height = MediaQuery.of(context).size.height;
showModalBottomSheet<void>(
context: context,
isScrollControlled: true,
@@ -188,12 +190,13 @@ class _RoomUpgradePageState extends State<RoomUpgradePage> {
borderRadius: BorderRadius.vertical(top: Radius.circular(24)),
),
builder: (context) {
- return ConstrainedBox(
- constraints: BoxConstraints(
- maxHeight: height - kComwellAppBarHeight,
- ),
- child: FacilitiesBottomSheet(facilities: allFacilities),
- );
+ // return ConstrainedBox(
+ // constraints: BoxConstraints(
+ // maxHeight: height - kComwellAppBarHeight,
+ // ),
+ // child: FacilitiesBottomSheet(facilities: allFacilities),
+ // );
+ return const SizedBox.shrink();
},
);
}
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 65c2318c..ae40afd1 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
@@ -3,6 +3,7 @@ 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/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';
@@ -17,11 +18,14 @@ class ServicesUpgradePage extends StatelessWidget {
final theme = Theme.of(context);
final width = MediaQuery.of(context).size.width;
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>();
- final bool isSelected = roomUpgradeList.roomUpgrades.contains(roomUpgradeList.roomUpgrade);
+
return Scaffold(
backgroundColor: Theme.of(context).colorScheme.surface,
appBar: const ComwellAppBar(),
@@ -69,9 +73,9 @@ class ServicesUpgradePage extends StatelessWidget {
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- Text(roomUpgradeList.roomUpgrade.name,
+ Text(roomUpgradeList.addOnUpgrade?.name ?? '',
style: theme.textTheme.headlineLarge),
- Text("total_charge_value".tr(args: [roomUpgradeList.roomUpgrade.price]),
+ Text("total_charge_value".tr(args: [roomUpgradeList.addOnUpgrade?.price.toString() ?? '0']),
style: theme.textTheme.headlineLarge),
],
),
@@ -79,7 +83,7 @@ class ServicesUpgradePage extends StatelessWidget {
SizedBox(
width: width * 0.8,
child: Text(
- roomUpgradeList.roomUpgrade.description,
+ roomUpgradeList.addOnUpgrade?.description ?? '',
style: theme.textTheme.bodySmall
?.copyWith(color: Theme.of(context).colorScheme.onSurface),
),
@@ -97,14 +101,15 @@ class ServicesUpgradePage extends StatelessWidget {
onAddUpSale: () {
Navigator.pop(context,
- [roomUpgradeList.roomUpgrade, isSelected]);
+ [roomUpgradeList.addOnUpgrade, isSelected]);
},
onContinue: () {
Navigator.pop(context,
- [roomUpgradeList.roomUpgrade, isSelected]);
+ [roomUpgradeList.addOnUpgrade, isSelected]);
},
selectedUpSales: state.selectedUpSales,
extrasTotalPrice: cubit.extrasTotalPrice,
+ selectedRoomUpgrade: state.selectedRoomUpgrade,
children: [
isSelected
? Text(
@@ -120,14 +125,14 @@ class ServicesUpgradePage extends StatelessWidget {
isSelected
? Text(
"-${"total_charge_value".tr(args: [
- roomUpgradeList.roomUpgrade.price
+ roomUpgradeList.addOnUpgrade?.price.toString() ?? '0'
])}",
style: theme.textTheme.headlineSmall
?.copyWith(color: Colors.white),
)
: Text(
"+${"total_charge_value".tr(args: [
- roomUpgradeList.roomUpgrade.price
+ 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 34d509fd..607fe1cf 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
@@ -5,6 +5,7 @@ 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/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';
@@ -13,12 +14,14 @@ import 'package:slider_button/slider_button.dart';
import 'package:url_launcher/url_launcher.dart';
class UpSaleConfirmationPage extends StatelessWidget {
- final List<RoomUpgrade> selectedUpSales;
+ final List<Upgrade> selectedUpSales;
+ final RoomUpgrade? selectedRoomUpgrade;
final int extrasTotalPrice;
const UpSaleConfirmationPage(
{super.key,
required this.selectedUpSales,
- required this.extrasTotalPrice});
+ required this.extrasTotalPrice,
+ this.selectedRoomUpgrade});
@override
Widget build(BuildContext context) {
@@ -26,10 +29,7 @@ class UpSaleConfirmationPage extends StatelessWidget {
return BlocBuilder<UpSalesCubit, UpSalesState>(
builder: (context, state) {
final cubit = context.read<UpSalesCubit>();
- final upgradesMap = <String, List<RoomUpgrade>>{};
- for (final upgrade in selectedUpSales) {
- upgradesMap.putIfAbsent(upgrade.id, () => []).add(upgrade);
- }
+
return Scaffold(
appBar: const ComwellAppBar(),
backgroundColor: Theme.of(context).colorScheme.surface,
@@ -41,38 +41,43 @@ class UpSaleConfirmationPage extends StatelessWidget {
children: [
const SizedBox(height: 8),
Text(
- 'Betalingsoversigt',
+ 'up_sales_confirmation_title'.tr(),
style: theme.textTheme.headlineLarge,
),
const SizedBox(height: 32),
- if (upgradesMap.isEmpty)
- Text('Ingen tilvalg valgt.',
+ if (selectedUpSales.isEmpty && selectedRoomUpgrade == null)
+ Text('up_sales_confirmation_no_up_sales'.tr(),
style: theme.textTheme.bodyMedium),
- if (upgradesMap.isNotEmpty) ...[
+ if (selectedUpSales.isNotEmpty || selectedRoomUpgrade != null) ...[
+ if (selectedRoomUpgrade != null) ...[
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(selectedRoomUpgrade!.name,
+ style: theme.textTheme.bodyMedium),
+ Text(selectedRoomUpgrade!.price.toString(),
+ style: theme.textTheme.bodyMedium),
+ ],
+ ),
+ ],
ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
separatorBuilder: (_, __) => const SizedBox(height: 8),
- itemCount: upgradesMap.length,
+ itemCount: selectedUpSales.length,
itemBuilder: (context, index) {
- final upgradeList = upgradesMap.values.elementAt(index);
- final upgrade = upgradeList.first;
- final quantity = upgradeList.length;
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
- upgrade.name +
- (quantity > 1 ? ' x$quantity' : ''),
+ selectedUpSales[index].name +
+ (selectedUpSales[index].quantity > 1 ? ' x${selectedUpSales[index].quantity}' : ''),
style: theme.textTheme.bodyMedium,
),
),
Text(
- (int.tryParse(upgrade.price) != null
- ? (int.parse(upgrade.price) * quantity)
- .toString()
- : upgrade.price),
+ (selectedUpSales[index].price * selectedUpSales[index].quantity).toString(),
style: theme.textTheme.bodyMedium,
),
],
@@ -136,12 +141,14 @@ class UpSaleConfirmationPage extends StatelessWidget {
icon: Center(
child: state.termsAccepted
? Icon(Icons.chevron_right,
- size: 32, color: Theme.of(context).colorScheme.onSurface)
+ size: 32,
+ color: Theme.of(context).colorScheme.onSurface)
: null,
),
action: () async {
- context.pushNamed(AppRoutes.upSalesAnimation.name, extra: [selectedUpSales, extrasTotalPrice]);
-
+ context.pushNamed(AppRoutes.upSalesProcessing.name,
+ extra: [selectedUpSales, selectedRoomUpgrade]);
+
return true;
},
label: Center(
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 a0ee6341..47522890 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,5 +1,7 @@
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/routing/app_routes.dart';
import 'package:comwell_key_app/utils/lottie_utils.dart';
import 'package:flutter/material.dart';
@@ -8,7 +10,12 @@ import 'package:go_router/go_router.dart';
import 'package:lottie/lottie.dart';
class UpSalesProcessingPage extends StatefulWidget {
- const UpSalesProcessingPage({super.key});
+ final List<Upgrade> selectedUpSales;
+ final RoomUpgrade? selectedRoomUpgrade;
+ const UpSalesProcessingPage(
+ {super.key,
+ required this.selectedUpSales,
+ required this.selectedRoomUpgrade});
@override
State<UpSalesProcessingPage> createState() => _UpSalesProcessingPageState();
@@ -41,6 +48,14 @@ class _UpSalesProcessingPageState extends State<UpSalesProcessingPage>
);
}
+ void playError() {
+ loadingComposition?.playBetween(
+ animationController,
+ "error",
+ repeat: false,
+ );
+ }
+
void playSuccess() async {
await loadingComposition?.playBetween(
animationController,
@@ -48,14 +63,17 @@ class _UpSalesProcessingPageState extends State<UpSalesProcessingPage>
markerEnd: "error",
);
await Future<void>.delayed(const Duration(seconds: 1));
- if (mounted) context.goNamed(AppRoutes.upSalesCatalog.name);
+ if (mounted) {
+ Navigator.of(context).popUntil(
+ (route) => route.settings.name == AppRoutes.bookingDetails.name);
+ }
}
Future<void> _startConfirmation() async {
// Start loading animation
playLoading();
- final cubit = context.read<UpSalesCubit>();
- await cubit.confirmUpSales();
+ await context.read<UpSalesCubit>().addUpSalesToBooking(
+ widget.selectedUpSales, widget.selectedRoomUpgrade);
playSuccess();
}
@@ -82,4 +100,4 @@ class _UpSalesProcessingPageState extends State<UpSalesProcessingPage>
),
);
}
-}
\ No newline at end of file
+}
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 e423e1fd..f197e529 100644
--- a/comwell_key_app/lib/up_sales/up_sales_catalog.dart
+++ b/comwell_key_app/lib/up_sales/up_sales_catalog.dart
@@ -1,19 +1,15 @@
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/up_sales/components/catalog/other_upgrade_catalog.dart';
-import 'package:comwell_key_app/up_sales/components/catalog/room_uprade_catalog.dart';
+import 'package:comwell_key_app/up_sales/components/catalog/addon_upgrade_catalog.dart';
+import 'package:comwell_key_app/up_sales/components/catalog/room_upgrade_catalog.dart';
import 'package:comwell_key_app/up_sales/components/catalog/service_catalog.dart';
-import 'package:comwell_key_app/up_sales/components/up_sales_bottom_button.dart';
+import 'package:comwell_key_app/up_sales/components/up_sales_continue_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/themes/light_theme.dart';
-import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
+import 'package:comwell_key_app/up_sales/models/addon_upgrade.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';
-import 'package:comwell_key_app/up_sales/models/room_upgrade_extra.dart';
-import 'package:comwell_key_app/up_sales/models/room_upgrade_list.dart';
class UpSalesCatalog extends StatelessWidget {
const UpSalesCatalog({super.key});
@@ -23,16 +19,10 @@ class UpSalesCatalog extends StatelessWidget {
final theme = Theme.of(context);
return BlocBuilder<UpSalesCubit, UpSalesState>(builder: (context, state) {
final cubit = context.read<UpSalesCubit>();
+ final selectedRoomUpgrade = cubit.state.selectedRoomUpgrade.isEmpty ? null : cubit.upSales.roomUpgrades.firstWhere((e) => e.id == cubit.state.selectedRoomUpgrade);
+ print("selectedRoomUpgrade in up sales catalog: ${selectedRoomUpgrade}");
- if (state.isLoading) {
- return const Scaffold(
- appBar: ComwellAppBar(),
- backgroundColor: Colors.white,
- body: Center(
- child: CircularProgressIndicator(),
- ),
- );
- }
+ print("selectedUpSales in up sales catalog: ${cubit.state.selectedUpSales}");
return Scaffold(
appBar: const ComwellAppBar(),
@@ -61,22 +51,24 @@ class UpSalesCatalog extends StatelessWidget {
),
const SizedBox(height: 8),
ServiceCatalog(
- upSales: cubit.upSales,
+ upSales: cubit.upSales.addOnUpgrades
+ .where((upgrade) => upgrade.isService)
+ .toList(),
selectedUpSales: cubit.state.selectedUpSales,
- onServiceSelected: (roomUpgrade, isSelected) {
+ onServiceSelected: (upgrade, isSelected) {
if (isSelected) {
- cubit.removeUpgrade(roomUpgrade);
+ cubit.removeUpgrade(upgrade);
} else {
- cubit.addSelected(roomUpgrade);
+ cubit.addSelected(upgrade);
}
},
- onTap: (roomUpgrade) {
+ onTap: (upgrade) {
final isSelected =
- cubit.state.selectedUpSales.contains(roomUpgrade);
+ cubit.state.selectedUpSales.any((e) => e.id == upgrade.id);
if (isSelected) {
- cubit.removeUpgrade(roomUpgrade);
+ cubit.removeUpgrade(upgrade);
} else {
- cubit.addSelected(roomUpgrade);
+ cubit.addSelected(upgrade);
}
},
),
@@ -88,22 +80,23 @@ class UpSalesCatalog extends StatelessWidget {
),
const SizedBox(height: 8),
RoomUpgradeCatalog(
- upSales: cubit.upSales,
+ availableRoomUpgrades: cubit.upSales.roomUpgrades,
+ selectedRoomUpgrade: cubit.state.selectedRoomUpgrade,
selectedUpSales: cubit.state.selectedUpSales,
- onRoomUpgradeSelected: (roomUpgrade, isSelected) {
+ onRoomUpgradeSelected: (upgrade, isSelected) {
if (isSelected) {
- cubit.removeUpgrade(roomUpgrade);
+ cubit.removeUpgrade(upgrade);
} else {
- cubit.addSelected(roomUpgrade);
+ cubit.addSelected(upgrade);
}
},
- onTap: (roomUpgrade) {
+ onTap: (upgrade) {
final isSelected =
- cubit.state.selectedUpSales.contains(roomUpgrade);
+ cubit.state.selectedRoomUpgrade == upgrade.id;
if (isSelected) {
- cubit.removeUpgrade(roomUpgrade);
+ cubit.removeUpgrade(upgrade);
} else {
- cubit.addSelected(roomUpgrade);
+ cubit.addSelected(upgrade);
}
},
),
@@ -114,11 +107,15 @@ class UpSalesCatalog extends StatelessWidget {
style: theme.textTheme.headlineMedium),
),
const SizedBox(height: 8),
- OtherUpgradeCatalog(
- upSales: cubit.upSales,
- selectedUpSales: cubit.state.selectedUpSales,
- onOtherUpgradeSelected: (roomUpgrade, quantity) {
- cubit.updateUpgradeQuantity(roomUpgrade, quantity);
+ AddOnUpgradeCatalog(
+ addOnUpgrades: cubit.upSales.addOnUpgrades
+ .where((upgrade) => !upgrade.isService)
+ .toList(),
+ selectedUpSales: cubit.state.selectedUpSales
+ .whereType<AddOnUpgrade>()
+ .toList(),
+ onAddOnUpgradeSelected: (upgrade) {
+ cubit.updateAddonUpgradeQuantity(upgrade);
},
),
const SizedBox(height: 24),
@@ -128,51 +125,13 @@ class UpSalesCatalog extends StatelessWidget {
),
bottomNavigationBar: Column(mainAxisSize: MainAxisSize.min, children: [
const Divider(color: colorDivider),
- UpSalesBottomButton(
- onContinue: cubit.onContinue,
+ UpSalesContinueButton(
selectedUpSales: cubit.state.selectedUpSales,
extrasTotalPrice: cubit.extrasTotalPrice,
- children: [
- Text(
- cubit.state.selectedUpSales.isEmpty
- ? "continue_without_up_sales".tr()
- : "generic_continue".tr(),
- style: theme.textTheme.headlineSmall
- ?.copyWith(color: Colors.white),
- ),
- ]),
+ selectedRoomUpgrade: selectedRoomUpgrade,
+ )
]),
);
});
}
}
-
-Future<void> handleReadMoreTapUpSales({
- required BuildContext context,
- required String routeName,
- required dynamic cubit,
- required RoomUpgrade roomUpgrade,
- required int quantity,
- required List<RoomUpgrade> selectedUpSales,
-}) async {
- final dynamic extra;
- if (routeName == AppRoutes.otherUpgrade.name) {
- extra = RoomUpgradeExtra(roomUpgrade: roomUpgrade, quantity: quantity);
- } else if (routeName == AppRoutes.roomUpgrade.name) {
- extra = RoomUpgradeList(
- roomUpgrade: roomUpgrade, roomUpgrades: selectedUpSales);
- } 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 RoomUpgrade);
- } else {
- cubit.addSelected(roomUpgradeResponse[0] as RoomUpgrade);
- }
- }
- if (roomUpgradeResponse is int) {
- cubit.updateUpgradeQuantity(roomUpgrade, roomUpgradeResponse);
- }
-}
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 0bb5ebd8..db938be3 100644
--- a/comwell_key_app/lib/up_sales/up_sales_repository.dart
+++ b/comwell_key_app/lib/up_sales/up_sales_repository.dart
@@ -1,372 +1,24 @@
+import 'dart:ui';
+
import 'package:comwell_key_app/services/api.dart';
-import 'package:comwell_key_app/up_sales/mappers/room_upgrade_mapper.dart';
-import 'package:comwell_key_app/up_sales/models/dto/room_upgrade_dto.dart';
-import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
-import 'package:comwell_key_app/utils/json.dart';
-import 'package:comwell_key_app/up_sales/models/dto/room_facility_dto.dart';
+import 'package:comwell_key_app/up_sales/mappers/up_sales_mapper.dart';
+import 'package:comwell_key_app/up_sales/models/addon_list.dart';
+import 'package:comwell_key_app/up_sales/models/up_sales.dart';
class UpSalesRepository {
final Api api = Api();
UpSalesRepository();
- Future<Json> getUpSales() async {
- final response = await api.fetchUpSales();
- return response;
+ Future<UpSales> getUpSales(String confirmationId, String hotelCode) async {
+ final response = await api.fetchUpSales(confirmationId, hotelCode);
+ return response.toUpSales();
}
- Future<List<RoomUpgrade>> getMockUpSales() async {
- return mockRoomUpgrades.toRoomUpgrades();
+ Future<void> addUpSalesToBooking(String confirmationId, String hotelCode, String roomType, List<AddOnList> selectedUpSales) async {
+ await api.addUpSalesToBooking(confirmationId, hotelCode, roomType, selectedUpSales);
}
+
}
-// Mock data for RoomUpgrade and RoomFacility
-final List<RoomUpgradeDTO> mockRoomUpgrades = [
- RoomUpgradeDTO(
- name: 'Standard Double Room',
- price: '1200',
- images: ['assets/images/welcome_image.jpeg', 'assets/images/current_room.png', 'assets/images/no_current_bookings_background.jpeg'],
- description:
- 'A cozy room with a double bed, perfect for couples or solo travelers seeking comfort and convenience. A cozy room with a double bed, perfect for couples or solo travelers seeking comfort and convenience. A cozy room with a double bed, perfect for couples or solo travelers seeking comfort and convenience.',
- id: '1',
- tags: ['20'],
- type: 'room',
- facilities: [
- RoomFacilityDTO(
- name: '1x enkelseng',
- icon: 'assets/icons/ic_single_bed.svg',
- facilityType: 'Bed'),
- RoomFacilityDTO(
- name: '1x dobbelseng',
- icon: 'assets/icons/ic_double_bed.svg',
- facilityType: 'Bed'),
- RoomFacilityDTO(
- name: 'TV',
- icon: 'assets/icons/ic_tv.svg',
- facilityType: 'Electronics'),
- RoomFacilityDTO(
- name: 'Gratis WiFi',
- icon: 'assets/icons/ic_wifi.svg',
- facilityType: 'Electronics'),
- RoomFacilityDTO(
- name: 'Hårtørrer',
- icon: 'assets/icons/ic_hairdryer.svg',
- facilityType: 'Bathroom'),
- RoomFacilityDTO(
- name: 'Arbejdsplads',
- icon: 'assets/icons/ic_desk.svg',
- facilityType: 'Business'),
- RoomFacilityDTO(
- name: 'Roomservice',
- icon: 'assets/icons/ic_service_bowl.svg',
- facilityType: 'Service'),
- RoomFacilityDTO(
- name: 'Strygejern & -bræt',
- icon: 'assets/icons/ic_iron.svg',
- facilityType: 'Room'),
- RoomFacilityDTO(
- name: 'Minibar',
- icon: 'assets/icons/ic_minibar.svg',
- facilityType: 'Room'),
- ],
- ),
- RoomUpgradeDTO(
- name: 'Junior Suite',
- price: '1800',
- images: ['assets/images/no_current_bookings_background.jpeg'],
- description:
- 'Spacious Junior Suite with a separate living area, ideal for guests who appreciate extra space and luxury. Spacious Junior Suite with a separate living area, ideal for guests who appreciate extra space and luxury. Spacious Junior Suite with a separate living area, ideal for guests who appreciate extra space and luxury.',
- id: '2',
- tags: ['35'],
- type: 'room',
- facilities: [
- RoomFacilityDTO(
- name: '1x enkelseng',
- icon: 'assets/icons/ic_single_bed.svg',
- facilityType: 'Bed'),
- RoomFacilityDTO(
- name: '2x dobbelseng',
- icon: 'assets/icons/ic_double_bed.svg',
- facilityType: 'Bed'),
- RoomFacilityDTO(
- name: 'TV',
- icon: 'assets/icons/ic_tv.svg',
- facilityType: 'Electronics'),
- RoomFacilityDTO(
- name: 'Gratis WiFi',
- icon: 'assets/icons/ic_wifi.svg',
- facilityType: 'Electronics'),
- RoomFacilityDTO(
- name: 'Hårtørrer',
- icon: 'assets/icons/ic_hairdryer.svg',
- facilityType: 'Bathroom'),
- RoomFacilityDTO(
- name: 'Badekar',
- icon: 'assets/icons/ic_bathtub.svg',
- facilityType: 'Bathroom'),
- RoomFacilityDTO(
- name: 'Arbejdsplads',
- icon: 'assets/icons/ic_desk.svg',
- facilityType: 'Business'),
- RoomFacilityDTO(
- name: 'Roomservice',
- icon: 'assets/icons/ic_service_bowl.svg',
- facilityType: 'Service'),
- RoomFacilityDTO(
- name: 'Strygejern & -bræt',
- icon: 'assets/icons/ic_iron.svg',
- facilityType: 'Room'),
- RoomFacilityDTO(
- name: 'Terrasse',
- icon: 'assets/icons/ic_balcony.svg',
- facilityType: 'Room'),
- RoomFacilityDTO(
- name: 'Te-køkken',
- icon: 'assets/icons/ic_kettle.svg',
- facilityType: 'Room'),
- RoomFacilityDTO(
- name: 'Stue',
- icon: 'assets/icons/ic_leather_chair.svg',
- facilityType: 'Room'),
- RoomFacilityDTO(
- name: 'Minibar',
- icon: 'assets/icons/ic_minibar.svg',
- facilityType: 'Room'),
- ],
- ),
- RoomUpgradeDTO(
- name: 'Suite',
- price: '2500',
- images: ['assets/images/current_room.png'],
- description:
- 'Our most luxurious suite, featuring a large living room, private terrace, and premium amenities for a memorable stay. Our most luxurious suite, featuring a large living room, private terrace, and premium amenities for a memorable stay. Our most luxurious suite, featuring a large living room, private terrace, and premium amenities for a memorable stay.',
- id: '3',
- tags: ['50'],
- type: 'room',
- facilities: [
- RoomFacilityDTO(
- name: '1x enkelseng',
- icon: 'assets/icons/ic_single_bed.svg',
- facilityType: 'Bed'),
- RoomFacilityDTO(
- name: 'TV',
- icon: 'assets/icons/ic_tv.svg',
- facilityType: 'Electronics'),
- RoomFacilityDTO(
- name: 'Gratis WiFi',
- icon: 'assets/icons/ic_wifi.svg',
- facilityType: 'Electronics'),
- RoomFacilityDTO(
- name: 'Hårtørrer',
- icon: 'assets/icons/ic_hairdryer.svg',
- facilityType: 'Bathroom'),
- RoomFacilityDTO(
- name: 'Badekar',
- icon: 'assets/icons/ic_bathtub.svg',
- facilityType: 'Bathroom'),
- RoomFacilityDTO(
- name: 'Arbejdsplads',
- icon: 'assets/icons/ic_desk.svg',
- facilityType: 'Business'),
- RoomFacilityDTO(
- name: 'Roomservice',
- icon: 'assets/icons/ic_service_bowl.svg',
- facilityType: 'Service'),
- RoomFacilityDTO(
- name: 'Strygejern & -bræt',
- icon: 'assets/icons/ic_iron.svg',
- facilityType: 'Room'),
- RoomFacilityDTO(
- name: 'Terrasse',
- icon: 'assets/icons/ic_balcony.svg',
- facilityType: 'Room'),
- RoomFacilityDTO(
- name: 'Te-køkken',
- icon: 'assets/icons/ic_kettle.svg',
- facilityType: 'Room'),
- RoomFacilityDTO(
- name: 'Stue',
- icon: 'assets/icons/ic_leather_chair.svg',
- facilityType: 'Room'),
- RoomFacilityDTO(
- name: 'Minibar',
- icon: 'assets/icons/ic_minibar.svg',
- facilityType: 'Room'),
- ],
- ),
- RoomUpgradeDTO(
- name: 'Standard Double Plus Room',
- price: '1400',
- images: ['assets/images/login_screen_background.png'],
- description:
- 'An upgraded double room with extra amenities and a modern touch, perfect for a relaxing stay. An upgraded double room with extra amenities and a modern touch, perfect for a relaxing stay. An upgraded double room with extra amenities and a modern touch, perfect for a relaxing stay.',
- id: '4',
- tags: ['25'],
- type: 'room',
- facilities: [
- RoomFacilityDTO(
- name: '2x dobbelseng',
- icon: 'assets/icons/ic_double_bed.svg',
- facilityType: 'Bed'),
- RoomFacilityDTO(
- name: 'TV',
- icon: 'assets/icons/ic_tv.svg',
- facilityType: 'Electronics'),
- RoomFacilityDTO(
- name: 'Gratis WiFi',
- icon: 'assets/icons/ic_wifi.svg',
- facilityType: 'Electronics'),
- RoomFacilityDTO(
- name: 'Hårtørrer',
- icon: 'assets/icons/ic_hairdryer.svg',
- facilityType: 'Bathroom'),
- RoomFacilityDTO(
- name: 'Arbejdsplads',
- icon: 'assets/icons/ic_desk.svg',
- facilityType: 'Business'),
- RoomFacilityDTO(
- name: 'Roomservice',
- icon: 'assets/icons/ic_service_bowl.svg',
- facilityType: 'Service'),
- ],
- ),
- RoomUpgradeDTO(
- name: 'Standard Twin Plus Room',
- price: '1450',
- images: ['assets/images/login_screen_background.png'],
- description:
- 'A spacious twin room with two single beds and modern facilities, ideal for friends or colleagues traveling together. A spacious twin room with two single beds and modern facilities, ideal for friends or colleagues traveling together. A spacious twin room with two single beds and modern facilities, ideal for friends or colleagues traveling together.',
- id: '5',
- tags: ['27'],
- type: 'room',
- facilities: [
- RoomFacilityDTO(
- name: '2x dobbelseng',
- icon: 'assets/icons/ic_double_bed.svg',
- facilityType: 'Bed'),
- RoomFacilityDTO(
- name: 'TV',
- icon: 'assets/icons/ic_tv.svg',
- facilityType: 'Electronics'),
- RoomFacilityDTO(
- name: 'Gratis WiFi',
- icon: 'assets/icons/ic_wifi.svg',
- facilityType: 'Electronics'),
- RoomFacilityDTO(
- name: 'Hårtørrer',
- icon: 'assets/icons/ic_hairdryer.svg',
- facilityType: 'Bathroom'),
- RoomFacilityDTO(
- name: 'Arbejdsplads',
- icon: 'assets/icons/ic_desk.svg',
- facilityType: 'Business'),
- RoomFacilityDTO(
- name: 'Strygejern & -bræt',
- icon: 'assets/icons/ic_iron.svg',
- facilityType: 'Room'),
- RoomFacilityDTO(
- name: 'Minibar',
- icon: 'assets/icons/ic_minibar.svg',
- facilityType: 'Room'),
- ],
- ),
- RoomUpgradeDTO(
- name: 'Bottle of Champagne',
- price: '450',
- images: ['assets/images/catalog_image.png'],
- description:
- 'Celebrate your stay with a bottle of premium champagne and a selection of fine chocolates delivered to your room.',
- id: '6',
- tags: [],
- type: 'other',
- facilities: [],
- ),
- RoomUpgradeDTO(
- name: 'Luxury Flower Arrangement',
- price: '350',
- images: ['assets/images/login_screen_background.png'],
- description:
- 'A beautiful bouquet of fresh seasonal flowers to brighten up your room and create a welcoming atmosphere.',
- id: '7',
- tags: [],
- type: 'other',
- facilities: [],
- ),
- RoomUpgradeDTO(
- name: 'Romantic Evening Package',
- price: '750',
- images: ['assets/images/catalog_image.png'],
- description:
- 'Create a romantic atmosphere with rose petals, candles, champagne, and a special dessert for two.',
- id: '8',
- tags: [],
- type: 'other',
- facilities: [],
- ),
- RoomUpgradeDTO(
- name: 'Breakfast in Bed',
- price: '250',
- images: ['assets/images/login_screen_background.png'],
- description:
- 'Start your day in luxury with a full breakfast served in the comfort of your room.',
- id: '9',
- tags: [],
- type: 'other',
- facilities: [],
- ),
- RoomUpgradeDTO(
- name: 'Wellness Package',
- price: '600',
- images: ['assets/images/login_screen_background.png'],
- description:
- 'Indulge in a wellness experience with a selection of premium spa products, bath salts, and aromatherapy items.',
- id: '10',
- tags: [],
- type: 'other',
- facilities: [],
- ),
- RoomUpgradeDTO(
- name: 'Early Check In',
- price: '200',
- images: [],
- description:
- 'Check in to your room early and start enjoying your stay from the morning. Available from 10:00 AM.',
- id: '11',
- tags: [],
- type: 'service',
- facilities: [],
- ),
- RoomUpgradeDTO(
- name: 'Late Check Out',
- price: '150',
- images: [],
- description:
- 'Extend your stay and check out later in the day. Available until 2:00 PM.',
- id: '12',
- tags: ['popular'],
- type: 'service',
- facilities: [],
- ),
- RoomUpgradeDTO(
- name: 'Airport Transfer',
- price: '350',
- images: [],
- description:
- 'Convenient airport pickup and drop-off service with a professional driver and comfortable vehicle.',
- id: '13',
- tags: [],
- type: 'service',
- facilities: [],
- ),
- RoomUpgradeDTO(
- name: 'Valet Parking',
- price: '180',
- images: [],
- description:
- 'Professional valet parking service for your vehicle with secure storage and convenient access.',
- id: '14',
- tags: [],
- type: 'service',
- facilities: [],
- ),
-];
+