import { useState } from "react" import { useIntl } from "react-intl" import { trpc } from "@/lib/trpc/client" import { toast } from "@/components/TempDesignSystem/Toasts" import useLang from "@/hooks/useLang" import type { CancelStayProps, FormValues, } from "@/types/components/hotelReservation/myStay/cancelStay" interface UseCancelStayProps extends Omit { getFormValues: () => FormValues // Function to get form values } export default function useCancelStay({ booking, setBookingStatus, handleCloseModal, handleBackToManageStay, getFormValues, }: UseCancelStayProps) { const intl = useIntl() const lang = useLang() const [currentStep, setCurrentStep] = useState(1) const [isLoading, setIsLoading] = useState(false) const cancelStay = trpc.booking.cancel.useMutation({ onMutate: () => setIsLoading(true), }) async function handleCancelStay() { if (!booking.confirmationNumber) { toast.error( intl.formatMessage({ id: "Something went wrong. Please try again later.", }) ) return } setIsLoading(true) try { // Get form values using the provided getter function const formValues = getFormValues() const { rooms } = formValues const checkedRooms = rooms.filter((room) => room.checked) const results = [] const errors = [] // Process each checked room sequentially for (const room of checkedRooms) { const confirmationNumber = room.confirmationNumber || booking.confirmationNumber try { const result = await cancelStay.mutateAsync({ confirmationNumber: confirmationNumber, language: lang, }) if (result) { results.push(room.id) } else { errors.push(room.id) } } catch (error) { console.error( `Error cancelling room ${room.confirmationNumber}:`, error ) toast.error( intl.formatMessage({ id: "Something went wrong. Please try again later.", }) ) errors.push(room.id) } } // Handle results if (results.length > 0 && errors.length === 0) { // All rooms were cancelled successfully setBookingStatus() toast.success( intl.formatMessage( { id: "Your stay was cancelled. Cancellation cost: 0 {currency}. We're sorry to see that the plans didn't work out", }, { currency: booking.currencyCode } ) ) } else if (results.length > 0 && errors.length > 0) { // Some rooms were cancelled, some failed setBookingStatus() toast.warning( intl.formatMessage({ id: "Some rooms were cancelled successfully, but we encountered issues with others. Please contact customer service for assistance.", }) ) } else { // All rooms failed to cancel toast.error( intl.formatMessage({ id: "Something went wrong. Please try again later.", }) ) } handleCloseModal() } catch (error) { console.error("Error in handleCancelStay:", error) toast.error( intl.formatMessage({ id: "Something went wrong. Please try again later.", }) ) setIsLoading(false) } } function handleCloseCancelStay() { setCurrentStep(1) setIsLoading(false) handleBackToManageStay() } return { currentStep, isLoading, handleCancelStay, handleCloseCancelStay, handleBack: () => setCurrentStep(1), handleForward: () => setCurrentStep(2), } }