"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( AnimationStateEnum.visible ) const [activeView, setActiveView] = useState("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 ( setBookingStatus(BookingStatusEnum.Cancelled) } handleCloseModal={handleClose} handleBackToManageStay={handleBack} /> ) default: return ( setActiveView("cancelStay")} showCancelButton={showCancelButton} /> ) } } return ( <> {renderContent()} ) }