// Copyright 2020 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React, { useState } from 'react'; import { action } from '@storybook/addon-actions'; import { number } from '@storybook/addon-knobs'; import { noop } from 'lodash'; import enMessages from '../../_locales/en/messages.json'; import type { PropsType } from './Lightbox'; import { Lightbox } from './Lightbox'; import type { MediaItemType } from '../types/MediaItem'; import { setupI18n } from '../util/setupI18n'; import { AUDIO_MP3, IMAGE_JPEG, VIDEO_MP4, VIDEO_QUICKTIME, stringToMIMEType, } from '../types/MIME'; import { fakeAttachment } from '../test-both/helpers/fakeAttachment'; const i18n = setupI18n('en', enMessages); export default { title: 'Components/Lightbox', }; type OverridePropsMediaItemType = Partial & { caption?: string }; function createMediaItem( overrideProps: OverridePropsMediaItemType ): MediaItemType { return { attachment: fakeAttachment({ caption: overrideProps.caption || '', contentType: IMAGE_JPEG, fileName: overrideProps.objectURL, url: overrideProps.objectURL, }), contentType: IMAGE_JPEG, index: 0, message: { attachments: [], conversationId: '1234', id: 'image-msg', received_at: 0, received_at_ms: Date.now(), sent_at: Date.now(), }, objectURL: '', ...overrideProps, }; } const createProps = (overrideProps: Partial = {}): PropsType => { // eslint-disable-next-line react-hooks/rules-of-hooks const [selectedIndex, setSelectedIndex] = useState( number('selectedIndex', overrideProps.selectedIndex || 0) ); const media = overrideProps.media || []; return { closeLightbox: action('closeLightbox'), i18n, isViewOnce: Boolean(overrideProps.isViewOnce), media, saveAttachment: action('saveAttachment'), selectedIndex, toggleForwardMessagesModal: action('toggleForwardMessagesModal'), onMediaPlaybackStart: noop, onPrevAttachment: () => { setSelectedIndex(Math.max(0, selectedIndex - 1)); }, onNextAttachment: () => { setSelectedIndex(Math.min(media.length - 1, selectedIndex + 1)); }, onSelectAttachment: setSelectedIndex, }; }; export function Multimedia(): JSX.Element { const props = createProps({ media: [ { attachment: fakeAttachment({ contentType: IMAGE_JPEG, fileName: 'tina-rolf-269345-unsplash.jpg', url: '/fixtures/tina-rolf-269345-unsplash.jpg', caption: 'Still from The Lighthouse, starring Robert Pattinson and Willem Defoe.', }), contentType: IMAGE_JPEG, index: 0, message: { attachments: [], conversationId: '1234', id: 'image-msg', received_at: 1, received_at_ms: Date.now(), sent_at: Date.now(), }, objectURL: '/fixtures/tina-rolf-269345-unsplash.jpg', }, { attachment: fakeAttachment({ contentType: VIDEO_MP4, fileName: 'pixabay-Soap-Bubble-7141.mp4', url: '/fixtures/pixabay-Soap-Bubble-7141.mp4', }), contentType: VIDEO_MP4, index: 1, message: { attachments: [], conversationId: '1234', id: 'video-msg', received_at: 2, received_at_ms: Date.now(), sent_at: Date.now(), }, objectURL: '/fixtures/pixabay-Soap-Bubble-7141.mp4', }, createMediaItem({ contentType: IMAGE_JPEG, index: 2, thumbnailObjectUrl: '/fixtures/kitten-1-64-64.jpg', objectURL: '/fixtures/kitten-1-64-64.jpg', }), createMediaItem({ contentType: IMAGE_JPEG, index: 3, thumbnailObjectUrl: '/fixtures/kitten-2-64-64.jpg', objectURL: '/fixtures/kitten-2-64-64.jpg', }), ], }); return ; } export function MissingMedia(): JSX.Element { const props = createProps({ media: [ { attachment: fakeAttachment({ contentType: IMAGE_JPEG, fileName: 'tina-rolf-269345-unsplash.jpg', url: '/fixtures/tina-rolf-269345-unsplash.jpg', }), contentType: IMAGE_JPEG, index: 0, message: { attachments: [], conversationId: '1234', id: 'image-msg', received_at: 3, received_at_ms: Date.now(), sent_at: Date.now(), }, objectURL: undefined, }, ], }); return ; } export function SingleImage(): JSX.Element { return ( ); } export function ImageWithCaptionNormalImage(): JSX.Element { return ( ); } ImageWithCaptionNormalImage.story = { name: 'Image with Caption (normal image)', }; export function ImageWithCaptionAllWhiteImage(): JSX.Element { return ( ); } ImageWithCaptionAllWhiteImage.story = { name: 'Image with Caption (all-white image)', }; export function SingleVideo(): JSX.Element { return ( ); } export function SingleVideoWCaption(): JSX.Element { return ( ); } SingleVideoWCaption.story = { name: 'Single Video w/caption', }; export function UnsupportedImageType(): JSX.Element { return ( ); } export function UnsupportedVideoType(): JSX.Element { return ( ); } export function UnsupportedContent(): JSX.Element { return ( ); } export function CustomChildren(): JSX.Element { return (
I am middle child
); } CustomChildren.story = { name: 'Custom children', }; export function ConversationHeader(): JSX.Element { return ( ({ acceptedMessageRequest: true, avatarPath: '/fixtures/kitten-1-64-64.jpg', badges: [], id: '1234', isMe: false, name: 'Test', profileName: 'Test', sharedGroupNames: [], title: 'Test', type: 'direct', })} media={[ createMediaItem({ contentType: VIDEO_MP4, objectURL: '/fixtures/pixabay-Soap-Bubble-7141.mp4', }), ]} /> ); } export function ViewOnceVideo(): JSX.Element { return ( ); }