Files
web/apps/scandic-web/components/SidePeeks/SidePeekProvider/index.tsx
Erik Tiekstra 1ec479e601 Merged in feat/SW-1554-sidepeek-tracking-hotel-pages (pull request #1460)
feat(SW-1554): Added tracking support for sidepeeks inside hotel pages

* feat(SW-1554): Added tracking support for sidepeeks inside hotel pages


Approved-by: Linus Flood
2025-03-04 07:02:04 +00:00

53 lines
1.2 KiB
TypeScript

"use client"
import { useRouter } from "next/navigation"
import { createContext, useEffect, useState } from "react"
import useHash from "@/hooks/useHash"
interface SidepeekProviderProps extends React.PropsWithChildren {
onOpen?: (sidePeek: string) => void
}
interface ISidePeekContext {
handleClose: (isOpen: boolean) => void
activeSidePeek: string | null
}
export const SidePeekContext = createContext<ISidePeekContext | null>(null)
export default function SidePeekProvider({
children,
onOpen,
}: SidepeekProviderProps) {
const router = useRouter()
const hash = useHash()
const [activeSidePeek, setActiveSidePeek] = useState<string | null>(null)
useEffect(() => {
if (hash?.startsWith("s-")) {
setActiveSidePeek(hash.slice(2))
} else {
setActiveSidePeek(null)
}
}, [hash, setActiveSidePeek])
useEffect(() => {
if (activeSidePeek && onOpen) {
onOpen(activeSidePeek)
}
}, [activeSidePeek, onOpen])
function handleClose(isOpen: boolean) {
if (!isOpen) {
router.push(window.location.pathname, { scroll: false })
setActiveSidePeek(null)
}
}
return (
<SidePeekContext.Provider value={{ handleClose, activeSidePeek }}>
{children}
</SidePeekContext.Provider>
)
}