6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit 97329f5b
Changed files
comwell_key_app/assets/images/catalog_image.png | Bin 0 -> 23480 bytes comwell_key_app/assets/translations/da-DK.json | 11 +- comwell_key_app/assets/translations/en-US.json | 10 +- .../components/booking_details_bottom_sheet.dart | 56 ++++--- comwell_key_app/lib/routing/app_router.dart | 13 +- comwell_key_app/lib/routing/app_routes.dart | 1 + .../up_sales/components/comwell_radio_button.dart | 35 +++++ .../components/up_sales_catalog_button.dart | 77 ++++++++++ .../components/up_sales_services_widget.dart | 87 +++++++++++ .../components/up_sales_upgrades_widget.dart | 118 +++++++++++++++ comwell_key_app/lib/up_sales/up_sale_widget.dart | 107 -------------- comwell_key_app/lib/up_sales/up_sales_catalog.dart | 161 +++++++++++++++++++++ 12 files changed, 539 insertions(+), 137 deletions(-)
Diff
diff --git a/comwell_key_app/assets/images/catalog_image.png b/comwell_key_app/assets/images/catalog_image.png
new file mode 100644
index 00000000..b7829fdd
Binary files /dev/null and b/comwell_key_app/assets/images/catalog_image.png differ
diff --git a/comwell_key_app/assets/translations/da-DK.json b/comwell_key_app/assets/translations/da-DK.json
index ceccaeb6..2dbe2f8c 100644
--- a/comwell_key_app/assets/translations/da-DK.json
+++ b/comwell_key_app/assets/translations/da-DK.json
@@ -258,7 +258,12 @@
"up_sales_title": "Tidlig check-in",
"up_sales_subtitle": "Med tidlig check-in kan du checke ind kl. 13.00 i stedet for kl. 15.00.",
"up_sales_popular": "POPULÆR",
- "services": "Tilkøb & Tjenester",
- "up_sales_see_all": "Se alle"
-
+ "services": "Tjenester",
+ "up_sales_see_all": "Se alle",
+ "up_sales_catalog_button_title": "Se produktkatalog",
+ "up_sales_catalog_button_subtitle": "Her kan du se og bestille produkter og skrive dem helt automatisk på din værelsesregning.",
+ "up_sales_catalog_title": "Tilkøbsmuligheder",
+ "room_upgrades": "Værelsesopgraderinger",
+ "other_up_sales": "Andre tilkøb",
+ "read_more_up_sales": "Læs mere"
}
\ 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 6c7dfb0b..96ec445a 100644
--- a/comwell_key_app/assets/translations/en-US.json
+++ b/comwell_key_app/assets/translations/en-US.json
@@ -257,6 +257,12 @@
"up_sales_title": "Early check-in",
"up_sales_subtitle": "With early check-in you can check in at 13.00 instead of 15.00.",
"up_sales_popular": "POPULAR",
- "services": "Upgrades & Services",
- "up_sales_see_all": "See all"
+ "services": "Services",
+ "up_sales_see_all": "See all",
+ "up_sales_catalog_button_title": "See product catalog",
+ "up_sales_catalog_button_subtitle": "Here you can see and order products and write them automatically on your room bill.",
+ "up_sales_catalog_title": "Upgrades & Services",
+ "room_upgrades": "Room upgrades",
+ "other_up_sales": "Other upgrades",
+ "read_more_up_sales": "Read more"
}
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 dcca4830..9a63d88c 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
@@ -6,7 +6,8 @@ import 'package:comwell_key_app/common/components/bottom_sheet_widget.dart';
import 'package:comwell_key_app/common/components/outlined_pill_button.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
-import 'package:comwell_key_app/up_sales/up_sale_widget.dart';
+import 'package:comwell_key_app/up_sales/components/up_sales_catalog_button.dart';
+import 'package:comwell_key_app/up_sales/components/up_sales_services_widget.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
@@ -30,29 +31,36 @@ class BookingDetailsBottomSheet extends StatelessWidget {
const SizedBox(height: 20),
const CheckOutButton(),
const SizedBox(height: 20),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Text('services'.tr(), style: theme.textTheme.headlineMedium),
- const SizedBox(width: 8),
- OutlinedPillButton(
- text: 'up_sales_see_all'.tr(),
- onTap: () {},
- ),
- ],
- ),
- const SizedBox(height: 16),
- const SingleChildScrollView(
- scrollDirection: Axis.horizontal,
- child: Row(
- children: [
- UpSaleWidget(),
- UpSaleWidget(),
- UpSaleWidget(),
- UpSaleWidget(),
- ],
- ),
- ),
+ cubit.booking.reservationStatus == ReservationStatus.checkedin
+ ? const UpSalesCatalogButton()
+ : Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text('services'.tr(), style: theme.textTheme.headlineMedium),
+ const SizedBox(width: 8),
+ OutlinedPillButton(
+ text: 'up_sales_see_all'.tr(),
+ onTap: () {},
+ ),
+ ],
+ ),
+ const SizedBox(height: 16),
+ const SingleChildScrollView(
+ scrollDirection: Axis.horizontal,
+ child: Row(
+ children: [
+ UpSalesServicesWidget(),
+ UpSalesServicesWidget(),
+ UpSalesServicesWidget(),
+ UpSalesServicesWidget(),
+ ],
+ ),
+ ),
+ ],
+ ),
const SizedBox(height: 20),
Text("booking_details_page_practical_information".tr()),
const SizedBox(height: 20),
diff --git a/comwell_key_app/lib/routing/app_router.dart b/comwell_key_app/lib/routing/app_router.dart
index 1fba3afe..b0dea53f 100644
--- a/comwell_key_app/lib/routing/app_router.dart
+++ b/comwell_key_app/lib/routing/app_router.dart
@@ -45,6 +45,8 @@ import 'package:comwell_key_app/routing/app_routes.dart';
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/up_sales_catalog.dart';
import 'package:comwell_key_app/utils/stream_to_listenable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
@@ -359,7 +361,16 @@ GoRouter goRouter() {
);
},
),
-
+ GoRoute(
+ path: "/${AppRoutes.upSalesCatalog.name}",
+ name: AppRoutes.upSalesCatalog.name,
+ builder: (context, state) {
+ return BlocProvider(
+ create: (context) => UpSalesCubit(),
+ child: const UpSalesCatalog(),
+ );
+ },
+ ),
/* GoRoute(
path: "/keys",
name: AppRoutes.keys.name,
diff --git a/comwell_key_app/lib/routing/app_routes.dart b/comwell_key_app/lib/routing/app_routes.dart
index a08fd617..ae0f54e4 100644
--- a/comwell_key_app/lib/routing/app_routes.dart
+++ b/comwell_key_app/lib/routing/app_routes.dart
@@ -28,4 +28,5 @@ enum AppRoutes {
shareBooking,
notifications,
myBooking,
+ upSalesCatalog,
}
diff --git a/comwell_key_app/lib/up_sales/components/comwell_radio_button.dart b/comwell_key_app/lib/up_sales/components/comwell_radio_button.dart
new file mode 100644
index 00000000..a56b5730
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/components/comwell_radio_button.dart
@@ -0,0 +1,35 @@
+import 'package:comwell_key_app/themes/light_theme.dart';
+import 'package:flutter/material.dart';
+
+class ComwellRadioButton extends StatelessWidget {
+ final bool selected;
+ final Function() onTap;
+ const ComwellRadioButton({super.key, required this.selected, required this.onTap});
+
+ @override
+ Widget build(BuildContext context) {
+ return GestureDetector(
+ onTap: onTap,
+ child: Container(
+ width: 24,
+ height: 24,
+ decoration: BoxDecoration(
+ shape: BoxShape.circle,
+ border: Border.all(color: colorDivider, width: 1.5),
+ ),
+ child: selected
+ ? Center(
+ child: Container(
+ width: 21,
+ height: 21,
+ decoration: const BoxDecoration(
+ color: sandColor,
+ shape: BoxShape.circle,
+ ),
+ ),
+ )
+ : null,
+ ),
+ );
+ }
+}
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
new file mode 100644
index 00000000..75f02bf0
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/components/up_sales_catalog_button.dart
@@ -0,0 +1,77 @@
+import 'package:comwell_key_app/routing/app_routes.dart';
+import 'package:comwell_key_app/themes/light_theme.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:go_router/go_router.dart';
+
+class UpSalesCatalogButton extends StatelessWidget {
+ const UpSalesCatalogButton({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+
+ return GestureDetector(
+ onTap: () {
+ context.pushNamed(AppRoutes.upSalesCatalog.name);
+ },
+ child: Container(
+ width: double.infinity,
+ height: 211,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(12),
+ border: Border.all(color: colorDivider, width: 1),
+ ),
+ child: Stack(
+ children: [
+ ClipRRect(
+ borderRadius: BorderRadius.circular(12),
+ child: Image.asset(
+ 'assets/images/catalog_image.png',
+ width: double.infinity,
+ height: 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,
+ ],
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.end,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ 'up_sales_catalog_button_title'.tr(),
+ style: theme.textTheme.headlineMedium?.copyWith(
+ color: Colors.white,
+ ),
+ ),
+ Text(
+ 'up_sales_catalog_button_subtitle'.tr(),
+ style: theme.textTheme.bodySmall?.copyWith(
+ color: Colors.white,
+ ),
+ maxLines: 2,
+ overflow: TextOverflow.ellipsis,
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
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
new file mode 100644
index 00000000..9e7f61c3
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/components/up_sales_services_widget.dart
@@ -0,0 +1,87 @@
+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/cubit/up_sales_cubit.dart';
+import 'package:comwell_key_app/up_sales/cubit/up_sales_state.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+class UpSalesServicesWidget extends StatelessWidget {
+ final double width;
+ final double height;
+ const UpSalesServicesWidget({super.key, this.width = 328, this.height = 252});
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+
+ return BlocProvider(
+ create: (context) => UpSalesCubit(),
+ child: BlocBuilder<UpSalesCubit, UpSalesState>(builder: (context, state) {
+ final cubit = context.read<UpSalesCubit>();
+ return Padding(
+ padding: const EdgeInsets.only(right: 16),
+ child: Container(
+ width: width,
+ height: height,
+ padding: const EdgeInsets.all(24),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(12),
+ border: Border.all(color: colorDivider, width: 1),
+ ),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text('early_checkin'.tr(),
+ style: theme.textTheme.headlineMedium),
+ ],
+ ),
+ ),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Row(
+ children: [
+ Text(
+ '200 kr.',
+ style: theme.textTheme.headlineMedium,
+ ),
+ const SizedBox(width: 8),
+ ComwellRadioButton(selected: cubit.state.selected, onTap: cubit.toggleSelected),
+ ],
+ ),
+ ],
+ ),
+ ],
+ ),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const TagWidget(text: 'POPULÆR'),
+ const SizedBox(height: 8),
+ Text(
+ 'Med tidlig check-in kan du checke ind kl. 13.00 i stedet for kl. 15.00.',
+ style: theme.textTheme.bodyMedium?.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
new file mode 100644
index 00000000..b60a9188
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/components/up_sales_upgrades_widget.dart
@@ -0,0 +1,118 @@
+import 'package:comwell_key_app/up_sales/components/comwell_radio_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:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:comwell_key_app/themes/light_theme.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+class UpSalesUpgradesWidget extends StatelessWidget {
+ final double width;
+ final double height;
+ const UpSalesUpgradesWidget({super.key, this.width = 328, this.height = 270});
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+ return BlocProvider(
+ create: (context) => UpSalesCubit(),
+ child: BlocBuilder<UpSalesCubit, UpSalesState>(builder: (context, state) {
+ final cubit = context.read<UpSalesCubit>();
+ return Container(
+ width: width,
+ height: height,
+ margin: const EdgeInsets.all(8),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(10),
+ border: Border.all(color: colorDivider, width: 1),
+ ),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Stack(
+ children: [
+ ClipRRect(
+ borderRadius: const BorderRadius.only(
+ topLeft: Radius.circular(10),
+ topRight: Radius.circular(10),
+ ),
+ child: Image.asset(
+ 'assets/images/welcome_image.jpeg',
+ height: 180,
+ width: double.infinity,
+ fit: BoxFit.cover,
+ ),
+ ),
+ Positioned(
+ top: 16,
+ right: 16,
+ child: Container(
+ padding:
+ const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(32),
+ ),
+ child: Text(
+ '26 m2',
+ style:
+ theme.textTheme.headlineMedium?.copyWith(fontSize: 11),
+ ),
+ ),
+ ),
+ ],
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ 'Junior Suite',
+ style: theme.textTheme.headlineMedium,
+ ),
+ Row(
+ children: [
+ Text(
+ '+200 kr.',
+ style: theme.textTheme.headlineMedium,
+ ),
+ const SizedBox(width: 8),
+ ComwellRadioButton(selected: cubit.state.selected, onTap: cubit.toggleSelected),
+ ],
+ ),
+ ],
+ ),
+ const SizedBox(height: 8),
+ GestureDetector(
+ onTap: () {},
+ child: Text(
+ 'read_more_up_sales'.tr(),
+ style: theme.textTheme.bodySmall?.copyWith(
+ color: sandColor[80],
+ decoration: TextDecoration.underline,
+ decorationColor: sandColor[80],
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ );
+ }),
+ );
+ }
+}
diff --git a/comwell_key_app/lib/up_sales/up_sale_widget.dart b/comwell_key_app/lib/up_sales/up_sale_widget.dart
deleted file mode 100644
index 25e29135..00000000
--- a/comwell_key_app/lib/up_sales/up_sale_widget.dart
+++ /dev/null
@@ -1,107 +0,0 @@
-import 'package:comwell_key_app/themes/light_theme.dart';
-import 'package:comwell_key_app/up_sales/components/tags.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:easy_localization/easy_localization.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
-
-class UpSaleWidget extends StatelessWidget {
- const UpSaleWidget({super.key});
-
- @override
- Widget build(BuildContext context) {
- final theme = Theme.of(context);
-
- return BlocProvider(
- create: (context) => UpSalesCubit(),
- child: BlocBuilder<UpSalesCubit, UpSalesState>(builder: (context, state) {
- final cubit = context.read<UpSalesCubit>();
- return Padding(
- padding: const EdgeInsets.only(right: 16),
- child: Container(
- width: 328,
- height: 252,
- padding: const EdgeInsets.all(24),
- decoration: BoxDecoration(
- color: Colors.white,
- borderRadius: BorderRadius.circular(12),
- border: Border.all(color: colorDivider, width: 1),
- ),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Expanded(
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text('early_checkin'.tr(),
- style: theme.textTheme.headlineMedium),
- ],
- ),
- ),
- Column(
- crossAxisAlignment: CrossAxisAlignment.end,
- children: [
- Row(
- children: [
- Text(
- '200 kr.',
- style: theme.textTheme.headlineMedium,
- ),
- const SizedBox(width: 8),
- GestureDetector(
- onTap: cubit.toggleSelected,
- child: Container(
- width: 24,
- height: 24,
- decoration: BoxDecoration(
- shape: BoxShape.circle,
- border:
- Border.all(color: colorDivider, width: 1),
- ),
- child: cubit.state.selected
- ? Center(
- child: Container(
- width: 21,
- height: 21,
- decoration: const BoxDecoration(
- color: sandColor,
- shape: BoxShape.circle,
- ),
- ),
- )
- : null,
- ),
- ),
- ],
- ),
- ],
- ),
- ],
- ),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- const TagWidget(text: 'POPULÆR'),
- const SizedBox(height: 8),
- Text(
- 'Med tidlig check-in kan du checke ind kl. 13.00 i stedet for kl. 15.00.',
- style: theme.textTheme.bodyMedium?.copyWith(
- color: colorHeadlineText,
- ),
- ),
- ],
- ),
- ],
- ),
- ),
- );
- }),
- );
- }
-}
diff --git a/comwell_key_app/lib/up_sales/up_sales_catalog.dart b/comwell_key_app/lib/up_sales/up_sales_catalog.dart
new file mode 100644
index 00000000..e54f6232
--- /dev/null
+++ b/comwell_key_app/lib/up_sales/up_sales_catalog.dart
@@ -0,0 +1,161 @@
+import 'package:comwell_key_app/common/components/comwell_app_bar.dart';
+import 'package:comwell_key_app/up_sales/components/up_sales_services_widget.dart';
+import 'package:comwell_key_app/up_sales/components/up_sales_upgrades_widget.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/dark_theme.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+class UpSalesCatalog extends StatelessWidget {
+ const UpSalesCatalog({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ final theme = Theme.of(context);
+ return BlocBuilder<UpSalesCubit, UpSalesState>(
+ builder: (context, state) {
+ return Scaffold(
+ appBar: const ComwellAppBar(),
+ backgroundColor: Colors.white,
+ body: SingleChildScrollView(
+ child: Padding(
+ padding: const EdgeInsets.only(
+ top: 24,
+ bottom: 100, // Add padding to account for bottom sheet
+ left: 0,
+ right: 0,
+ ),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Text('up_sales_catalog_title'.tr(), style: theme.textTheme.headlineLarge),
+ ),
+ const SizedBox(height: 40),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Text('services'.tr(), style: theme.textTheme.headlineMedium),
+ ),
+ const SizedBox(height: 16),
+ _buildServicesCatalog(context),
+ const SizedBox(height: 24),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Text('room_upgrades'.tr(), style: theme.textTheme.headlineMedium),
+ ),
+ const SizedBox(height: 16),
+ _buildRoomUpgradeCatalog(context),
+ const SizedBox(height: 24),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Text('other_up_sales'.tr(), style: theme.textTheme.headlineMedium),
+ ),
+ const SizedBox(height: 16),
+ _buildOtherUpSalesCatalog(context),
+ ],
+ ),
+ ),
+ ),
+ bottomSheet: Builder(
+ builder: (context) {
+ return Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ const Divider(
+ color: Colors.black12,
+ height: 0,
+ ),
+ Row(
+ children: [
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: ElevatedButton(
+ onPressed: () {
+ // TODO: Implement booking action
+ },
+ style: ButtonStyle(
+ backgroundColor: WidgetStateProperty.resolveWith((states) {
+ if (states.contains(WidgetState.disabled)) {
+ return Colors.grey;
+ }
+ return sandColor[80];
+ }),
+ foregroundColor: const WidgetStatePropertyAll(Colors.white),
+ ),
+ child: const Padding(
+ padding: EdgeInsets.symmetric(vertical: 16.0),
+ child: Text('Book Selected Services'),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ );
+ },
+ ),
+ );
+ }
+ );
+ }
+
+ Widget _buildServicesCatalog(BuildContext context) {
+
+ return const SingleChildScrollView(
+ scrollDirection: Axis.horizontal,
+ child: Column(
+ children: [
+ Row(
+ children: [
+ SizedBox(width: 16),
+ UpSalesServicesWidget(width: 328, height: 180),
+ UpSalesServicesWidget(width: 328, height: 180),
+ UpSalesServicesWidget(width: 328, height: 180),
+ ],
+ ),
+ ],
+ ),
+ );
+ }
+
+ Widget _buildRoomUpgradeCatalog(BuildContext context) {
+
+ return const SingleChildScrollView(
+ scrollDirection: Axis.horizontal,
+ child: Column(
+ children: [
+ Row(
+ children: [
+ SizedBox(width: 16),
+ UpSalesUpgradesWidget(),
+ UpSalesUpgradesWidget(),
+ ],
+ ),
+ ],
+ ),
+ );
+ }
+
+ Widget _buildOtherUpSalesCatalog(BuildContext context) {
+
+ return const SingleChildScrollView(
+ scrollDirection: Axis.horizontal,
+ child: Column(
+ children: [
+ Row(
+ children: [
+ SizedBox(width: 16),
+ UpSalesUpgradesWidget(),
+ UpSalesUpgradesWidget(),
+ ],
+ ),
+ ],
+ ),
+ );
+ }
+}
\ No newline at end of file