import React from 'react'; import classNames from 'classnames'; import moment from 'moment'; import { AttachmentSection } from './AttachmentSection'; import { EmptyState } from './EmptyState'; import { groupMediaItemsByDate } from './groupMediaItemsByDate'; import { ItemClickEvent } from './types/ItemClickEvent'; import { missingCaseError } from '../../../util/missingCaseError'; import { LocalizerType } from '../../../types/Util'; import { MediaItemType } from '../../LightboxGallery'; interface Props { documents: Array; i18n: LocalizerType; media: Array; onItemClick?: (event: ItemClickEvent) => void; } interface State { selectedTab: 'media' | 'documents'; } const MONTH_FORMAT = 'MMMM YYYY'; interface TabSelectEvent { type: 'media' | 'documents'; } const Tab = ({ isSelected, label, onSelect, type, }: { isSelected: boolean; label: string; onSelect?: (event: TabSelectEvent) => void; type: 'media' | 'documents'; }) => { const handleClick = onSelect ? () => { onSelect({ type }); } : undefined; return (
{label}
); }; export class MediaGallery extends React.Component { public readonly focusRef: React.RefObject = React.createRef(); public state: State = { selectedTab: 'media', }; public componentDidMount() { // When this component is created, it's initially not part of the DOM, and then it's // added off-screen and animated in. This ensures that the focus takes. setTimeout(() => { if (this.focusRef.current) { this.focusRef.current.focus(); } }); } public render() { const { selectedTab } = this.state; return (
{this.renderSections()}
); } private readonly handleTabSelect = (event: TabSelectEvent): void => { this.setState({ selectedTab: event.type }); }; private renderSections() { const { i18n, media, documents, onItemClick } = this.props; const { selectedTab } = this.state; const mediaItems = selectedTab === 'media' ? media : documents; const type = selectedTab; if (!mediaItems || mediaItems.length === 0) { const label = (() => { switch (type) { case 'media': return i18n('mediaEmptyState'); case 'documents': return i18n('documentsEmptyState'); default: throw missingCaseError(type); } })(); return ; } const now = Date.now(); const sections = groupMediaItemsByDate(now, mediaItems).map(section => { const first = section.mediaItems[0]; const { message } = first; const date = moment(message.received_at); const header = section.type === 'yearMonth' ? date.format(MONTH_FORMAT) : i18n(section.type); return ( ); }); return
{sections}
; } }