// Copyright 2018 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React, { Fragment } from 'react'; import type { ItemClickEvent } from './types/ItemClickEvent.std.js'; import type { GenericMediaItemType, MediaItemType, LinkPreviewMediaItemType, } from '../../../types/MediaItem.std.js'; import { missingCaseError } from '../../../util/missingCaseError.std.js'; import { strictAssert } from '../../../util/assert.std.js'; import { tw } from '../../../axo/tw.dom.js'; export type Props = { header?: string; onItemClick: (event: ItemClickEvent) => unknown; mediaItems: ReadonlyArray; renderMediaItem: (props: { onItemClick: (event: ItemClickEvent) => unknown; mediaItem: GenericMediaItemType; }) => JSX.Element; }; function getMediaItemKey(mediaItem: GenericMediaItemType): string { const { message } = mediaItem; if (mediaItem.type === 'media' || mediaItem.type === 'document') { return `attachment-${message.id}-${mediaItem.index}`; } return `attachment-${message.id}-preview`; } type VerifiedMediaItems = | { type: 'media' | 'audio' | 'document'; entries: ReadonlyArray; } | { type: 'link'; entries: ReadonlyArray; }; function verifyMediaItems( mediaItems: ReadonlyArray ): VerifiedMediaItems { const first = mediaItems.at(0); strictAssert(first != null, 'AttachmentSection cannot be empty'); const { type } = first; const result = { type, entries: mediaItems.filter(item => item.type === type), }; strictAssert( result.entries.length === mediaItems.length, 'Some AttachmentSection items have conflicting types' ); return result as VerifiedMediaItems; } export function AttachmentSection({ header, mediaItems, onItemClick, renderMediaItem, }: Props): JSX.Element { const verified = verifyMediaItems(mediaItems); switch (verified.type) { case 'media': return (

{header}

{verified.entries.map(mediaItem => { return ( {renderMediaItem({ mediaItem, onItemClick, })} ); })}
); case 'document': case 'audio': case 'link': return (

{header}

{verified.entries.map(mediaItem => { return ( {renderMediaItem({ mediaItem, onItemClick, })} ); })}
); default: throw missingCaseError(verified); } }