Files
web/apps/scandic-web/components/SitewideAlert/index.tsx
Hrishikesh Vaipurkar 44fce176e9 Merged in chore/SW-3246-move-alert-to-design-system (pull request #2698)
chore(SW-3246): Moved Alert component into design system

* chore(SW-3246): Moved Alert component into design system

* chore(SW-3246): Optimsed code and imports

* chore(SW-3246): Moved type AlertTypeEnum and other to common package


Approved-by: Anton Gunnarsson
2025-08-26 11:22:38 +00:00

90 lines
2.4 KiB
TypeScript

"use client"
import { useCallback, useRef } from "react"
import { AlertTypeEnum } from "@scandic-hotels/common/constants/alert"
import useStickyPosition from "@scandic-hotels/common/hooks/useStickyPosition"
import { StickyElementNameEnum } from "@scandic-hotels/common/stores/sticky-position"
import { debounce } from "@scandic-hotels/common/utils/debounce"
import { Alert } from "@scandic-hotels/design-system/Alert"
import { trpc } from "@scandic-hotels/trpc/client"
import useLang from "@/hooks/useLang"
import styles from "./sitewideAlert.module.css"
export default function SiteWideAlert() {
const alertRef = useRef<HTMLDivElement>(null)
const lang = useLang()
const { data: siteConfig, isLoading } =
trpc.contentstack.base.siteConfig.useQuery(
{ lang },
{ refetchInterval: 60_000 }
)
const alert = siteConfig?.sitewideAlert
const isAlarm = alert?.type === AlertTypeEnum.Alarm
useStickyPosition({
ref: isAlarm ? alertRef : undefined,
name: StickyElementNameEnum.SITEWIDE_ALERT,
})
const updateHeightRefCallback = useCallback(
(node: HTMLDivElement | null) => {
if (node) {
const debouncedUpdate = debounce(([entry]) => {
const height = entry.contentRect.height
document.documentElement.style.setProperty(
"--sitewide-alert-height",
`${height}px`
)
document.documentElement.style.setProperty(
"--sitewide-alert-sticky-height",
isAlarm ? `${height}px` : "0px"
)
}, 100)
const observer = new ResizeObserver(debouncedUpdate)
observer.observe(node)
return () => {
if (node) {
observer.unobserve(node)
}
observer.disconnect()
}
}
},
[isAlarm]
)
if (isLoading || !alert) {
return null
}
return (
<div
id="sitewide-alert"
ref={(node) => {
alertRef.current = node
return updateHeightRefCallback(node)
}}
className={`${styles.sitewideAlert} ${isAlarm ? styles.alarm : ""}`}
>
<Alert
variant="banner"
type={alert.type}
link={alert.link}
phoneContact={alert.phoneContact}
sidepeekCtaText={alert.sidepeekButton?.cta_text}
sidepeekContent={alert.sidepeekContent}
heading={alert.heading}
text={alert.text}
/>
</div>
)
}