feat(SW-1259): Enter details multiroom * refactor: remove per-step URLs * WIP: map multiroom data * fix: lint errors in details page * fix: made useEnterDetailsStore tests pass * fix: WIP refactor enter details store * fix: WIP enter details store update * fix: added room index to select correct room * fix: added logic for navigating between steps and rooms * fix: update summary to work with store changes * fix: added room and total price calculation * fix: removed unused code and added test for breakfast included * refactor: move store selectors into helpers * refactor: session storage state for multiroom booking * feat: update enter details accordion navigation * fix: added room index to each form component so they select correct room * fix: added unique id to input to handle case when multiple inputs have same name * fix: update payment step with store changes * fix: rebase issues * fix: now you should only be able to go to a step if previous room is completed * refactor: cleanup * fix: if no availability just skip that room for now * fix: add select-rate Summary and adjust typings Approved-by: Arvid Norlin
61 lines
1.5 KiB
TypeScript
61 lines
1.5 KiB
TypeScript
"use client"
|
|
|
|
import { useRouter } from "next/navigation"
|
|
import { useEffect } from "react"
|
|
|
|
import { detailsStorageName } from "@/stores/enter-details"
|
|
|
|
import LoadingSpinner from "@/components/LoadingSpinner"
|
|
import { trackPaymentEvent } from "@/utils/tracking"
|
|
import { convertObjToSearchParams } from "@/utils/url"
|
|
|
|
// import type { PersistedState } from "@/types/stores/enter-details"
|
|
|
|
export default function PaymentCallback({
|
|
returnUrl,
|
|
searchObject,
|
|
status,
|
|
errorMessage,
|
|
}: {
|
|
returnUrl: string
|
|
searchObject: URLSearchParams
|
|
status: "error" | "success" | "cancel"
|
|
errorMessage?: string
|
|
}) {
|
|
const router = useRouter()
|
|
|
|
useEffect(() => {
|
|
const bookingData = window.sessionStorage.getItem(detailsStorageName)
|
|
|
|
if (bookingData) {
|
|
const detailsStorage: any = JSON.parse(bookingData) // TODO: fix type here
|
|
const searchParams = convertObjToSearchParams(
|
|
detailsStorage.booking,
|
|
searchObject
|
|
)
|
|
|
|
if (status === "cancel") {
|
|
trackPaymentEvent({
|
|
event: "paymentCancel",
|
|
hotelId: detailsStorage.booking.hotelId,
|
|
status: "cancelled",
|
|
})
|
|
}
|
|
if (status === "error") {
|
|
trackPaymentEvent({
|
|
event: "paymentFail",
|
|
hotelId: detailsStorage.booking.hotelId,
|
|
errorMessage,
|
|
status: "failed",
|
|
})
|
|
}
|
|
|
|
if (searchParams.size > 0) {
|
|
router.replace(`${returnUrl}?${searchParams.toString()}`)
|
|
}
|
|
}
|
|
}, [returnUrl, router, searchObject, status, errorMessage])
|
|
|
|
return <LoadingSpinner />
|
|
}
|