diff --git a/src/uxcore/components/NewUpdateModal/NewUpdateModal.tsx b/src/uxcore/components/NewUpdateModal/NewUpdateModal.tsx index c3d8bb8..492d67c 100644 --- a/src/uxcore/components/NewUpdateModal/NewUpdateModal.tsx +++ b/src/uxcore/components/NewUpdateModal/NewUpdateModal.tsx @@ -1,11 +1,10 @@ +import Button from '@uxcore/components/Button'; +import Modal from '@uxcore/components/Modal'; import Image from 'next/image'; import Link from 'next/link'; import { FC } from 'react'; import ReactMarkdown from 'react-markdown'; -import Button from '@uxcore/components/Button'; -import Modal from '@uxcore/components/Modal'; - import type { NewUpdateModalProps } from './NewUpdateModal.types'; import styles from './NewUpdateModal.module.scss'; diff --git a/src/uxcore/components/NewUpdateModal/NewUpdateModal.types.ts b/src/uxcore/components/NewUpdateModal/NewUpdateModal.types.ts index 43b73f8..7a4d2f9 100644 --- a/src/uxcore/components/NewUpdateModal/NewUpdateModal.types.ts +++ b/src/uxcore/components/NewUpdateModal/NewUpdateModal.types.ts @@ -12,6 +12,7 @@ export interface NewUpdateData { 'Close button text'?: string; 'Frontend modal visibility'?: boolean; 'Appears after x seconds'?: number; + updatedAt?: string; } export interface NewUpdateModalProps { diff --git a/src/uxcore/components/NewUpdateModal/NewUpdateModalContainer.tsx b/src/uxcore/components/NewUpdateModal/NewUpdateModalContainer.tsx index fa2d68a..8634b58 100644 --- a/src/uxcore/components/NewUpdateModal/NewUpdateModalContainer.tsx +++ b/src/uxcore/components/NewUpdateModal/NewUpdateModalContainer.tsx @@ -5,6 +5,8 @@ import { FC, useEffect, useState } from 'react'; import NewUpdateModal from './NewUpdateModal'; import type { NewUpdateData } from './NewUpdateModal.types'; +const DISMISSED_KEY = 'uxcoreNewUpdateDismissed'; + const NewUpdateModalContainer: FC = () => { const router = useRouter(); const [data, setData] = useState(null); @@ -22,6 +24,11 @@ const NewUpdateModalContainer: FC = () => { if (cancelled || !res || !res['Frontend modal visibility']) return; + // Dismissal is keyed to the CMS updatedAt: closing hides this update + // for the rest of the session, but a newly published one shows again. + if (sessionStorage.getItem(DISMISSED_KEY) === (res.updatedAt ?? 'seen')) + return; + setData(res); const delaySeconds = Number(res['Appears after x seconds']) || 0; @@ -42,9 +49,18 @@ const NewUpdateModalContainer: FC = () => { }; }, [router.locale]); + const handleClose = () => { + setOpen(false); + try { + sessionStorage.setItem(DISMISSED_KEY, data?.updatedAt ?? 'seen'); + } catch { + // Storage can be unavailable (private mode); closing still works. + } + }; + if (!open || !data) return null; - return setOpen(false)} />; + return ; }; export default NewUpdateModalContainer;