Feat(SW-1722) mystay multiroom view * feat(SW-1722) View all rooms on my stay * feat(sW-1722) Show linked reservation * feat(SW-1722) merged monorepo * feat(SW-1722) yarn install * feat(SW-1722) removed unused data * feat(SW-1722) Streaming data from the server to the client Approved-by: Niclas Edenvin
139 lines
3.7 KiB
TypeScript
139 lines
3.7 KiB
TypeScript
"use client"
|
|
import { motion } from "framer-motion"
|
|
import { useEffect, useState } from "react"
|
|
import { Dialog, Modal, ModalOverlay } from "react-aria-components"
|
|
import { useIntl } from "react-intl"
|
|
|
|
import { BookingStatusEnum } from "@/constants/booking"
|
|
|
|
import { ChevronDownIcon } from "@/components/Icons"
|
|
import {
|
|
type AnimationState,
|
|
AnimationStateEnum,
|
|
} from "@/components/Modal/modal"
|
|
import { slideFromTop } from "@/components/Modal/motionVariants"
|
|
import Button from "@/components/TempDesignSystem/Button"
|
|
|
|
import CancelStay from "../CancelStay"
|
|
import ActionPanel from "./ActionPanel"
|
|
|
|
import styles from "./modifyModal.module.css"
|
|
|
|
import type { Hotel } from "@/types/hotel"
|
|
import type { BookingConfirmation } from "@/types/trpc/routers/booking/confirmation"
|
|
|
|
type ActiveView = "actionPanel" | "cancelStay"
|
|
|
|
interface ManageStayProps {
|
|
booking: BookingConfirmation["booking"]
|
|
hotel: Hotel
|
|
setBookingStatus: (status: BookingStatusEnum) => void
|
|
bookingStatus: string | null
|
|
}
|
|
|
|
export default function ManageStay({
|
|
booking,
|
|
hotel,
|
|
setBookingStatus,
|
|
bookingStatus,
|
|
}: ManageStayProps) {
|
|
const [isOpen, setIsOpen] = useState(false)
|
|
const [animation, setAnimation] = useState<AnimationState>(
|
|
AnimationStateEnum.visible
|
|
)
|
|
const [activeView, setActiveView] = useState<ActiveView>("actionPanel")
|
|
|
|
const intl = useIntl()
|
|
|
|
const MotionOverlay = motion(ModalOverlay)
|
|
const MotionModal = motion(Modal)
|
|
|
|
const showCancelButton =
|
|
bookingStatus !== BookingStatusEnum.Cancelled && booking.isCancelable
|
|
|
|
useEffect(() => {
|
|
if (typeof isOpen === "boolean") {
|
|
setAnimation(
|
|
isOpen ? AnimationStateEnum.visible : AnimationStateEnum.hidden
|
|
)
|
|
}
|
|
if (isOpen === undefined) {
|
|
setAnimation(AnimationStateEnum.unmounted)
|
|
}
|
|
}, [isOpen])
|
|
|
|
function modalStateHandler(newAnimationState: AnimationState) {
|
|
setAnimation((currentAnimationState) =>
|
|
newAnimationState === AnimationStateEnum.hidden &&
|
|
currentAnimationState === AnimationStateEnum.hidden
|
|
? AnimationStateEnum.unmounted
|
|
: currentAnimationState
|
|
)
|
|
}
|
|
|
|
function handleClose() {
|
|
setIsOpen(false)
|
|
setActiveView("actionPanel")
|
|
}
|
|
function handleBack() {
|
|
setActiveView("actionPanel")
|
|
}
|
|
|
|
function renderContent() {
|
|
switch (activeView) {
|
|
case "cancelStay":
|
|
return (
|
|
<CancelStay
|
|
booking={booking}
|
|
hotel={hotel}
|
|
setBookingStatus={() =>
|
|
setBookingStatus(BookingStatusEnum.Cancelled)
|
|
}
|
|
handleCloseModal={handleClose}
|
|
handleBackToManageStay={handleBack}
|
|
/>
|
|
)
|
|
default:
|
|
return (
|
|
<ActionPanel
|
|
booking={booking}
|
|
hotel={hotel}
|
|
onCancelClick={() => setActiveView("cancelStay")}
|
|
showCancelButton={showCancelButton}
|
|
/>
|
|
)
|
|
}
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<Button variant="icon" fullWidth onClick={() => setIsOpen(true)}>
|
|
{intl.formatMessage({ id: "Manage stay" })}
|
|
<ChevronDownIcon width={24} height={24} color="burgundy" />
|
|
</Button>
|
|
<MotionOverlay
|
|
isOpen={isOpen}
|
|
className={styles.overlay}
|
|
initial={"hidden"}
|
|
onAnimationComplete={modalStateHandler}
|
|
onOpenChange={handleClose}
|
|
isDismissable
|
|
>
|
|
<MotionModal
|
|
className={styles.modal}
|
|
initial={"hidden"}
|
|
animate={animation}
|
|
variants={slideFromTop}
|
|
>
|
|
<Dialog
|
|
className={styles.dialog}
|
|
aria-label={intl.formatMessage({ id: "Dialog" })}
|
|
>
|
|
{renderContent()}
|
|
</Dialog>
|
|
</MotionModal>
|
|
</MotionOverlay>
|
|
</>
|
|
)
|
|
}
|