Files
web/apps/scandic-web/components/HotelReservation/MyStay/TrackGuarantee.tsx
Anton Gunnarsson 5a86cbaafe Merged in chore/update-eslint-configs (pull request #2812)
chore: Extend eslint configs from @typescript-eslint/recommended

* Change to typescript recommended in scandic-web

* Remove comment

* Change to recommended ts config in partner-sas

* Change to recommended ts lint config in booking-flow


Approved-by: Linus Flood
2025-09-17 07:55:11 +00:00

126 lines
3.7 KiB
TypeScript

"use client"
import { useRouter } from "next/navigation"
import { useEffect } from "react"
import {
clearGlaSessionStorage,
readGlaFromSessionStorage,
} from "@scandic-hotels/booking-flow/components/EnterDetails/Payment/PaymentCallback/helpers"
import { PaymentCallbackStatusEnum } from "@scandic-hotels/common/constants/paymentCallbackStatusEnum"
import { LoadingSpinner } from "@scandic-hotels/design-system/LoadingSpinner"
import { trackEvent } from "@scandic-hotels/tracking/base"
import { getAncillarySessionData } from "@/components/HotelReservation/MyStay/utils/ancillaries"
import {
buildAncillariesTracking,
buildBreakfastTracking,
} from "@/utils/tracking/myStay"
interface TrackGuaranteeProps {
status: string
isAncillaryFlow?: boolean
redirectUrl: string
errorMessage?: string
}
export default function TrackGuarantee({
status,
isAncillaryFlow = false,
redirectUrl,
errorMessage,
}: TrackGuaranteeProps) {
const router = useRouter()
useEffect(() => {
const trackAncillaryPaymentEvent = (event: string, status: string) => {
const sessionData = getAncillarySessionData()
const { formData, selectedAncillary, packages, breakfastData } =
sessionData || {}
trackEvent({
event,
paymentInfo: { status },
hotelInfo: {
hotelId: selectedAncillary?.hotelId,
lateArrivalGuarantee: "yes",
guaranteedProduct: "room + ancillary",
},
ancillaries: breakfastData
? buildBreakfastTracking(breakfastData)
: buildAncillariesTracking(
packages ?? [],
selectedAncillary,
formData?.deliveryTime
),
})
}
const trackGuaranteePaymentEvent = (event: string, status: string) => {
const glaSessionData = readGlaFromSessionStorage()
trackEvent({
event,
hotelInfo: {
hotelId: glaSessionData?.hotelId,
lateArrivalGuarantee: "yes",
guaranteedProduct: "room",
},
paymentInfo: {
status,
type: glaSessionData?.paymentMethod,
isSavedCreditCard: glaSessionData?.isSavedCreditCard,
...(errorMessage && { errorMessage }),
},
})
clearGlaSessionStorage()
}
switch (status) {
case PaymentCallbackStatusEnum.Success:
const glaSessionData = readGlaFromSessionStorage()
trackEvent({
event: "guaranteeBookingSuccess",
hotelInfo: {
hotelId: glaSessionData?.hotelId,
lateArrivalGuarantee: "yes",
guaranteedProduct: "room",
},
paymentInfo: {
type: glaSessionData?.paymentMethod,
hotelId: glaSessionData?.hotelId,
isSavedCreditCard: glaSessionData?.isSavedCreditCard,
},
})
clearGlaSessionStorage()
break
case PaymentCallbackStatusEnum.Cancel:
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
isAncillaryFlow
? trackAncillaryPaymentEvent(
"GuaranteeCancelAncillary",
"glacardsavecancelled"
)
: trackGuaranteePaymentEvent(
"glaCardSaveCancelled",
"glacardsavecancelled"
)
break
case PaymentCallbackStatusEnum.Error:
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
isAncillaryFlow
? trackAncillaryPaymentEvent(
"GuaranteeFailAncillary",
"glacardsavefailed"
)
: trackGuaranteePaymentEvent("glaCardSaveFailed", "glacardsavefailed")
break
}
router.replace(redirectUrl)
}, [status, isAncillaryFlow, redirectUrl, errorMessage, router])
return <LoadingSpinner />
}