Feat(SW-1279) mystay multirum cancelling * feat(SW-1279) Cancelation text if non-user on room 2-4 * feat(SW-1279) cancel mystay multiroom * feat(SW-1279): Added cancellation for multiroom on mystay Approved-by: Niclas Edenvin
141 lines
3.7 KiB
TypeScript
141 lines
3.7 KiB
TypeScript
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<CancelStayProps, "hotel"> {
|
|
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),
|
|
}
|
|
}
|