Feat(SW-1274) modify date my stay * feat(SW-1676): Modify guest details step 1 * feat(SW-1676) Integration to api to update guest details * feat(SW-1676) Reuse of old modal * feat(SW-1676) updated modify guest * feat(SW-1676) cleanup * feat(SW-1274) modify stay modal and datepicker * feat(SW-1274) DatePicker from modify dates * feat(SW-1274) Modify dates fixes and merge conflicts * feat(SW-1274) handle modify for multiroom * feat(SW-1274) update manage stay * feat(SW-1274) fixed some comments * feat(SW-1274) use Modal instead * feat(SW-1274) fixed formatChildBedPreferences * feat(SW-1274) removed any as prop * feat(SW-1274) fix rebase conflicts * feat(SW-1274) fix flicker on modify modal * feat(SW-1274) CalendarButton * feat(SW-1274) fixed gap variable * feat(SW-1274) simplified code * feat(SW-1274) Split up DatePicker on mode * feat(SW-1274) Updated file structure for datepicker Approved-by: Arvid Norlin
167 lines
5.2 KiB
TypeScript
167 lines
5.2 KiB
TypeScript
"use client"
|
|
|
|
import { useIntl } from "react-intl"
|
|
|
|
import { BookingStatusEnum } from "@/constants/booking"
|
|
import { customerService } from "@/constants/currentWebHrefs"
|
|
|
|
import AddToCalendar from "@/components/HotelReservation/AddToCalendar"
|
|
import { generateDateTime } from "@/components/HotelReservation/BookingConfirmation/Header/Actions/helpers"
|
|
import {
|
|
CalendarIcon,
|
|
ChevronRightIcon,
|
|
CreditCard,
|
|
CrossCircleOutlineIcon,
|
|
DownloadIcon,
|
|
} from "@/components/Icons"
|
|
import Button from "@/components/TempDesignSystem/Button"
|
|
import Link from "@/components/TempDesignSystem/Link"
|
|
import Body from "@/components/TempDesignSystem/Text/Body"
|
|
import Caption from "@/components/TempDesignSystem/Text/Caption"
|
|
import Subtitle from "@/components/TempDesignSystem/Text/Subtitle"
|
|
import useLang from "@/hooks/useLang"
|
|
|
|
import { useManageStayStore } from "../../stores/manageStayStore"
|
|
import AddToCalendarButton from "./Actions/AddToCalendarButton"
|
|
|
|
import styles from "./actionPanel.module.css"
|
|
|
|
import type { EventAttributes } from "ics"
|
|
|
|
import type { Hotel } from "@/types/hotel"
|
|
import type { BookingConfirmation } from "@/types/trpc/routers/booking/confirmation"
|
|
|
|
interface ActionPanelProps {
|
|
booking: BookingConfirmation["booking"]
|
|
hotel: Hotel
|
|
bookingStatus: string | null
|
|
showGuaranteeButton: boolean
|
|
onCancelClick: () => void
|
|
onGuaranteeClick: () => void
|
|
}
|
|
|
|
export default function ActionPanel({
|
|
booking,
|
|
hotel,
|
|
bookingStatus,
|
|
showGuaranteeButton,
|
|
onGuaranteeClick,
|
|
}: ActionPanelProps) {
|
|
const intl = useIntl()
|
|
const lang = useLang()
|
|
const {
|
|
actions: { setActiveView },
|
|
} = useManageStayStore()
|
|
|
|
const showCancelStayButton =
|
|
bookingStatus !== BookingStatusEnum.Cancelled && booking.isCancelable
|
|
|
|
const event: EventAttributes = {
|
|
busyStatus: "FREE",
|
|
categories: ["booking", "hotel", "stay"],
|
|
created: generateDateTime(booking.createDateTime),
|
|
description: hotel.hotelContent.texts.descriptions?.medium,
|
|
end: generateDateTime(booking.checkOutDate),
|
|
endInputType: "utc",
|
|
geo: {
|
|
lat: hotel.location.latitude,
|
|
lon: hotel.location.longitude,
|
|
},
|
|
location: `${hotel.address.streetAddress}, ${hotel.address.zipCode} ${hotel.address.city} ${hotel.address.country}`,
|
|
start: generateDateTime(booking.checkInDate),
|
|
startInputType: "utc",
|
|
status: "CONFIRMED",
|
|
title: hotel.name,
|
|
url: hotel.contactInformation.websiteUrl,
|
|
}
|
|
|
|
return (
|
|
<div className={styles.actionPanel}>
|
|
<div className={styles.menu}>
|
|
<Button
|
|
variant="icon"
|
|
onClick={() => setActiveView("modifyStay")}
|
|
intent="text"
|
|
className={styles.button}
|
|
>
|
|
{intl.formatMessage({ id: "Modify dates" })}
|
|
<CalendarIcon width={24} height={24} color="burgundy" />
|
|
</Button>
|
|
{showGuaranteeButton && (
|
|
<Button
|
|
variant="icon"
|
|
onClick={onGuaranteeClick}
|
|
intent="text"
|
|
className={styles.button}
|
|
>
|
|
{intl.formatMessage({ id: "Guarantee late arrival" })}
|
|
<CreditCard width={24} height={24} color="burgundy" />
|
|
</Button>
|
|
)}
|
|
<AddToCalendar
|
|
checkInDate={booking.checkInDate}
|
|
event={event}
|
|
hotelName={hotel.name}
|
|
renderButton={(onPress) => <AddToCalendarButton onPress={onPress} />}
|
|
/>
|
|
<Button
|
|
variant="icon"
|
|
onClick={() => {}}
|
|
intent="text"
|
|
className={styles.button}
|
|
>
|
|
{intl.formatMessage({ id: "Download invoice" })}
|
|
<DownloadIcon width={24} height={24} color="burgundy" />
|
|
</Button>
|
|
{showCancelStayButton && (
|
|
<Button
|
|
variant="icon"
|
|
onClick={() => setActiveView("cancelStay")}
|
|
intent="text"
|
|
className={styles.button}
|
|
>
|
|
{intl.formatMessage({ id: "Cancel stay" })}
|
|
<CrossCircleOutlineIcon width={24} height={24} color="burgundy" />
|
|
</Button>
|
|
)}
|
|
</div>
|
|
<div className={styles.info}>
|
|
<div>
|
|
<span className={styles.tag}>
|
|
{intl.formatMessage({ id: "Reference number" })}
|
|
</span>
|
|
<Subtitle color="burgundy" textAlign="right">
|
|
{booking.confirmationNumber}
|
|
</Subtitle>
|
|
</div>
|
|
<div>
|
|
<Body color="uiTextHighContrast" textAlign="right">
|
|
{hotel.name}
|
|
</Body>
|
|
<Body color="uiTextHighContrast" textAlign="right">
|
|
{hotel.address.streetAddress}
|
|
</Body>
|
|
<Body color="uiTextHighContrast" textAlign="right">
|
|
{hotel.address.city}
|
|
</Body>
|
|
<Body color="uiTextHighContrast" asChild>
|
|
<Link href={`tel:${hotel.contactInformation.phoneNumber}`}>
|
|
{hotel.contactInformation.phoneNumber}
|
|
</Link>
|
|
</Body>
|
|
</div>
|
|
<Link
|
|
href={customerService[lang]}
|
|
variant="icon"
|
|
className={styles.link}
|
|
>
|
|
<Caption color="burgundy">
|
|
{intl.formatMessage({ id: "Customer support" })}
|
|
</Caption>
|
|
<ChevronRightIcon width={20} height={20} color="burgundy" />
|
|
</Link>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|