import { useCallback, useState } from 'react'; import type { FC } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import type { Map, List } from 'immutable'; import ReactSwipeableViews from 'react-swipeable-views'; import elephantUIPlane from '@/images/elephant_ui_plane.svg'; import { CustomEmojiProvider } from '@/mastodon/components/emoji/context'; import { IconButton } from '@/mastodon/components/icon_button'; import { mascot, reduceMotion } from '@/mastodon/initial_state'; import { createAppSelector, useAppSelector } from '@/mastodon/store'; import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; import type { IAnnouncement } from './announcement'; import { Announcement } from './announcement'; const messages = defineMessages({ close: { id: 'lightbox.close', defaultMessage: 'Close' }, previous: { id: 'lightbox.previous', defaultMessage: 'Previous' }, next: { id: 'lightbox.next', defaultMessage: 'Next' }, }); const announcementSelector = createAppSelector( [(state) => state.announcements as Map>>], (announcements) => (announcements.get('items')?.toJS() as IAnnouncement[] | undefined) ?? [], ); export const Announcements: FC = () => { const intl = useIntl(); const announcements = useAppSelector(announcementSelector); const emojis = useAppSelector((state) => state.custom_emojis); const [index, setIndex] = useState(0); const handleChangeIndex = useCallback( (idx: number) => { setIndex(idx % announcements.length); }, [announcements.length], ); const handleNextIndex = useCallback(() => { setIndex((prevIndex) => (prevIndex + 1) % announcements.length); }, [announcements.length]); const handlePrevIndex = useCallback(() => { setIndex((prevIndex) => prevIndex === 0 ? announcements.length - 1 : prevIndex - 1, ); }, [announcements.length]); if (announcements.length === 0) { return null; } return (
{announcements .map((announcement, idx) => ( )) .reverse()} {announcements.length > 1 && (
{index + 1} / {announcements.length}
)}
); };