Files
web/apps/scandic-web/hooks/booking/useGuaranteeBooking.ts
Anton Gunnarsson e572d9e7e9 Merged in feat/sw-2862-move-booking-router-to-trpc-package (pull request #2421)
feat(SW-2861): Move booking router to trpc package

* Use direct imports from trpc package

* Add lint-staged config to trpc

* Move lang enum to common

* Restructure trpc package folder structure

* WIP first step

* update internal imports in trpc

* Fix most errors in scandic-web

Just 100 left...

* Move Props type out of trpc

* Fix CategorizedFilters types

* Move more schemas in hotel router

* Fix deps

* fix getNonContentstackUrls

* Fix import error

* Fix entry error handling

* Fix generateMetadata metrics

* Fix alertType enum

* Fix duplicated types

* lint:fix

* Merge branch 'master' into feat/sw-2863-move-contentstack-router-to-trpc-package

* Fix broken imports

* Move booking router to trpc package

* Move partners router to trpc package

* Move autocomplete router to trpc package

* Move booking router to trpc package

* Merge branch 'master' into feat/sw-2862-move-booking-router-to-trpc-package


Approved-by: Linus Flood
2025-06-26 13:21:16 +00:00

108 lines
2.9 KiB
TypeScript

import { useRouter } from "next/navigation"
import { useCallback, useEffect, useState } from "react"
import { useIntl } from "react-intl"
import { BookingStatusEnum } from "@scandic-hotels/trpc/enums/bookingStatus"
import { trpc } from "@/lib/trpc/client"
import { toast } from "@/components/TempDesignSystem/Toasts"
import { useHandleBookingStatus } from "@/hooks/booking/useHandleBookingStatus"
import { trackEvent } from "@/utils/tracking/base"
const maxRetries = 15
const retryInterval = 2000
export function useGuaranteeBooking(
refId: string,
isAncillaryFlow = false,
hotelId: string
) {
const intl = useIntl()
const router = useRouter()
const [isPollingForBookingStatus, setIsPollingForBookingStatus] =
useState(false)
const handleGuaranteeError = useCallback(
(errorMessage?: string) => {
trackEvent({
event: "glaCardSaveFailed",
hotelInfo: {
hotelId,
lateArrivalGuarantee: "yes",
guaranteedProduct: isAncillaryFlow ? "room + ancillary" : "room",
},
paymentInfo: {
status: "glacardsavefailed",
errorMessage,
},
})
toast.error(
intl.formatMessage({
defaultMessage:
"We had an issue guaranteeing your booking. Please try again.",
})
)
},
[intl, isAncillaryFlow, hotelId]
)
const utils = trpc.useUtils()
const guaranteeBooking = trpc.booking.guarantee.useMutation({
onSuccess: (result) => {
if (result) {
const mainRoom = result.rooms[0]
if (result.reservationStatus == BookingStatusEnum.BookingCompleted) {
utils.booking.get.invalidate({ refId: mainRoom.refId })
} else {
setIsPollingForBookingStatus(true)
utils.booking.status.invalidate({ refId: mainRoom.refId })
}
} else {
handleGuaranteeError()
}
},
onError: (error) => {
handleGuaranteeError(error.message)
},
})
const bookingStatus = useHandleBookingStatus({
refId,
expectedStatuses: [BookingStatusEnum.BookingCompleted],
maxRetries,
retryInterval,
enabled: isPollingForBookingStatus,
})
useEffect(() => {
if (bookingStatus?.data?.booking.paymentUrl && isPollingForBookingStatus) {
router.push(bookingStatus.data.booking.paymentUrl)
utils.booking.get.invalidate({ refId })
setIsPollingForBookingStatus(false)
} else if (bookingStatus.isTimeout) {
handleGuaranteeError("Timeout")
}
}, [
bookingStatus,
router,
handleGuaranteeError,
setIsPollingForBookingStatus,
isPollingForBookingStatus,
refId,
utils.booking.get,
])
const isLoading =
guaranteeBooking.isPending ||
(isPollingForBookingStatus &&
!bookingStatus.data?.booking.paymentUrl &&
!bookingStatus.isTimeout)
return {
guaranteeBooking,
isLoading,
handleGuaranteeError,
}
}