"use client" import { usePathname, useRouter, useSearchParams } from "next/navigation" import { useCallback, useEffect, useRef } from "react" import { useIntl } from "react-intl" import { toast } from "@scandic-hotels/design-system/Toast" import { BookingErrorCodeEnum } from "@scandic-hotels/trpc/enums/bookingErrorCode" import { isAncillaryError } from "@/components/HotelReservation/MyStay/utils" export function useGuaranteePaymentFailedToast() { const hasRunOnce = useRef(false) const intl = useIntl() const searchParams = useSearchParams() const pathname = usePathname() const router = useRouter() const getErrorMessage = useCallback( (errorCode: string | null) => { switch (errorCode) { case BookingErrorCodeEnum.TransactionCancelled: return intl.formatMessage({ id: "guaranteePayment.cancelled", defaultMessage: "You have cancelled the payment. Your booking is not guaranteed.", }) default: return intl.formatMessage({ id: "guaranteePayment.failed", defaultMessage: "We had an issue guaranteeing your booking. Please try again.", }) } }, [intl] ) useEffect(() => { // To prevent multiple toasts in strict mode if (hasRunOnce.current) { return } const errorCode = searchParams.get("errorCode") if (!errorCode) { return } // Ancillary errors are handled in AddAncillaryFlowModal if (isAncillaryError(searchParams)) { hasRunOnce.current = true return } const errorMessage = getErrorMessage(errorCode) const toastType = errorCode === BookingErrorCodeEnum.TransactionCancelled ? "warning" : "error" toast[toastType](errorMessage) const queryParams = new URLSearchParams(searchParams.toString()) queryParams.delete("errorCode") router.push(`${pathname}?${queryParams.toString()}`) hasRunOnce.current = true }, [searchParams, pathname, router, getErrorMessage]) }