import { List as ImmutableList } from 'immutable'; import React, { useState, useEffect } from 'react'; import { FormattedMessage } from 'react-intl'; import { useDispatch } from 'react-redux'; import { openModal } from 'soapbox/actions/modals'; import { expandGroupMediaTimeline } from 'soapbox/actions/timelines'; import { Spinner, Text, Widget } from 'soapbox/components/ui'; import { useAppSelector } from 'soapbox/hooks'; import { getGroupGallery } from 'soapbox/selectors'; import MediaItem from '../../account-gallery/components/media-item'; import type { Attachment, Group } from 'soapbox/types/entities'; interface IGroupMediaPanel { group?: Group, } const GroupMediaPanel: React.FC = ({ group }) => { const dispatch = useDispatch(); const [loading, setLoading] = useState(true); const attachments: ImmutableList = useAppSelector((state) => group ? getGroupGallery(state, group?.id) : ImmutableList()); const handleOpenMedia = (attachment: Attachment): void => { if (attachment.type === 'video') { dispatch(openModal('VIDEO', { media: attachment, status: attachment.status })); } else { const media = attachment.getIn(['status', 'media_attachments']) as ImmutableList; const index = media.findIndex(x => x.id === attachment.id); dispatch(openModal('MEDIA', { media, index, status: attachment.status, account: attachment.account })); } }; useEffect(() => { setLoading(true); if (group) { dispatch(expandGroupMediaTimeline(group.id)) // @ts-ignore .then(() => setLoading(false)) .catch(() => {}); } }, [group?.id]); const renderAttachments = () => { const nineAttachments = attachments.slice(0, 9); if (!nineAttachments.isEmpty()) { return (
{nineAttachments.map((attachment, _index) => ( ))}
); } else { return ( ); } }; return ( }> {group && (
{loading ? ( ) : ( renderAttachments() )}
)}
); }; export default GroupMediaPanel;