// Copyright 2020 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React, { useState } from 'react'; import { action } from '@storybook/addon-actions'; import lodash from 'lodash'; import type { Meta } from '@storybook/react'; import type { PropsType } from './Lightbox.js'; import { Lightbox } from './Lightbox.js'; import type { MediaItemType } from '../types/MediaItem.js'; import { AUDIO_MP3, IMAGE_JPEG, VIDEO_MP4, VIDEO_QUICKTIME, stringToMIMEType, type MIMEType, } from '../types/MIME.js'; import { fakeAttachment } from '../test-helpers/fakeAttachment.js'; const { noop } = lodash; const { i18n } = window.SignalContext; export default { title: 'Components/Lightbox', argTypes: {}, args: {}, } satisfies Meta; type OverridePropsMediaItemType = Partial & { caption?: string; objectURL?: string; contentType?: MIMEType; }; function createMediaItem( overrideProps: OverridePropsMediaItemType ): MediaItemType { return { attachment: fakeAttachment({ caption: overrideProps.caption || '', contentType: overrideProps.contentType ?? IMAGE_JPEG, fileName: overrideProps.objectURL, url: overrideProps.objectURL, }), index: 0, message: { conversationId: '1234', type: 'incoming', id: 'image-msg', receivedAt: 0, receivedAtMs: Date.now(), sentAt: Date.now(), }, ...overrideProps, }; } const createProps = (overrideProps: Partial = {}): PropsType => { // eslint-disable-next-line react-hooks/rules-of-hooks const [selectedIndex, setSelectedIndex] = useState(0); const media = overrideProps.media || []; return { closeLightbox: action('closeLightbox'), i18n, isViewOnce: Boolean(overrideProps.isViewOnce), media, saveAttachment: action('saveAttachment'), selectedIndex, playbackDisabled: false, 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.', }), index: 0, message: { conversationId: '1234', type: 'incoming', id: 'image-msg', receivedAt: 1, receivedAtMs: Date.now(), sentAt: Date.now(), }, }, { attachment: fakeAttachment({ contentType: VIDEO_MP4, fileName: 'pixabay-Soap-Bubble-7141.mp4', url: '/fixtures/pixabay-Soap-Bubble-7141.mp4', }), index: 1, message: { conversationId: '1234', type: 'incoming', id: 'video-msg', receivedAt: 2, receivedAtMs: Date.now(), sentAt: Date.now(), }, }, createMediaItem({ contentType: IMAGE_JPEG, index: 2, objectURL: '/fixtures/kitten-1-64-64.jpg', }), createMediaItem({ contentType: IMAGE_JPEG, index: 3, 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', }), index: 0, message: { conversationId: '1234', type: 'incoming', id: 'image-msg', receivedAt: 3, receivedAtMs: Date.now(), sentAt: Date.now(), }, }, ], }); return ; } export function SingleImage(): JSX.Element { return ( ); } export function ImageWithCaptionNormalImage(): JSX.Element { return ( ); } export function ImageWithCaptionAllWhiteImage(): JSX.Element { return ( ); } export function SingleVideo(): JSX.Element { return ( ); } export function SingleVideoWCaption(): JSX.Element { return ( ); } 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
); } export function ConversationHeader(): JSX.Element { return ( ({ acceptedMessageRequest: true, avatarUrl: '/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 ( ); } export function IncrementalVideo(): JSX.Element { const item = createMediaItem({ contentType: VIDEO_MP4, objectURL: '/fixtures/pixabay-Soap-Bubble-7141.mp4', }); return ( ); }