Merged in chore/move-enter-details (pull request #2778)

Chore/move enter details

Approved-by: Anton Gunnarsson
This commit is contained in:
Joakim Jäderberg
2025-09-11 07:16:24 +00:00
parent 15711cb3a4
commit 7dee6d5083
238 changed files with 1656 additions and 1602 deletions

View File

@@ -0,0 +1,112 @@
"use client"
import { useRouter } from "next/navigation"
import { useEffect } from "react"
import { PaymentCallbackStatusEnum } from "@scandic-hotels/common/constants/paymentCallbackStatusEnum"
import { LoadingSpinner } from "@scandic-hotels/design-system/LoadingSpinner"
import { trackEvent } from "@scandic-hotels/tracking/base"
import { detailsStorageName } from "../../../../stores/enter-details"
import { useTrackingContext } from "../../../../trackingContext"
import { serializeBookingSearchParams } from "../../../../utils/url"
import {
clearPaymentInfoSessionStorage,
readPaymentInfoFromSessionStorage,
} from "../helpers"
import { clearGlaSessionStorage, readGlaFromSessionStorage } from "./helpers"
import type { PersistedState } from "../../../../stores/enter-details/types"
export function HandleErrorCallback({
returnUrl,
searchObject,
status,
errorMessage,
}: {
returnUrl: string
searchObject: URLSearchParams
status: PaymentCallbackStatusEnum
errorMessage?: string
}) {
const router = useRouter()
const { trackPaymentEvent } = useTrackingContext()
useEffect(() => {
const bookingData = window.sessionStorage.getItem(detailsStorageName)
if (bookingData) {
const detailsStorage: PersistedState = JSON.parse(bookingData)
const searchParams = serializeBookingSearchParams(
detailsStorage.booking,
{
initialSearchParams: searchObject,
}
)
const glaSessionData = readGlaFromSessionStorage()
const paymentInfoSessionData = readPaymentInfoFromSessionStorage()
if (status === PaymentCallbackStatusEnum.Cancel) {
if (glaSessionData) {
trackEvent({
event: "glaCardSaveCancelled",
hotelInfo: {
hotelId: glaSessionData.hotelId,
lateArrivalGuarantee: glaSessionData.lateArrivalGuarantee,
guaranteedProduct: "room",
},
paymentInfo: {
hotelId: glaSessionData.hotelId,
status: "glacardsavecancelled",
type: glaSessionData.paymentMethod,
isSavedCreditCard: glaSessionData.isSavedCreditCard,
},
})
} else {
trackPaymentEvent({
event: "paymentCancel",
hotelId: detailsStorage.booking.hotelId,
status: "cancelled",
method: paymentInfoSessionData?.paymentMethod,
isSavedCreditCard: paymentInfoSessionData?.isSavedCreditCard,
})
}
}
if (status === PaymentCallbackStatusEnum.Error) {
if (glaSessionData) {
trackEvent({
event: "glaCardSaveFailed",
hotelInfo: {
hotelId: glaSessionData.hotelId,
lateArrivalGuarantee: glaSessionData.lateArrivalGuarantee,
guaranteedProduct: "room",
},
paymentInfo: {
hotelId: glaSessionData.hotelId,
status: "glacardsavefailed",
type: glaSessionData.paymentMethod,
isSavedCreditCard: glaSessionData.isSavedCreditCard,
},
})
} else {
trackPaymentEvent({
event: "paymentFail",
hotelId: detailsStorage.booking.hotelId,
errorMessage,
status: "failed",
method: paymentInfoSessionData?.paymentMethod,
isSavedCreditCard: paymentInfoSessionData?.isSavedCreditCard,
})
}
}
clearGlaSessionStorage()
clearPaymentInfoSessionStorage()
if (searchParams.size > 0) {
router.replace(`${returnUrl}?${searchParams.toString()}`)
}
}
}, [returnUrl, router, searchObject, status, errorMessage, trackPaymentEvent])
return <LoadingSpinner fullPage />
}