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 ( <> setOpen(false)} /> ) }