import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { GiftIcon } from '@phosphor-icons/react' import { useChangelog, readLastSeenVersion, isVersionNewer, } from './useChangelog' import { WhatsNewModal } from './WhatsNewModal' import { cn } from '@/lib/utils' /** * «Что нового» button в TopBar. * *
🎁 GiftIcon с red unread badge counter (entries newer than * {@code localStorage.ord-whatsnew-last-seen}). Click → {@link WhatsNewModal}. * *
Modal extracted в own component — также используется в
* {@link UpdateBanner} «Что нового» button (когда новая версия detected).
*/
export function WhatsNewButton() {
const { t } = useTranslation()
const [open, setOpen] = useState(false)
const entries = useChangelog()
// useState lastSeen — re-compute unread после modal close. localStorage
// write (внутри WhatsNewModal на open) не trigger'ит React re-render
// отдельно, поэтому tracking через useEffect on open close в modal.
// В button мы читаем initially — на close button перестроится через
// обычный rerender chain.
const lastSeen = useMemo(() => readLastSeenVersion(), [open])
const unreadCount = useMemo(
() => entries.filter((e) => isVersionNewer(e.version, lastSeen)).length,
[entries, lastSeen],
)
const label = t('whatsnew.button', { defaultValue: 'Что нового' })
return (
<>