diff --git a/web/media/multimedia-modal.react.js b/web/media/multimedia-modal.react.js --- a/web/media/multimedia-modal.react.js +++ b/web/media/multimedia-modal.react.js @@ -9,6 +9,7 @@ import css from './media.css'; type BaseProps = { + +type: string, +uri: string, }; @@ -26,6 +27,17 @@ } render(): React.Node { + let mediaModalItem; + if (this.props.type === 'photo') { + mediaModalItem = <img src={this.props.uri} />; + } else { + mediaModalItem = ( + <video controls> + <source src={this.props.uri} /> + </video> + ); + } + return ( <div className={css.multimediaModalOverlay} @@ -34,7 +46,7 @@ tabIndex={0} onKeyDown={this.onKeyDown} > - <img src={this.props.uri} /> + {mediaModalItem} <XCircleIcon onClick={this.props.popModal} className={css.closeMultimediaModal} diff --git a/web/media/multimedia.react.js b/web/media/multimedia.react.js --- a/web/media/multimedia.react.js +++ b/web/media/multimedia.react.js @@ -140,8 +140,8 @@ }; onClick: () => void = () => { - const { pushModal, uri } = this.props; - pushModal(<MultimediaModal uri={uri} />); + const { pushModal, type, uri } = this.props; + pushModal(<MultimediaModal type={type} uri={uri} />); }; } diff --git a/web/modals/threads/gallery/thread-settings-media-gallery.react.js b/web/modals/threads/gallery/thread-settings-media-gallery.react.js --- a/web/modals/threads/gallery/thread-settings-media-gallery.react.js +++ b/web/modals/threads/gallery/thread-settings-media-gallery.react.js @@ -3,11 +3,14 @@ import * as React from 'react'; import { fetchThreadMedia } from 'lib/actions/thread-actions.js'; +import { useModalContext } from 'lib/components/modal-provider.react.js'; +import type { Media } from 'lib/types/media-types.js'; import type { ThreadInfo } from 'lib/types/thread-types.js'; import { useServerCall } from 'lib/utils/action-utils.js'; import css from './thread-settings-media-gallery.css'; import Tabs from '../../../components/tabs.react.js'; +import MultimediaModal from '../../../media/multimedia-modal.react.js'; import Modal from '../../modal.react.js'; type MediaGalleryTab = 'All' | 'Images' | 'Videos'; @@ -22,6 +25,7 @@ function ThreadSettingsMediaGalleryModal( props: ThreadSettingsMediaGalleryModalProps, ): React.Node { + const { pushModal } = useModalContext(); const { onClose, parentThreadInfo, limit, activeTab } = props; const { id: threadID } = parentThreadInfo; const modalName = 'Media'; @@ -42,6 +46,13 @@ fetchData(); }, [callFetchThreadMedia, threadID, limit]); + const onClick = React.useCallback( + (media: Media) => { + pushModal(<MultimediaModal type={media.type} uri={media.uri} />); + }, + [pushModal], + ); + const filteredMediaInfos = React.useMemo(() => { if (tab === 'Images') { return mediaInfos.filter(mediaInfo => mediaInfo.type === 'photo'); @@ -59,11 +70,15 @@ const mediaGalleryItems = React.useMemo( () => filteredMediaInfos.map((media, i) => ( - <div key={i} className={css.mediaContainer}> + <div + key={i} + onClick={() => onClick(media)} + className={css.mediaContainer} + > <img src={mediaCoverPhotos[i]} className={css.media} /> </div> )), - [filteredMediaInfos, mediaCoverPhotos], + [filteredMediaInfos, onClick, mediaCoverPhotos], ); const handleScroll = React.useCallback(