@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
80 lines (63 loc) • 2.47 kB
text/typescript
import { t } from 'i18next';
import { ChatTopic, ChatTopicSummary, GroupedTopic } from '@/types/topic';
import { groupTopicsByTime } from '@/utils/client/topic';
import { ChatStoreState } from '../../initialState';
const currentTopics = (s: ChatStoreState): ChatTopic[] | undefined => s.topicMaps[s.activeId];
const currentActiveTopic = (s: ChatStoreState): ChatTopic | undefined => {
return currentTopics(s)?.find((topic) => topic.id === s.activeTopicId);
};
const searchTopics = (s: ChatStoreState): ChatTopic[] => s.searchTopics;
const displayTopics = (s: ChatStoreState): ChatTopic[] | undefined => currentTopics(s);
const currentFavTopics = (s: ChatStoreState): ChatTopic[] =>
currentTopics(s)?.filter((s) => s.favorite) || [];
const currentUnFavTopics = (s: ChatStoreState): ChatTopic[] =>
currentTopics(s)?.filter((s) => !s.favorite) || [];
const currentTopicLength = (s: ChatStoreState): number => currentTopics(s)?.length || 0;
const getTopicById =
(id: string) =>
(s: ChatStoreState): ChatTopic | undefined =>
currentTopics(s)?.find((topic) => topic.id === id);
const currentActiveTopicSummary = (s: ChatStoreState): ChatTopicSummary | undefined => {
const activeTopic = currentActiveTopic(s);
if (!activeTopic) return undefined;
return {
content: activeTopic.historySummary || '',
model: activeTopic.metadata?.model || '',
provider: activeTopic.metadata?.provider || '',
};
};
const isCreatingTopic = (s: ChatStoreState) => s.creatingTopic;
const isUndefinedTopics = (s: ChatStoreState) => !currentTopics(s);
const isInSearchMode = (s: ChatStoreState) => s.inSearchingMode;
const isSearchingTopic = (s: ChatStoreState) => s.isSearchingTopic;
const groupedTopicsSelector = (s: ChatStoreState): GroupedTopic[] => {
const topics = displayTopics(s);
if (!topics) return [];
const favTopics = currentFavTopics(s);
const unfavTopics = currentUnFavTopics(s);
return favTopics.length > 0
? [
{
children: favTopics,
id: 'favorite',
title: t('favorite', { ns: 'topic' }),
},
...groupTopicsByTime(unfavTopics),
]
: groupTopicsByTime(topics);
};
export const topicSelectors = {
currentActiveTopic,
currentActiveTopicSummary,
currentTopicLength,
currentTopics,
currentUnFavTopics,
displayTopics,
getTopicById,
groupedTopicsSelector,
isCreatingTopic,
isInSearchMode,
isSearchingTopic,
isUndefinedTopics,
searchTopics,
};