// Copyright 2022 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React, { useState } from 'react'; import classNames from 'classnames'; import type { ConversationType } from '../state/ducks/conversations'; import type { ConversationStoryType, StoryViewType } from '../types/Stories'; import { StoryViewTargetType, HasStories } from '../types/Stories'; import type { LocalizerType } from '../types/Util'; import type { PreferredBadgeSelectorType } from '../state/selectors/badges'; import type { ViewUserStoriesActionCreatorType } from '../state/ducks/stories'; import { Avatar, AvatarSize } from './Avatar'; import { ConfirmationDialog } from './ConfirmationDialog'; import { ContextMenu } from './ContextMenu'; import { MessageTimestamp } from './conversation/MessageTimestamp'; import { StoryImage } from './StoryImage'; import { ThemeType } from '../types/Util'; import { getAvatarColor } from '../types/Colors'; export type PropsType = Pick & { conversationId: string; getPreferredBadge: PreferredBadgeSelectorType; hasReplies?: boolean; hasRepliesFromSelf?: boolean; i18n: LocalizerType; onGoToConversation: (conversationId: string) => unknown; onHideStory: (conversationId: string) => unknown; queueStoryDownload: (storyId: string) => unknown; story: StoryViewType; viewUserStories: ViewUserStoriesActionCreatorType; }; function StoryListItemAvatar({ acceptedMessageRequest, avatarPath, avatarStoryRing, badges, color, getPreferredBadge, i18n, isMe, profileName, sharedGroupNames, title, }: Pick< ConversationType, | 'acceptedMessageRequest' | 'avatarPath' | 'color' | 'profileName' | 'sharedGroupNames' | 'title' > & { avatarStoryRing?: HasStories; badges?: ConversationType['badges']; getPreferredBadge: PreferredBadgeSelectorType; i18n: LocalizerType; isMe?: boolean; }): JSX.Element { return ( ); } export const StoryListItem = ({ conversationId, getPreferredBadge, group, hasReplies, hasRepliesFromSelf, i18n, isHidden, onGoToConversation, onHideStory, queueStoryDownload, story, viewUserStories, }: PropsType): JSX.Element => { const [hasConfirmHideStory, setHasConfirmHideStory] = useState(false); const { attachment, isUnread, sender, timestamp } = story; const { firstName, title } = sender; let avatarStoryRing: HasStories | undefined; if (attachment) { avatarStoryRing = isUnread ? HasStories.Unread : HasStories.Read; } let repliesElement: JSX.Element | undefined; if (hasRepliesFromSelf) { repliesElement =
; } else if (hasReplies) { repliesElement =
; } return ( <> { if (isHidden) { onHideStory(conversationId); } else { setHasConfirmHideStory(true); } }, }, { icon: 'StoryListItem__icon--info', label: i18n('StoryListItem__info'), onClick: () => viewUserStories({ conversationId, viewTarget: StoryViewTargetType.Details, }), }, { icon: 'StoryListItem__icon--chat', label: i18n('StoryListItem__go-to-chat'), onClick: () => onGoToConversation(conversationId), }, ]} moduleClassName={classNames('StoryListItem', { 'StoryListItem--hidden': isHidden, })} onClick={() => viewUserStories({ conversationId })} popperOptions={{ placement: 'bottom', strategy: 'absolute', }} >
<>
{group ? group.title : title}
{repliesElement}
{hasConfirmHideStory && ( onHideStory(conversationId), style: 'affirmative', text: i18n('StoryListItem__hide-modal--confirm'), }, ]} i18n={i18n} onClose={() => { setHasConfirmHideStory(false); }} > {i18n('StoryListItem__hide-modal--body', [String(firstName)])} )} ); };