Files
web/apps/scandic-web/components/SitewideAlert/index.tsx
Anton Gunnarsson be25be7bb5 Merged in feat/sw-3125-move-client-trpc-setup (pull request #2493)
feat(SW-3125): Move client trpc setup

* Move client trpc to package

* Client setup in partner-sas

* Add todo


Approved-by: Linus Flood
2025-07-01 12:41:28 +00:00

91 lines
2.3 KiB
TypeScript

"use client"
import { useCallback, useRef } from "react"
import { trpc } from "@scandic-hotels/trpc/client"
import { AlertTypeEnum } from "@scandic-hotels/trpc/types/alertType"
import { StickyElementNameEnum } from "@/stores/sticky-position"
import Alert from "@/components/TempDesignSystem/Alert"
import useLang from "@/hooks/useLang"
import useStickyPosition from "@/hooks/useStickyPosition"
import { debounce } from "@/utils/debounce"
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>
)
}