2022-03-04 16:14:52 -05:00
|
|
|
// Copyright 2022 Signal Messenger, LLC
|
|
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
|
|
|
import Fuse from 'fuse.js';
|
|
|
|
import React, { useEffect, useState } from 'react';
|
|
|
|
import classNames from 'classnames';
|
2022-06-16 20:48:57 -04:00
|
|
|
|
2022-06-30 20:52:03 -04:00
|
|
|
import type {
|
|
|
|
ConversationType,
|
|
|
|
ShowConversationType,
|
|
|
|
} from '../state/ducks/conversations';
|
2022-11-16 17:10:11 -05:00
|
|
|
import type { ConversationStoryType, MyStoryType } from '../types/Stories';
|
2023-08-08 17:53:06 -07:00
|
|
|
import type { LocalizerType, ThemeType } from '../types/Util';
|
2022-07-28 20:16:30 -04:00
|
|
|
import type { PreferredBadgeSelectorType } from '../state/selectors/badges';
|
2023-04-10 14:38:34 -07:00
|
|
|
import type { ShowToastAction } from '../state/ducks/toast';
|
2022-08-22 13:44:23 -04:00
|
|
|
import type { ViewUserStoriesActionCreatorType } from '../state/ducks/stories';
|
2022-11-10 14:01:40 -07:00
|
|
|
import { MyStoryButton } from './MyStoryButton';
|
2022-03-04 16:14:52 -05:00
|
|
|
import { SearchInput } from './SearchInput';
|
|
|
|
import { StoryListItem } from './StoryListItem';
|
2022-06-16 20:48:57 -04:00
|
|
|
import { isNotNil } from '../util/isNotNil';
|
2024-08-13 16:34:42 -07:00
|
|
|
import { NavSidebarSearchHeader, NavSidebarEmpty } from './NavSidebar';
|
2022-03-04 16:14:52 -05:00
|
|
|
|
2022-04-04 17:38:22 -07:00
|
|
|
const FUSE_OPTIONS: Fuse.IFuseOptions<ConversationStoryType> = {
|
2022-07-06 15:06:20 -04:00
|
|
|
getFn: (story, path) => {
|
2022-10-19 15:56:55 -07:00
|
|
|
if (path[0] === 'searchNames' || path === 'searchNames') {
|
2022-07-06 15:06:20 -04:00
|
|
|
return [story.storyView.sender.title, story.storyView.sender.name].filter(
|
|
|
|
isNotNil
|
|
|
|
);
|
2022-03-04 16:14:52 -05:00
|
|
|
}
|
|
|
|
|
2022-07-06 15:06:20 -04:00
|
|
|
return story.group?.title ?? '';
|
2022-03-04 16:14:52 -05:00
|
|
|
},
|
|
|
|
keys: [
|
|
|
|
{
|
|
|
|
name: 'searchNames',
|
|
|
|
weight: 1,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'group',
|
|
|
|
weight: 1,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
threshold: 0.1,
|
|
|
|
};
|
|
|
|
|
|
|
|
function search(
|
|
|
|
stories: ReadonlyArray<ConversationStoryType>,
|
|
|
|
searchTerm: string
|
|
|
|
): Array<ConversationStoryType> {
|
2022-04-04 17:38:22 -07:00
|
|
|
return new Fuse<ConversationStoryType>(stories, FUSE_OPTIONS)
|
|
|
|
.search(searchTerm)
|
|
|
|
.map(result => result.item);
|
2022-03-04 16:14:52 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
export type PropsType = {
|
2022-07-28 20:16:30 -04:00
|
|
|
getPreferredBadge: PreferredBadgeSelectorType;
|
2022-03-04 16:14:52 -05:00
|
|
|
hiddenStories: Array<ConversationStoryType>;
|
|
|
|
i18n: LocalizerType;
|
2023-02-28 14:17:22 -08:00
|
|
|
maxAttachmentSizeInKb: number;
|
2022-06-30 20:52:03 -04:00
|
|
|
me: ConversationType;
|
|
|
|
myStories: Array<MyStoryType>;
|
2022-08-04 15:23:24 -04:00
|
|
|
onAddStory: (file?: File) => unknown;
|
2022-06-30 20:52:03 -04:00
|
|
|
onMyStoriesClicked: () => unknown;
|
2022-07-20 20:07:09 -04:00
|
|
|
onStoriesSettings: () => unknown;
|
2023-02-24 16:18:57 -07:00
|
|
|
onMediaPlaybackStart: () => void;
|
2022-03-28 21:10:08 -04:00
|
|
|
queueStoryDownload: (storyId: string) => unknown;
|
2022-06-16 15:12:50 -04:00
|
|
|
showConversation: ShowConversationType;
|
2023-04-10 14:38:34 -07:00
|
|
|
showToast: ShowToastAction;
|
2022-03-04 16:14:52 -05:00
|
|
|
stories: Array<ConversationStoryType>;
|
2023-08-08 17:53:06 -07:00
|
|
|
theme: ThemeType;
|
2022-03-04 16:14:52 -05:00
|
|
|
toggleHideStories: (conversationId: string) => unknown;
|
2022-08-22 13:44:23 -04:00
|
|
|
viewUserStories: ViewUserStoriesActionCreatorType;
|
2022-03-04 16:14:52 -05:00
|
|
|
};
|
|
|
|
|
2022-11-17 16:45:19 -08:00
|
|
|
export function StoriesPane({
|
2022-07-28 20:16:30 -04:00
|
|
|
getPreferredBadge,
|
2022-04-15 18:31:18 -04:00
|
|
|
hiddenStories,
|
2022-03-04 16:14:52 -05:00
|
|
|
i18n,
|
2023-02-28 14:17:22 -08:00
|
|
|
maxAttachmentSizeInKb,
|
2022-06-30 20:52:03 -04:00
|
|
|
me,
|
|
|
|
myStories,
|
2022-06-16 20:48:57 -04:00
|
|
|
onAddStory,
|
2022-06-30 20:52:03 -04:00
|
|
|
onMyStoriesClicked,
|
2023-02-24 16:18:57 -07:00
|
|
|
onMediaPlaybackStart,
|
2022-03-28 21:10:08 -04:00
|
|
|
queueStoryDownload,
|
2022-06-16 15:12:50 -04:00
|
|
|
showConversation,
|
2022-08-12 19:44:10 -04:00
|
|
|
showToast,
|
2022-03-04 16:14:52 -05:00
|
|
|
stories,
|
2023-08-08 17:53:06 -07:00
|
|
|
theme,
|
2022-03-04 16:14:52 -05:00
|
|
|
toggleHideStories,
|
2022-07-25 14:55:44 -04:00
|
|
|
viewUserStories,
|
2022-11-17 16:45:19 -08:00
|
|
|
}: PropsType): JSX.Element {
|
2022-03-04 16:14:52 -05:00
|
|
|
const [searchTerm, setSearchTerm] = useState('');
|
2022-04-15 18:31:18 -04:00
|
|
|
const [isShowingHiddenStories, setIsShowingHiddenStories] = useState(false);
|
2022-03-04 16:14:52 -05:00
|
|
|
const [renderedStories, setRenderedStories] =
|
|
|
|
useState<Array<ConversationStoryType>>(stories);
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
if (searchTerm) {
|
|
|
|
setRenderedStories(search(stories, searchTerm));
|
|
|
|
} else {
|
|
|
|
setRenderedStories(stories);
|
|
|
|
}
|
|
|
|
}, [searchTerm, stories]);
|
|
|
|
return (
|
2022-04-12 10:45:20 -04:00
|
|
|
<>
|
2024-08-13 16:34:42 -07:00
|
|
|
{!stories.length && (
|
|
|
|
<NavSidebarEmpty
|
|
|
|
title={i18n('icu:Stories__list__empty--title')}
|
|
|
|
subtitle={i18n('icu:Stories__list__empty--subtitle')}
|
|
|
|
/>
|
|
|
|
)}
|
2023-08-08 17:53:06 -07:00
|
|
|
<NavSidebarSearchHeader>
|
|
|
|
<SearchInput
|
2022-08-04 15:23:24 -04:00
|
|
|
i18n={i18n}
|
2023-08-08 17:53:06 -07:00
|
|
|
onChange={event => {
|
|
|
|
setSearchTerm(event.target.value);
|
2022-07-20 20:07:09 -04:00
|
|
|
}}
|
2023-08-08 17:53:06 -07:00
|
|
|
placeholder={i18n('icu:search')}
|
|
|
|
value={searchTerm}
|
2022-07-20 20:07:09 -04:00
|
|
|
/>
|
2023-08-08 17:53:06 -07:00
|
|
|
</NavSidebarSearchHeader>
|
2022-07-29 15:26:40 -04:00
|
|
|
<div className="Stories__pane__list">
|
2022-11-17 16:45:19 -08:00
|
|
|
<MyStoryButton
|
|
|
|
i18n={i18n}
|
2023-02-28 14:17:22 -08:00
|
|
|
maxAttachmentSizeInKb={maxAttachmentSizeInKb}
|
2022-11-17 16:45:19 -08:00
|
|
|
me={me}
|
|
|
|
myStories={myStories}
|
|
|
|
onAddStory={onAddStory}
|
|
|
|
onClick={onMyStoriesClicked}
|
|
|
|
queueStoryDownload={queueStoryDownload}
|
|
|
|
showToast={showToast}
|
2023-02-24 16:18:57 -07:00
|
|
|
onMediaPlaybackStart={onMediaPlaybackStart}
|
2022-11-17 16:45:19 -08:00
|
|
|
/>
|
|
|
|
{renderedStories.map(story => (
|
|
|
|
<StoryListItem
|
|
|
|
conversationId={story.conversationId}
|
|
|
|
getPreferredBadge={getPreferredBadge}
|
|
|
|
hasReplies={story.hasReplies}
|
|
|
|
hasRepliesFromSelf={story.hasRepliesFromSelf}
|
|
|
|
group={story.group}
|
2022-04-12 10:45:20 -04:00
|
|
|
i18n={i18n}
|
2022-11-17 16:45:19 -08:00
|
|
|
key={story.storyView.timestamp}
|
|
|
|
onGoToConversation={conversationId => {
|
|
|
|
showConversation({ conversationId });
|
|
|
|
}}
|
|
|
|
onHideStory={toggleHideStories}
|
2023-02-24 16:18:57 -07:00
|
|
|
onMediaPlaybackStart={onMediaPlaybackStart}
|
2022-04-12 10:45:20 -04:00
|
|
|
queueStoryDownload={queueStoryDownload}
|
2022-11-17 16:45:19 -08:00
|
|
|
story={story.storyView}
|
2023-08-08 17:53:06 -07:00
|
|
|
theme={theme}
|
2022-11-17 16:45:19 -08:00
|
|
|
viewUserStories={viewUserStories}
|
2022-04-12 10:45:20 -04:00
|
|
|
/>
|
2022-11-17 16:45:19 -08:00
|
|
|
))}
|
|
|
|
{Boolean(hiddenStories.length) && (
|
|
|
|
<>
|
|
|
|
<button
|
|
|
|
className={classNames('Stories__hidden-stories', {
|
2023-08-08 17:53:06 -07:00
|
|
|
'Stories__hidden-stories--collapsed': !isShowingHiddenStories,
|
2022-11-17 16:45:19 -08:00
|
|
|
'Stories__hidden-stories--expanded': isShowingHiddenStories,
|
|
|
|
})}
|
|
|
|
onClick={() => setIsShowingHiddenStories(!isShowingHiddenStories)}
|
|
|
|
type="button"
|
|
|
|
>
|
2023-03-29 17:03:25 -07:00
|
|
|
{i18n('icu:Stories__hidden-stories')}
|
2022-11-17 16:45:19 -08:00
|
|
|
</button>
|
|
|
|
{isShowingHiddenStories &&
|
|
|
|
hiddenStories.map(story => (
|
|
|
|
<StoryListItem
|
|
|
|
conversationId={story.conversationId}
|
|
|
|
getPreferredBadge={getPreferredBadge}
|
|
|
|
group={story.group}
|
|
|
|
i18n={i18n}
|
|
|
|
isHidden
|
|
|
|
key={story.storyView.timestamp}
|
|
|
|
onGoToConversation={conversationId => {
|
|
|
|
showConversation({ conversationId });
|
|
|
|
}}
|
|
|
|
onHideStory={toggleHideStories}
|
2023-02-24 16:18:57 -07:00
|
|
|
onMediaPlaybackStart={onMediaPlaybackStart}
|
2022-11-17 16:45:19 -08:00
|
|
|
queueStoryDownload={queueStoryDownload}
|
|
|
|
story={story.storyView}
|
2023-08-08 17:53:06 -07:00
|
|
|
theme={theme}
|
2022-11-17 16:45:19 -08:00
|
|
|
viewUserStories={viewUserStories}
|
|
|
|
/>
|
|
|
|
))}
|
|
|
|
</>
|
|
|
|
)}
|
2022-04-12 10:45:20 -04:00
|
|
|
</div>
|
|
|
|
</>
|
2022-03-04 16:14:52 -05:00
|
|
|
);
|
2022-11-17 16:45:19 -08:00
|
|
|
}
|