♻️ refactor: 重构优化 selectors 实现

This commit is contained in:
arvinxx
2023-07-24 23:35:11 +08:00
parent c3cda00a8c
commit 97fe1cdf5b
7 changed files with 19 additions and 20 deletions

View File

@@ -6,7 +6,7 @@ import { useTranslation } from 'react-i18next';
import { Flexbox } from 'react-layout-kit';
import { shallow } from 'zustand/shallow';
import { chatSelectors, sessionSelectors, useSessionStore } from '@/store/session';
import { agentSelectors, chatSelectors, sessionSelectors, useSessionStore } from '@/store/session';
import { useSettings } from '@/store/settings';
import { useStyles } from './style';
@@ -39,10 +39,10 @@ const SessionItem: FC<SessionItemProps> = memo(({ id, active = true, loading })
const meta = session.meta;
const systemRole = session.config.systemRole;
return [
meta.title,
agentSelectors.getTitle(meta),
meta.description,
systemRole,
sessionSelectors.getAgentAvatar(meta),
agentSelectors.getAvatar(meta),
meta.backgroundColor,
session?.updateAt,
session.config.model,
@@ -95,7 +95,7 @@ const SessionItem: FC<SessionItemProps> = memo(({ id, active = true, loading })
}
loading={loading}
style={{ color: theme.colorText }}
title={title || t('defaultSession')}
title={title}
/>
<Popconfirm
arrow={false}

View File

@@ -8,7 +8,7 @@ import { sessionSelectors, useSessionStore } from '@/store/session';
import SessionItem from './SessionItem';
const SessionList = memo(() => {
const list = useSessionStore((s) => sessionSelectors.chatList(s), isEqual);
const list = useSessionStore((s) => sessionSelectors.sessionList(s), isEqual);
const [activeId, loading] = useSessionStore(
(s) => [s.activeId, s.autocompleteLoading.title],
shallow,

View File

@@ -6,14 +6,14 @@ import { sessionSelectors, useSessionStore } from '@/store/session';
import Chat from './[id]/index.page';
export default () => {
// 支持用户在进到首页时,自动激活第一个列表中的角色
// 支持用户在进到首页时,自动激活列表中的第一个角色
useEffect(() => {
const hasRehydrated = useSessionStore.persist.hasHydrated();
// 只有当水合完毕后,才往下走
if (!hasRehydrated) return;
// 如果当前有会话,那么就激活第一个会话
const list = sessionSelectors.chatList(useSessionStore.getState());
const list = sessionSelectors.sessionList(useSessionStore.getState());
if (list.length > 0) {
const sessionId = list[0].id;
Router.push(`/chat/${sessionId}`);

View File

@@ -1,3 +1,5 @@
import { t } from 'i18next';
import { DEFAULT_AVATAR, DEFAULT_BACKGROUND_COLOR } from '@/const/meta';
import { SessionStore } from '@/store/session';
import { LanguageModel } from '@/types/llm';
@@ -13,7 +15,7 @@ const currentAgentMeta = (s: SessionStore): MetaData => {
return { avatar: DEFAULT_AVATAR, backgroundColor: DEFAULT_BACKGROUND_COLOR, ...session?.meta };
};
const currentAgentTitle = (s: SessionStore) => currentAgentMeta(s)?.title;
const currentAgentTitle = (s: SessionStore) => currentAgentMeta(s)?.title || t('defaultSession');
const currentAgentBackgroundColor = (s: SessionStore) => {
const session = sessionSelectors.currentSession(s);
@@ -51,6 +53,10 @@ const hasSystemRole = (s: SessionStore) => {
return !!config.systemRole;
};
export const getAvatar = (s: MetaData) => s.avatar || DEFAULT_AVATAR;
export const getTitle = (s: MetaData) => s.title || t('defaultSession');
export const agentSelectors = {
currentAgentAvatar,
currentAgentBackgroundColor,
@@ -60,5 +66,7 @@ export const agentSelectors = {
currentAgentModel,
currentAgentSystemRole,
currentAgentTitle,
getAvatar,
getTitle,
hasSystemRole,
};

View File

@@ -1,4 +0,0 @@
import { DEFAULT_AVATAR } from '@/const/meta';
import { MetaData } from '@/types/meta';
export const getAgentAvatar = (s: MetaData) => s.avatar || DEFAULT_AVATAR;

View File

@@ -1,20 +1,15 @@
import { getAgentAvatar } from './chat';
import {
chatListSel,
currentSessionSafe,
currentSessionSel,
getSessionById,
getSessionMetaById,
sessionList,
} from './list';
export const sessionSelectors = {
chatList: chatListSel,
currentSession: currentSessionSel,
currentSessionSafe,
getAgentAvatar,
getSessionById,
// sessionTree: sessionTreeSel,
getSessionMetaById,
sessionList,
};

View File

@@ -14,7 +14,7 @@ export const currentSessionSafe = (s: SessionStore): LobeAgentSession => {
return currentSessionSel(s) || initLobeSession;
};
export const chatListSel = (s: SessionStore) => {
export const sessionList = (s: SessionStore) => {
const filterChats = filterWithKeywords(s.sessions, s.searchKeywords, (item) => [
Object.values(item.chats)
.map((c) => c.content)