feat(SW-2605): confirmation page only valid for 1 minute for the session

This commit is contained in:
Michael Zetterberg
2025-05-06 12:04:00 +02:00
parent e0fe5ff0d5
commit c6a0ce86df
9 changed files with 73 additions and 21 deletions

View File

@@ -19,15 +19,22 @@ const validBookingStatuses = [
interface HandleStatusPollingProps {
refId: string
sig: string
successRedirectUrl: string
}
export default function HandleSuccessCallback({
refId,
sig,
successRedirectUrl,
}: HandleStatusPollingProps) {
const router = useRouter()
useEffect(() => {
// Cookie is used by Booking Confirmation page to validate that the user came from payment callback
document.cookie = `bcsig=${sig}; Path=/; Max-Age=60; Secure; SameSite=Strict`
}, [sig])
const {
data: bookingStatus,
error,
@@ -41,13 +48,13 @@ export default function HandleSuccessCallback({
})
useEffect(() => {
if (!bookingStatus?.reservationStatus) {
if (!bookingStatus?.booking.reservationStatus) {
return
}
if (
validBookingStatuses.includes(
bookingStatus.reservationStatus as BookingStatusEnum
bookingStatus.booking.reservationStatus as BookingStatusEnum
)
) {
const glaSessionData = readGlaFromSessionStorage()
@@ -63,7 +70,7 @@ export default function HandleSuccessCallback({
clearGlaSessionStorage()
}
// a successful booking can still have membership errors
const membershipFailedError = bookingStatus.errors.find(
const membershipFailedError = bookingStatus.booking.errors.find(
(e) => e.errorCode === MEMBERSHIP_FAILED_ERROR
)
const errorParam = membershipFailedError

View File

@@ -155,9 +155,12 @@ export default function PaymentClient({
return
}
const mainRoom = result.rooms[0]
const { booking } = result
const mainRoom = booking.rooms[0]
if (result.reservationStatus == BookingStatusEnum.BookingCompleted) {
if (booking.reservationStatus == BookingStatusEnum.BookingCompleted) {
// Cookie is used by Booking Confirmation page to validate that the user came from payment callback
document.cookie = `bcsig=${result.sig}; Path=/; Max-Age=60; Secure; SameSite=Strict`
const confirmationUrl = `${bookingConfirmation(lang)}?RefId=${encodeURIComponent(mainRoom.refId)}`
router.push(confirmationUrl)
return
@@ -165,9 +168,9 @@ export default function PaymentClient({
setRefId(mainRoom.refId)
const hasPriceChange = result.rooms.some((r) => r.priceChangedMetadata)
const hasPriceChange = booking.rooms.some((r) => r.priceChangedMetadata)
if (hasPriceChange) {
const priceChangeData = result.rooms.map(
const priceChangeData = booking.rooms.map(
(room) => room.priceChangedMetadata || null
)
setPriceChangeData(priceChangeData)
@@ -258,13 +261,15 @@ export default function PaymentClient({
)
useEffect(() => {
if (bookingStatus?.data?.paymentUrl) {
router.push(bookingStatus.data.paymentUrl)
if (bookingStatus?.data?.booking.paymentUrl) {
router.push(bookingStatus.data.booking.paymentUrl)
} else if (
bookingStatus?.data?.reservationStatus ===
bookingStatus?.data?.booking.reservationStatus ===
BookingStatusEnum.BookingCompleted
) {
const mainRoom = bookingStatus.data.rooms[0]
const mainRoom = bookingStatus.data.booking.rooms[0]
// Cookie is used by Booking Confirmation page to validate that the user came from payment callback
document.cookie = `bcsig=${bookingStatus.data.sig}; Path=/; Max-Age=60; Secure; SameSite=Strict`
const confirmationUrl = `${bookingConfirmation(lang)}?RefId=${encodeURIComponent(mainRoom.refId)}`
router.push(confirmationUrl)
} else if (bookingStatus.isTimeout) {