mirror of
https://github.com/lobehub/lobehub.git
synced 2026-03-27 13:29:15 +07:00
♻️ refactor: 重构优化 selectors 实现
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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}`);
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
import { DEFAULT_AVATAR } from '@/const/meta';
|
||||
import { MetaData } from '@/types/meta';
|
||||
|
||||
export const getAgentAvatar = (s: MetaData) => s.avatar || DEFAULT_AVATAR;
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user