From 0d676a65b8ab65934587d0165919b88bedfa9a8a Mon Sep 17 00:00:00 2001 From: Daniel Gasienica Date: Sun, 15 Apr 2018 02:16:39 -0400 Subject: [PATCH] Open media gallery item in lightbox --- js/views/conversation_view.js | 15 ++++++++++-- .../media-gallery/AttachmentSection.tsx | 23 +++++++++++++++++-- .../media-gallery/DocumentListItem.tsx | 3 ++- .../media-gallery/MediaGallery.tsx | 5 +++- .../media-gallery/MediaGridItem.tsx | 7 +++++- 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 040a0d437d..faa14e68cb 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -592,14 +592,25 @@ ); const mediaWithObjectURLs = await loadMessages(media); - const props = { + const mediaGalleryProps = { media: mediaWithObjectURLs, documents: [], + onItemClick: ({message}) => { + const lightboxProps = { + imageURL: message.objectURL, + }; + this.lightboxView = new Whisper.ReactWrapperView({ + Component: Signal.Components.Lightbox, + props: lightboxProps, + onClose: () => Signal.Backbone.Views.Lightbox.hide(), + }); + Signal.Backbone.Views.Lightbox.show(this.lightboxView.el); + } }; const view = new Whisper.ReactWrapperView({ Component: MediaGallery, - props, + props: mediaGalleryProps, onClose: () => this.resetPanel(), }); diff --git a/ts/components/conversation/media-gallery/AttachmentSection.tsx b/ts/components/conversation/media-gallery/AttachmentSection.tsx index 10a09f2a8a..989bdba5c3 100644 --- a/ts/components/conversation/media-gallery/AttachmentSection.tsx +++ b/ts/components/conversation/media-gallery/AttachmentSection.tsx @@ -4,6 +4,7 @@ import React from 'react'; import { DocumentListItem } from './DocumentListItem'; +import { ItemClickEvent } from './events/ItemClickEvent'; import { MediaGridItem } from './MediaGridItem'; import { Message } from './propTypes/Message'; import { missingCaseError } from '../../../util/missingCaseError'; @@ -31,19 +32,27 @@ interface Props { header?: string; type: 'media' | 'documents'; messages: Array; + onItemClick?: (event: ItemClickEvent) => void; } export class AttachmentSection extends React.Component { - public renderItems() { + private renderItems() { const { i18n, messages, type } = this.props; return messages.map(message => { const { attachments } = message; const firstAttachment = attachments[0]; + const onClick = this.createClickHandler(message); switch (type) { case 'media': - return ; + return ( + + ); case 'documents': return ( { fileSize={firstAttachment.size} fileName={firstAttachment.fileName} timestamp={message.received_at} + onClick={onClick} /> ); default: @@ -60,6 +70,15 @@ export class AttachmentSection extends React.Component { }); } + private createClickHandler = (message: Message) => () => { + const { onItemClick } = this.props; + if (!onItemClick) { + return; + } + + onItemClick({ message }); + }; + public render() { const { header } = this.props; diff --git a/ts/components/conversation/media-gallery/DocumentListItem.tsx b/ts/components/conversation/media-gallery/DocumentListItem.tsx index 13ee59ecb2..15332ed24d 100644 --- a/ts/components/conversation/media-gallery/DocumentListItem.tsx +++ b/ts/components/conversation/media-gallery/DocumentListItem.tsx @@ -12,6 +12,7 @@ interface Props { fileName?: string; fileSize?: number; i18n: (key: string, values?: Array) => string; + onClick?: () => void; timestamp: number; } @@ -61,7 +62,7 @@ export class DocumentListItem extends React.Component { // } return ( -
+
; i18n: (key: string, values?: Array) => string; media: Array; + onItemClick?: (event: ItemClickEvent) => void; } interface State { @@ -110,7 +112,7 @@ export class MediaGallery extends React.Component { }; private renderSections() { - const { i18n, media, documents } = this.props; + const { i18n, media, documents, onItemClick } = this.props; const { selectedTab } = this.state; const messages = selectedTab === 'media' ? media : documents; @@ -137,6 +139,7 @@ export class MediaGallery extends React.Component { i18n={i18n} type={type} messages={section.messages} + onItemClick={onItemClick} /> ); }); diff --git a/ts/components/conversation/media-gallery/MediaGridItem.tsx b/ts/components/conversation/media-gallery/MediaGridItem.tsx index 912cec12e4..79cb0735fc 100644 --- a/ts/components/conversation/media-gallery/MediaGridItem.tsx +++ b/ts/components/conversation/media-gallery/MediaGridItem.tsx @@ -8,6 +8,7 @@ import { Message } from './propTypes/Message'; interface Props { message: Message; + onClick?: () => void; } const size = { @@ -47,6 +48,10 @@ export class MediaGridItem extends React.Component { } public render() { - return
{this.renderContent()}
; + return ( +
+ {this.renderContent()} +
+ ); } }