// Copyright 2021 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import * as React from 'react'; import { action } from '@storybook/addon-actions'; import { times } from 'lodash'; import { setupI18n } from '../../../util/setupI18n'; import enMessages from '../../../../_locales/en/messages.json'; import type { Props } from './ConversationDetails'; import { ConversationDetails } from './ConversationDetails'; import { ChooseGroupMembersModal } from './AddGroupMembersModal/ChooseGroupMembersModal'; import { ConfirmAdditionsModal } from './AddGroupMembersModal/ConfirmAdditionsModal'; import type { ConversationType } from '../../../state/ducks/conversations'; import { getDefaultConversation } from '../../../test-both/helpers/getDefaultConversation'; import { makeFakeLookupConversationWithoutUuid } from '../../../test-both/helpers/fakeLookupConversationWithoutUuid'; import { ThemeType } from '../../../types/Util'; import { DurationInSeconds } from '../../../util/durations'; import { NavTab } from '../../../state/ducks/nav'; import { CallMode } from '../../../types/Calling'; import { CallDirection, CallType, DirectCallStatus, } from '../../../types/CallDisposition'; const i18n = setupI18n('en', enMessages); export default { title: 'Components/Conversation/ConversationDetails/ConversationDetails', }; const conversation: ConversationType = getDefaultConversation({ id: '', lastUpdated: 0, title: 'Some Conversation', groupDescription: 'Hello World!', type: 'group', sharedGroupNames: [], conversationColor: 'ultramarine' as const, }); const allCandidateContacts = times(10, () => getDefaultConversation()); const createProps = ( hasGroupLink = false, expireTimer?: DurationInSeconds ): Props => ({ acceptConversation: action('acceptConversation'), addMembersToGroup: async () => { action('addMembersToGroup'); }, areWeASubscriber: false, blockConversation: action('blockConversation'), canEditGroupInfo: false, canAddNewMembers: false, conversation: expireTimer ? { ...conversation, expireTimer, } : conversation, hasActiveCall: false, hasGroupLink, getPreferredBadge: () => undefined, getProfilesForConversation: action('getProfilesForConversation'), groupsInCommon: [], i18n, isAdmin: false, isGroup: true, leaveGroup: action('leaveGroup'), loadRecentMediaItems: action('loadRecentMediaItems'), memberships: times(32, i => ({ isAdmin: i === 1, member: getDefaultConversation({ isMe: i === 2, }), })), maxGroupSize: 1001, maxRecommendedGroupSize: 151, pendingApprovalMemberships: times(8, () => ({ member: getDefaultConversation(), })), pendingMemberships: times(5, () => ({ metadata: {}, member: getDefaultConversation(), })), selectedNavTab: NavTab.Chats, setDisappearingMessages: action('setDisappearingMessages'), showContactModal: action('showContactModal'), pushPanelForConversation: action('pushPanelForConversation'), showConversation: action('showConversation'), showLightboxWithMedia: action('showLightboxWithMedia'), updateGroupAttributes: async () => { action('updateGroupAttributes')(); }, deleteAvatarFromDisk: action('deleteAvatarFromDisk'), replaceAvatar: action('replaceAvatar'), saveAvatarToDisk: action('saveAvatarToDisk'), setMuteExpiration: action('setMuteExpiration'), userAvatarData: [], toggleSafetyNumberModal: action('toggleSafetyNumberModal'), toggleAddUserToAnotherGroupModal: action('toggleAddUserToAnotherGroup'), onOutgoingAudioCallInConversation: action( 'onOutgoingAudioCallInConversation' ), onOutgoingVideoCallInConversation: action( 'onOutgoingVideoCallInConversation' ), searchInConversation: action('searchInConversation'), theme: ThemeType.light, renderChooseGroupMembersModal: props => { return ( undefined} theme={ThemeType.light} i18n={i18n} lookupConversationWithoutUuid={makeFakeLookupConversationWithoutUuid()} showUserNotFoundModal={action('showUserNotFoundModal')} isUsernamesEnabled /> ); }, renderConfirmAdditionsModal: props => { return ( ); }, }); export function Basic(): JSX.Element { const props = createProps(); return ; } export function AsAdmin(): JSX.Element { const props = createProps(); return ; } AsAdmin.story = { name: 'as Admin', }; export function AsLastAdmin(): JSX.Element { const props = createProps(); return ( ({ isAdmin: i === 2, member: getDefaultConversation({ isMe: i === 2, }), }))} /> ); } AsLastAdmin.story = { name: 'as last admin', }; export function AsOnlyAdmin(): JSX.Element { const props = createProps(); return ( ); } AsOnlyAdmin.story = { name: 'as only admin', }; export function GroupEditable(): JSX.Element { const props = createProps(); return ; } export function GroupEditableWithCustomDisappearingTimeout(): JSX.Element { const props = createProps(false, DurationInSeconds.fromDays(3)); return ; } GroupEditableWithCustomDisappearingTimeout.story = { name: 'Group Editable with custom disappearing timeout', }; export function GroupLinksOn(): JSX.Element { const props = createProps(true); return ; } export const _11 = (): JSX.Element => ( ); _11.story = { name: '1:1', }; function mins(n: number) { return DurationInSeconds.toMillis(DurationInSeconds.fromMinutes(n)); } export function WithCallHistoryGroup(): JSX.Element { const props = createProps(); return ( ); }