// Copyright 2020 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import type { ComponentProps } from 'react'; import React, { useContext } from 'react'; import { action } from '@storybook/addon-actions'; import type { Meta } from '@storybook/react'; import { getDefaultConversation } from '../../test-both/helpers/getDefaultConversation'; import { getRandomColor } from '../../test-both/helpers/getRandomColor'; import { setupI18n } from '../../util/setupI18n'; import { DurationInSeconds } from '../../util/durations'; import enMessages from '../../../_locales/en/messages.json'; import { StorybookThemeContext } from '../../../.storybook/StorybookThemeContext'; import type { PropsType } from './ConversationHeader'; import { ConversationHeader, OutgoingCallButtonStyle, } from './ConversationHeader'; import { gifUrl } from '../../storybook/Fixtures'; export default { title: 'Components/Conversation/ConversationHeader', } satisfies Meta; const i18n = setupI18n('en', enMessages); type ItemsType = Array<{ title: string; props: Omit, 'theme'>; }>; const commonConversation = getDefaultConversation(); const commonProps = { ...commonConversation, conversationId: commonConversation.id, conversationType: commonConversation.type, conversationName: commonConversation, addedByName: null, isBlocked: commonConversation.isBlocked ?? false, isReported: commonConversation.isReported ?? false, cannotLeaveBecauseYouAreLastAdmin: false, showBackButton: false, outgoingCallButtonStyle: OutgoingCallButtonStyle.Both, isSelectMode: false, i18n, localDeleteWarningShown: true, isDeleteSyncSendEnabled: true, setLocalDeleteWarningShown: action('setLocalDeleteWarningShown'), onConversationAccept: action('onConversationAccept'), onConversationArchive: action('onConversationArchive'), onConversationBlock: action('onConversationBlock'), onConversationBlockAndReportSpam: action('onConversationBlockAndReportSpam'), onConversationDelete: action('onConversationDelete'), onConversationDeleteMessages: action('onConversationDeleteMessages'), onConversationDisappearingMessagesChange: action( 'onConversationDisappearingMessagesChange' ), onConversationLeaveGroup: action('onConversationLeaveGroup'), onConversationMarkUnread: action('onConversationMarkUnread'), onConversationMuteExpirationChange: action( 'onConversationMuteExpirationChange' ), onConversationPin: action('onConversationPin'), onConversationReportSpam: action('onConversationReportSpam'), onConversationUnarchive: action('onConversationUnarchive'), onConversationUnpin: action('onConversationUnpin'), onOutgoingAudioCall: action('onOutgoingAudioCall'), onOutgoingVideoCall: action('onOutgoingVideoCall'), onSearchInConversation: action('onSearchInConversation'), onSelectModeEnter: action('onSelectModeEnter'), onShowMembers: action('onShowMembers'), onViewConversationDetails: action('onViewConversationDetails'), onViewRecentMedia: action('onViewRecentMedia'), onViewUserStories: action('onViewUserStories'), }; export function PrivateConvo(): JSX.Element { const items: ItemsType = [ { title: 'With name and profile, verified', props: { ...commonProps, conversation: getDefaultConversation({ color: getRandomColor(), isVerified: true, avatarUrl: gifUrl, title: 'Someone 🔥 Somewhere', name: 'Someone 🔥 Somewhere', phoneNumber: '(202) 555-0001', type: 'direct', id: '1', profileName: '🔥Flames🔥', acceptedMessageRequest: true, }), }, }, { title: 'With name, not verified, no avatar', props: { ...commonProps, conversation: getDefaultConversation({ color: getRandomColor(), isVerified: false, title: 'Someone 🔥 Somewhere', name: 'Someone 🔥 Somewhere', phoneNumber: '(202) 555-0002', type: 'direct', id: '2', acceptedMessageRequest: true, }), }, }, { title: 'With name, not verified, descenders', props: { ...commonProps, conversation: getDefaultConversation({ color: getRandomColor(), isVerified: false, title: 'Joyrey 🔥 Leppey', name: 'Joyrey 🔥 Leppey', phoneNumber: '(202) 555-0002', type: 'direct', id: '3', acceptedMessageRequest: true, }), }, }, { title: 'Profile, no name', props: { ...commonProps, conversation: getDefaultConversation({ color: getRandomColor(), isVerified: false, phoneNumber: '(202) 555-0003', type: 'direct', id: '4', title: '🔥Flames🔥', profileName: '🔥Flames🔥', acceptedMessageRequest: true, }), }, }, { title: 'No name, no profile, no color', props: { ...commonProps, conversation: getDefaultConversation({ title: '(202) 555-0011', phoneNumber: '(202) 555-0011', type: 'direct', id: '5', acceptedMessageRequest: true, }), }, }, { title: 'With back button', props: { ...commonProps, showBackButton: true, conversation: getDefaultConversation({ color: getRandomColor(), phoneNumber: '(202) 555-0004', title: '(202) 555-0004', type: 'direct', id: '6', acceptedMessageRequest: true, }), }, }, { title: 'Disappearing messages set', props: { ...commonProps, conversation: getDefaultConversation({ color: getRandomColor(), title: '(202) 555-0005', phoneNumber: '(202) 555-0005', type: 'direct', id: '7', expireTimer: DurationInSeconds.fromSeconds(10), acceptedMessageRequest: true, }), }, }, { title: 'Disappearing messages + verified', props: { ...commonProps, conversation: getDefaultConversation({ color: getRandomColor(), title: '(202) 555-0005', phoneNumber: '(202) 555-0005', type: 'direct', id: '8', expireTimer: DurationInSeconds.fromSeconds(300), acceptedMessageRequest: true, isVerified: true, canChangeTimer: true, }), }, }, { title: 'Muting Conversation', props: { ...commonProps, conversation: getDefaultConversation({ color: getRandomColor(), title: '(202) 555-0006', phoneNumber: '(202) 555-0006', type: 'direct', id: '9', acceptedMessageRequest: true, muteExpiresAt: new Date('3000-10-18T11:11:11Z').valueOf(), }), }, }, { title: 'SMS-only conversation', props: { ...commonProps, isSMSOnly: true, conversation: getDefaultConversation({ color: getRandomColor(), title: '(202) 555-0006', phoneNumber: '(202) 555-0006', type: 'direct', id: '10', acceptedMessageRequest: true, }), }, }, ]; const theme = useContext(StorybookThemeContext); return ( <> {items.map(({ title: subtitle, props }, i) => { return (
{subtitle ?

{subtitle}

: null}
); })} ); } export function Group(): JSX.Element { const items: ItemsType = [ { title: 'Basic', props: { ...commonProps, outgoingCallButtonStyle: OutgoingCallButtonStyle.JustVideo, conversation: getDefaultConversation({ color: getRandomColor(), title: 'Typescript support group', name: 'Typescript support group', phoneNumber: '', id: '11', type: 'group', expireTimer: DurationInSeconds.fromSeconds(10), acceptedMessageRequest: true, }), }, }, { title: 'In a group you left - no disappearing messages', props: { ...commonProps, outgoingCallButtonStyle: OutgoingCallButtonStyle.JustVideo, conversation: getDefaultConversation({ color: getRandomColor(), title: 'Typescript support group', name: 'Typescript support group', phoneNumber: '', id: '12', type: 'group', left: true, expireTimer: DurationInSeconds.fromSeconds(10), acceptedMessageRequest: true, }), }, }, { title: 'In a group with an active group call', props: { ...commonProps, outgoingCallButtonStyle: OutgoingCallButtonStyle.Join, conversation: getDefaultConversation({ color: getRandomColor(), title: 'Typescript support group', name: 'Typescript support group', phoneNumber: '', id: '13', type: 'group', expireTimer: DurationInSeconds.fromSeconds(10), acceptedMessageRequest: true, }), }, }, { title: 'In a forever muted group', props: { ...commonProps, outgoingCallButtonStyle: OutgoingCallButtonStyle.JustVideo, conversation: getDefaultConversation({ color: getRandomColor(), title: 'Way too many messages', name: 'Way too many messages', phoneNumber: '', id: '14', type: 'group', expireTimer: DurationInSeconds.fromSeconds(10), acceptedMessageRequest: true, muteExpiresAt: Infinity, }), }, }, ]; const theme = useContext(StorybookThemeContext); return ( <> {items.map(({ title: subtitle, props }, i) => { return (
{subtitle ?

{subtitle}

: null}
); })} ); } export function NoteToSelf(): JSX.Element { const items: ItemsType = [ { title: 'In chat with yourself', props: { ...commonProps, outgoingCallButtonStyle: OutgoingCallButtonStyle.None, conversation: getDefaultConversation({ color: getRandomColor(), title: '(202) 555-0007', phoneNumber: '(202) 555-0007', id: '15', type: 'direct', isMe: true, acceptedMessageRequest: true, }), }, }, ]; const theme = useContext(StorybookThemeContext); return ( <> {items.map(({ title: subtitle, props }, i) => { return (
{subtitle ?

{subtitle}

: null}
); })} ); } export function Unaccepted(): JSX.Element { const items: ItemsType = [ { title: '1:1 conversation', props: { ...commonProps, outgoingCallButtonStyle: OutgoingCallButtonStyle.None, conversation: getDefaultConversation({ color: getRandomColor(), title: '(202) 555-0007', phoneNumber: '(202) 555-0007', id: '16', type: 'direct', isMe: false, acceptedMessageRequest: false, }), }, }, ]; const theme = useContext(StorybookThemeContext); return ( <> {items.map(({ title: subtitle, props }, i) => { return (
{subtitle ?

{subtitle}

: null}
); })} ); } export function NeedsDeleteConfirmation(): JSX.Element { const [localDeleteWarningShown, setLocalDeleteWarningShown] = React.useState(false); const props = { ...commonProps, conversation: getDefaultConversation(), localDeleteWarningShown, setLocalDeleteWarningShown: () => setLocalDeleteWarningShown(true), }; const theme = useContext(StorybookThemeContext); return ; } export function NeedsDeleteConfirmationButNotEnabled(): JSX.Element { const [localDeleteWarningShown, setLocalDeleteWarningShown] = React.useState(false); const props = { ...commonProps, conversation: getDefaultConversation(), localDeleteWarningShown, isDeleteSyncSendEnabled: false, setLocalDeleteWarningShown: () => setLocalDeleteWarningShown(true), }; const theme = useContext(StorybookThemeContext); return ; }