// Copyright 2020-2022 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import * as React from 'react'; import { action } from '@storybook/addon-actions'; import { select } from '@storybook/addon-knobs'; import type { PropsType } from './LeftPane'; import { LeftPane, LeftPaneMode } from './LeftPane'; import { CaptchaDialog } from './CaptchaDialog'; import { CrashReportDialog } from './CrashReportDialog'; import type { ConversationType } from '../state/ducks/conversations'; import { MessageSearchResult } from './conversationList/MessageSearchResult'; import { setupI18n } from '../util/setupI18n'; import enMessages from '../../_locales/en/messages.json'; import { ThemeType } from '../types/Util'; import { getDefaultConversation } from '../test-both/helpers/getDefaultConversation'; import { StorybookThemeContext } from '../../.storybook/StorybookThemeContext'; import { makeFakeLookupConversationWithoutUuid, useUuidFetchState, } from '../test-both/helpers/fakeLookupConversationWithoutUuid'; const i18n = setupI18n('en', enMessages); export default { title: 'Components/LeftPane', }; const defaultConversations: Array = [ getDefaultConversation({ id: 'fred-convo', title: 'Fred Willard', }), getDefaultConversation({ id: 'marc-convo', isSelected: true, title: 'Marc Barraca', }), ]; const defaultSearchProps = { searchConversation: undefined, searchDisabled: false, searchTerm: 'hello', startSearchCounter: 0, }; const defaultGroups: Array = [ getDefaultConversation({ id: 'biking-group', title: 'Mtn Biking Arizona 🚵☀️⛰', type: 'group', sharedGroupNames: [], }), getDefaultConversation({ id: 'dance-group', title: 'Are we dancers? 💃', type: 'group', sharedGroupNames: [], }), ]; const defaultArchivedConversations: Array = [ getDefaultConversation({ id: 'michelle-archive-convo', title: 'Michelle Mercure', isArchived: true, }), ]; const pinnedConversations: Array = [ getDefaultConversation({ id: 'philly-convo', isPinned: true, title: 'Philip Glass', }), getDefaultConversation({ id: 'robbo-convo', isPinned: true, title: 'Robert Moog', }), ]; const defaultModeSpecificProps = { ...defaultSearchProps, mode: LeftPaneMode.Inbox as const, pinnedConversations, conversations: defaultConversations, archivedConversations: defaultArchivedConversations, isAboutToSearchInAConversation: false, }; const emptySearchResultsGroup = { isLoading: false, results: [] }; const useProps = (overrideProps: Partial = {}): PropsType => { let modeSpecificProps = overrideProps.modeSpecificProps ?? defaultModeSpecificProps; const [uuidFetchState, setIsFetchingUUID] = useUuidFetchState( 'uuidFetchState' in modeSpecificProps ? modeSpecificProps.uuidFetchState : {} ); if ('uuidFetchState' in modeSpecificProps) { modeSpecificProps = { ...modeSpecificProps, uuidFetchState, }; } return { clearConversationSearch: action('clearConversationSearch'), clearGroupCreationError: action('clearGroupCreationError'), clearSearch: action('clearSearch'), closeMaximumGroupSizeModal: action('closeMaximumGroupSizeModal'), closeRecommendedGroupSizeModal: action('closeRecommendedGroupSizeModal'), composeDeleteAvatarFromDisk: action('composeDeleteAvatarFromDisk'), composeReplaceAvatar: action('composeReplaceAvatar'), composeSaveAvatarToDisk: action('composeSaveAvatarToDisk'), createGroup: action('createGroup'), getPreferredBadge: () => undefined, i18n, preferredWidthFromStorage: 320, regionCode: 'US', challengeStatus: select( 'challengeStatus', ['idle', 'required', 'pending'], 'idle' ), crashReportCount: select('challengeReportCount', [0, 1], 0), setChallengeStatus: action('setChallengeStatus'), lookupConversationWithoutUuid: makeFakeLookupConversationWithoutUuid(), showUserNotFoundModal: action('showUserNotFoundModal'), setIsFetchingUUID, showConversation: action('showConversation'), renderExpiredBuildDialog: () =>
, renderMainHeader: () =>
, renderMessageSearchResult: (id: string) => ( undefined} i18n={i18n} id={id} showConversation={action('showConversation')} sentAt={1587358800000} snippet="Lorem <>ipsum<> wow" theme={ThemeType.light} to={defaultConversations[1]} /> ), renderNetworkStatus: () =>
, renderRelinkDialog: () =>
, renderUpdateDialog: () =>
, renderCaptchaDialog: () => ( ), renderCrashReportDialog: () => ( ), selectedConversationId: undefined, selectedMessageId: undefined, savePreferredLeftPaneWidth: action('savePreferredLeftPaneWidth'), searchInConversation: action('searchInConversation'), setComposeSearchTerm: action('setComposeSearchTerm'), setComposeGroupAvatar: action('setComposeGroupAvatar'), setComposeGroupName: action('setComposeGroupName'), setComposeGroupExpireTimer: action('setComposeGroupExpireTimer'), showArchivedConversations: action('showArchivedConversations'), showInbox: action('showInbox'), startComposing: action('startComposing'), showChooseGroupMembers: action('showChooseGroupMembers'), startSearch: action('startSearch'), startSettingGroupMetadata: action('startSettingGroupMetadata'), theme: React.useContext(StorybookThemeContext), toggleComposeEditingAvatar: action('toggleComposeEditingAvatar'), toggleConversationInChooseMembers: action( 'toggleConversationInChooseMembers' ), updateSearchTerm: action('updateSearchTerm'), ...overrideProps, modeSpecificProps, }; }; export const InboxNoConversations = (): JSX.Element => ( ); InboxNoConversations.story = { name: 'Inbox: no conversations', }; export const InboxOnlyPinnedConversations = (): JSX.Element => ( ); InboxOnlyPinnedConversations.story = { name: 'Inbox: only pinned conversations', }; export const InboxOnlyNonPinnedConversations = (): JSX.Element => ( ); InboxOnlyNonPinnedConversations.story = { name: 'Inbox: only non-pinned conversations', }; export const InboxOnlyArchivedConversations = (): JSX.Element => ( ); InboxOnlyArchivedConversations.story = { name: 'Inbox: only archived conversations', }; export const InboxPinnedAndArchivedConversations = (): JSX.Element => ( ); InboxPinnedAndArchivedConversations.story = { name: 'Inbox: pinned and archived conversations', }; export const InboxNonPinnedAndArchivedConversations = (): JSX.Element => ( ); InboxNonPinnedAndArchivedConversations.story = { name: 'Inbox: non-pinned and archived conversations', }; export const InboxPinnedAndNonPinnedConversations = (): JSX.Element => ( ); InboxPinnedAndNonPinnedConversations.story = { name: 'Inbox: pinned and non-pinned conversations', }; export const InboxPinnedNonPinnedAndArchivedConversations = (): JSX.Element => ( ); InboxPinnedNonPinnedAndArchivedConversations.story = { name: 'Inbox: pinned, non-pinned, and archived conversations', }; export const SearchNoResultsWhenSearchingEverywhere = (): JSX.Element => ( ); SearchNoResultsWhenSearchingEverywhere.story = { name: 'Search: no results when searching everywhere', }; export const SearchNoResultsWhenSearchingEverywhereSms = (): JSX.Element => ( ); SearchNoResultsWhenSearchingEverywhereSms.story = { name: 'Search: no results when searching everywhere (SMS)', }; export const SearchNoResultsWhenSearchingInAConversation = (): JSX.Element => ( ); SearchNoResultsWhenSearchingInAConversation.story = { name: 'Search: no results when searching in a conversation', }; export const SearchAllResultsLoading = (): JSX.Element => ( ); SearchAllResultsLoading.story = { name: 'Search: all results loading', }; export const SearchSomeResultsLoading = (): JSX.Element => ( ); SearchSomeResultsLoading.story = { name: 'Search: some results loading', }; export const SearchHasConversationsAndContactsButNotMessages = (): JSX.Element => ( ); SearchHasConversationsAndContactsButNotMessages.story = { name: 'Search: has conversations and contacts, but not messages', }; export const SearchAllResults = (): JSX.Element => ( ); SearchAllResults.story = { name: 'Search: all results', }; export const ArchiveNoArchivedConversations = (): JSX.Element => ( ); ArchiveNoArchivedConversations.story = { name: 'Archive: no archived conversations', }; export const ArchiveArchivedConversations = (): JSX.Element => ( ); ArchiveArchivedConversations.story = { name: 'Archive: archived conversations', }; export const ArchiveSearchingAConversation = (): JSX.Element => ( ); ArchiveSearchingAConversation.story = { name: 'Archive: searching a conversation', }; export const ComposeNoResults = (): JSX.Element => ( ); ComposeNoResults.story = { name: 'Compose: no results', }; export const ComposeSomeContactsNoSearchTerm = (): JSX.Element => ( ); ComposeSomeContactsNoSearchTerm.story = { name: 'Compose: some contacts, no search term', }; export const ComposeSomeContactsWithASearchTerm = (): JSX.Element => ( ); ComposeSomeContactsWithASearchTerm.story = { name: 'Compose: some contacts, with a search term', }; export const ComposeSomeGroupsNoSearchTerm = (): JSX.Element => ( ); ComposeSomeGroupsNoSearchTerm.story = { name: 'Compose: some groups, no search term', }; export const ComposeSomeGroupsWithSearchTerm = (): JSX.Element => ( ); ComposeSomeGroupsWithSearchTerm.story = { name: 'Compose: some groups, with search term', }; export const ComposeSearchIsValidUsername = (): JSX.Element => ( ); ComposeSearchIsValidUsername.story = { name: 'Compose: search is valid username', }; export const ComposeSearchIsValidUsernameFetchingUsername = (): JSX.Element => ( ); ComposeSearchIsValidUsernameFetchingUsername.story = { name: 'Compose: search is valid username, fetching username', }; export const ComposeSearchIsValidUsernameButFlagIsNotEnabled = (): JSX.Element => ( ); ComposeSearchIsValidUsernameButFlagIsNotEnabled.story = { name: 'Compose: search is valid username, but flag is not enabled', }; export const ComposeSearchIsPartialPhoneNumber = (): JSX.Element => ( ); ComposeSearchIsPartialPhoneNumber.story = { name: 'Compose: search is partial phone number', }; export const ComposeSearchIsValidPhoneNumber = (): JSX.Element => ( ); ComposeSearchIsValidPhoneNumber.story = { name: 'Compose: search is valid phone number', }; export const ComposeSearchIsValidPhoneNumberFetchingPhoneNumber = (): JSX.Element => ( ); ComposeSearchIsValidPhoneNumberFetchingPhoneNumber.story = { name: 'Compose: search is valid phone number, fetching phone number', }; export const ComposeAllKindsOfResultsNoSearchTerm = (): JSX.Element => ( ); ComposeAllKindsOfResultsNoSearchTerm.story = { name: 'Compose: all kinds of results, no search term', }; export const ComposeAllKindsOfResultsWithASearchTerm = (): JSX.Element => ( ); ComposeAllKindsOfResultsWithASearchTerm.story = { name: 'Compose: all kinds of results, with a search term', }; export const CaptchaDialogRequired = (): JSX.Element => ( ); CaptchaDialogRequired.story = { name: 'Captcha dialog: required', }; export const CaptchaDialogPending = (): JSX.Element => ( ); CaptchaDialogPending.story = { name: 'Captcha dialog: pending', }; export const _CrashReportDialog = (): JSX.Element => ( ); _CrashReportDialog.story = { name: 'Crash report dialog', }; export const ChooseGroupMembersPartialPhoneNumber = (): JSX.Element => ( ); ChooseGroupMembersPartialPhoneNumber.story = { name: 'Choose Group Members: Partial phone number', }; export const ChooseGroupMembersValidPhoneNumber = (): JSX.Element => ( ); ChooseGroupMembersValidPhoneNumber.story = { name: 'Choose Group Members: Valid phone number', }; export const ChooseGroupMembersUsername = (): JSX.Element => ( ); ChooseGroupMembersUsername.story = { name: 'Choose Group Members: username', }; export const GroupMetadataNoTimer = (): JSX.Element => ( ); GroupMetadataNoTimer.story = { name: 'Group Metadata: No Timer', }; export const GroupMetadataRegularTimer = (): JSX.Element => ( ); GroupMetadataRegularTimer.story = { name: 'Group Metadata: Regular Timer', }; export const GroupMetadataCustomTimer = (): JSX.Element => ( ); GroupMetadataCustomTimer.story = { name: 'Group Metadata: Custom Timer', }; export const SearchingConversation = (): JSX.Element => ( );