import 'package:comwell_key_app/choose_share_room/components/share_room_confirm_dialog.dart';
import 'package:comwell_key_app/choose_share_room/cubit/choose_share_room_cubit.dart';
import 'package:comwell_key_app/choose_share_room/cubit/choose_share_room_state.dart';
import 'package:comwell_key_app/overview/models/booking.dart';
import 'package:comwell_key_app/routing/app_routes.dart';
import 'package:comwell_key_app/utils/l10n_utils.dart';
import 'package:flutter/material.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:go_router/go_router.dart';
class ChooseRoomWidget extends StatelessWidget {
final Booking booking;
final String roomName;
final String description;
final int guests;
final String imageAsset;
final String? extraInfo;
const ChooseRoomWidget({
super.key,
required this.booking,
required this.roomName,
required this.description,
required this.guests,
required this.imageAsset,
this.extraInfo,
});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return BlocBuilder<ChooseShareRoomCubit, ChooseShareRoomState>(
builder: (context, state) {
final cubit = context.read<ChooseShareRoomCubit>();
final isAssigned = cubit.state.rooms.any(
(room) =>
room.confirmationNumber == booking.confirmationNumber && room.assignedTo != null,
);
return GestureDetector(
onTap: () async {
final result = await context.push(
AppRoutes.roomInfo,
extra: [booking, isAssigned],
);
if (result != null && result is bool) {
await cubit.assignRoomToUser(booking.confirmationNumber, booking.firstName);
}
},
child: Container(
margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
decoration: BoxDecoration(
border: Border.all(color: colorDivider),
borderRadius: BorderRadius.circular(16),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
roomName,
style: theme.textTheme.headlineSmall,
),
const SizedBox(height: 4),
SizedBox(
width: 200,
child: Text(
description,
style: theme.textTheme.bodySmall,
maxLines: 2,
overflow: TextOverflow.ellipsis,
softWrap: true,
),
),
],
),
ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Image.asset(
imageAsset,
width: 60,
height: 60,
fit: BoxFit.cover,
),
),
],
),
),
Padding(
padding: const EdgeInsets.only(left: 16.0, right: 16.0, bottom: 8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SvgPicture.asset("assets/icons/user-circle.svg", width: 20, height: 20),
const SizedBox(width: 4),
Text(
'${booking.adults} ${booking.adults > 1 ? context.strings.adults : context.strings.adult}${booking.children > 0 ? ' | ${booking.children} ${booking.children > 1 ? context.strings.children : context.strings.child}' : ''}',
style: theme.textTheme.bodySmall,
),
const VerticalDivider(color: colorDivider, thickness: 1.5),
Text(
context.strings.read_more,
style: theme.textTheme.bodySmall?.copyWith(
decoration: TextDecoration.underline,
),
),
],
),
),
if (extraInfo != null) ...[
const SizedBox(height: 8),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
context.strings.added_to_room,
style: theme.textTheme.bodySmall,
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Text(
extraInfo!,
style: theme.textTheme.bodySmall?.copyWith(fontWeight: FontWeight.bold),
),
),
const SizedBox(height: 8),
],
Column(
children: [
const Divider(color: colorDivider),
Padding(
padding: const EdgeInsets.only(
left: 16.0,
right: 16.0,
top: 8.0,
bottom: 16.0,
),
child: SizedBox(
width: double.infinity,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
foregroundColor: Colors.white,
),
onPressed: () async {
if (isAssigned) {
context.push(AppRoutes.shareRoom, extra: booking);
return;
}
final result = await showDialog<bool>(
context: context,
barrierDismissible: false,
builder: (context) {
return const ShareRoomConfirmDialog();
},
);
if (result != null && result) {
await cubit.assignRoomToUser(
booking.confirmationNumber,
booking.firstName,
);
if (context.mounted) {
context.pop();
}
}
},
child: Text(
isAssigned ? context.strings.share_room : context.strings.choose_room,
),
),
),
),
],
),
],
),
),
);
},
);
}
}