import 'package:comwell_key_app/common/components/comwell_app_bar.dart';
import 'package:comwell_key_app/common/components/shimmer_loader/up_sales_catalog_shimmer_loader.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_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/utils/l10n_utils.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) {
// Show shimmer loader when loading
if (state.isLoading) {
return Scaffold(
appBar: const ComwellAppBar(),
backgroundColor: Theme.of(context).colorScheme.surface,
body: const UpSalesCatalogShimmerLoader(),
);
}
final cubit = context.read<UpSalesCubit>();
final serviceUpgrades = cubit.state.addOnUpgrades
.where((upgrade) => upgrade.isService)
.toList();
final addonUpgrades = cubit.upSales.addOnUpgrades
.where((upgrade) => !upgrade.isService)
.toList();
final selectedRoomUpgrade = cubit.state.selectedRoomUpgrade.isEmpty
? null
: cubit.upSales.roomUpgrades.firstWhere((e) => e.id == cubit.state.selectedRoomUpgrade);
return Scaffold(
appBar: const ComwellAppBar(),
backgroundColor: Theme.of(context).colorScheme.surface,
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.only(
top: 24,
bottom: 100,
left: 0,
right: 0,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text(
context.strings.up_sales_catalog_title,
style: theme.textTheme.headlineLarge,
),
),
const SizedBox(height: 40),
if (serviceUpgrades.isNotEmpty && serviceUpgrades.any((e) => e.isService)) ...[
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text(context.strings.services, style: theme.textTheme.headlineMedium),
),
const SizedBox(height: 8),
ServiceCatalog(
booking: cubit.booking,
upSales: serviceUpgrades,
onServiceSelected: (upgrade, isSelected) {
cubit.toggleSelectedUpgrade(upgrade);
},
onTap: (upgrade) {
cubit.toggleSelectedUpgrade(upgrade);
},
),
],
const SizedBox(height: 24),
if (cubit.upSales.roomUpgrades.isNotEmpty) ...[
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text(
context.strings.room_upgrades,
style: theme.textTheme.headlineMedium,
),
),
const SizedBox(height: 8),
RoomUpgradeCatalog(
booking: cubit.booking,
availableRoomUpgrades: cubit.upSales.roomUpgrades,
selectedRoomUpgrade: cubit.state.selectedRoomUpgrade,
onRoomUpgradeSelected: (upgrade, isSelected) {
cubit.toggleSelectedUpgrade(upgrade);
},
onTap: (upgrade) {
cubit.toggleSelectedUpgrade(upgrade);
},
),
const SizedBox(height: 24),
],
if (addonUpgrades.any((e) => !e.isService)) ...[
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text(
context.strings.other_up_sales,
style: theme.textTheme.headlineMedium,
),
),
const SizedBox(height: 8),
AddOnUpgradeCatalog(
addOnUpgrades: cubit.otherUpgrades,
extrasTotalPrice: cubit.extrasTotalPrice,
selectedRoomUpgrade: selectedRoomUpgrade?.id ?? '',
onAddOnUpgradeSelected: (upgrade, quantity) {
cubit.updateAddonUpgradeQuantity(upgrade, quantity);
},
onServingTimeSelected: (time) {},
),
],
const SizedBox(height: 24),
],
),
),
),
bottomNavigationBar: Column(
mainAxisSize: MainAxisSize.min,
children: [
const Divider(color: colorDivider),
UpSalesContinueButton(
selectedUpSales: cubit.selectedAddOnUpgrades,
extrasTotalPrice: cubit.extrasTotalPrice,
selectedRoomUpgrade: selectedRoomUpgrade,
),
],
),
);
},
);
}
}