From f59d70baa00e6c273c5e82a53aeaf3bb212f92e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BC=8D=E9=97=B2=E7=8A=AC?= Date: Mon, 18 Aug 2025 17:33:37 +0800 Subject: [PATCH] fix: fix the chat/share page pane (#5485) --- .../src/pageComponents/chat/ChatHeader.tsx | 20 +- .../pageComponents/chat/ChatHistorySlider.tsx | 182 ++++++++++-------- .../pageComponents/chat/ChatSetting/index.tsx | 6 + .../pageComponents/chat/ChatTeamApp/index.tsx | 5 + .../chat/ChatWindow/AppChatWindow.tsx | 21 +- .../chat/ChatWindow/HomeChatWindow.tsx | 79 +++++--- .../src/pageComponents/chat/SliderApps.tsx | 5 +- projects/app/src/pages/chat/share.tsx | 5 + .../core/chat/context/chatSettingContext.tsx | 11 +- 9 files changed, 206 insertions(+), 128 deletions(-) diff --git a/projects/app/src/pageComponents/chat/ChatHeader.tsx b/projects/app/src/pageComponents/chat/ChatHeader.tsx index c7692a897..8ffd1c643 100644 --- a/projects/app/src/pageComponents/chat/ChatHeader.tsx +++ b/projects/app/src/pageComponents/chat/ChatHeader.tsx @@ -30,13 +30,19 @@ import { DEFAULT_LOGO_BANNER_COLLAPSED_URL } from '@/pageComponents/chat/constants'; import { useChatStore } from '@/web/core/chat/context/useChatStore'; +import { usePathname } from 'next/navigation'; +import type { ChatSettingSchema } from '@fastgpt/global/core/chat/setting/type'; const ChatHeader = ({ history, showHistory, apps, - totalRecordsCount + totalRecordsCount, + pane, + chatSettings }: { + pane: ChatSidebarPaneEnum; + chatSettings: ChatSettingSchema | undefined; history: ChatItemType[]; showHistory?: boolean; apps?: AppListItemType[]; @@ -44,16 +50,14 @@ const ChatHeader = ({ }) => { const { t } = useTranslation(); const { isPc } = useSystem(); + const pathname = usePathname(); const chatData = useContextSelector(ChatItemContext, (v) => v.chatBoxData); const isVariableVisible = useContextSelector(ChatItemContext, (v) => v.isVariableVisible); - const pane = useContextSelector(ChatSettingContext, (v) => v.pane); - const chatSettings = useContextSelector(ChatSettingContext, (v) => v.chatSettings); - const isPlugin = chatData.app.type === AppTypeEnum.plugin; - const router = useRouter(); - const isChat = router.pathname === '/chat'; + const isChat = pathname === '/chat'; + const isShare = pathname === '/chat/share'; return isPc && isPlugin ? null : ( void; }) => { const theme = useTheme(); + const pathname = usePathname(); const { t } = useTranslation(); const { isPc } = useSystem(); @@ -54,11 +63,9 @@ const ChatHistorySlider = ({ const appAvatar = useContextSelector(ChatItemContext, (v) => v.chatBoxData?.app.avatar); const setCiteModalData = useContextSelector(ChatItemContext, (v) => v.setCiteModalData); - const pane = useContextSelector(ChatSettingContext, (v) => v.pane); - const chatSettings = useContextSelector(ChatSettingContext, (v) => v.chatSettings); - const handlePaneChange = useContextSelector(ChatSettingContext, (v) => v.handlePaneChange); + const isActivePane = useCallback((active: ChatSidebarPaneEnum) => active === pane, [pane]); - const isActivePane = useMemoizedFn((active: ChatSidebarPaneEnum) => active === pane); + const isShare = pathname === '/chat/share'; const concatHistory = useMemo(() => { const formatHistories: HistoryItemType[] = histories.map((item) => { @@ -132,64 +139,69 @@ const ChatHistorySlider = ({ - - { - handlePaneChange(ChatSidebarPaneEnum.HOME); - onCloseSlider(); - setChatId(); - }} - > - - - - {t('chat:sidebar.home')} - - - + {!isShare && ( + <> + + { + onPaneChange?.(ChatSidebarPaneEnum.HOME); + onCloseSlider(); + setChatId(); + }} + > + + + + {t('chat:sidebar.home')} + + + - { - handlePaneChange(ChatSidebarPaneEnum.TEAM_APPS); - onCloseSlider(); - }} - > - - - - {t('chat:sidebar.team_apps')} - - - - - - + { + onPaneChange?.(ChatSidebarPaneEnum.TEAM_APPS); + onCloseSlider(); + }} + > + + + + {t('chat:sidebar.team_apps')} + + + + + + + )} )} @@ -380,27 +392,29 @@ const ChatHistorySlider = ({ - { - handlePaneChange(ChatSidebarPaneEnum.SETTING); - onCloseSlider(); - }} - > - - + {!isShare && ( + { + onPaneChange?.(ChatSidebarPaneEnum.SETTING); + onCloseSlider(); + }} + > + + + )} )} diff --git a/projects/app/src/pageComponents/chat/ChatSetting/index.tsx b/projects/app/src/pageComponents/chat/ChatSetting/index.tsx index b9dfc7cea..006156905 100644 --- a/projects/app/src/pageComponents/chat/ChatSetting/index.tsx +++ b/projects/app/src/pageComponents/chat/ChatSetting/index.tsx @@ -27,7 +27,10 @@ const ChatSetting = () => { const isOpenSlider = useContextSelector(ChatContext, (v) => v.isOpenSlider); const onCloseSlider = useContextSelector(ChatContext, (v) => v.onCloseSlider); const onOpenSlider = useContextSelector(ChatContext, (v) => v.onOpenSlider); + + const pane = useContextSelector(ChatSettingContext, (v) => v.pane); const chatSettings = useContextSelector(ChatSettingContext, (v) => v.chatSettings); + const handlePaneChange = useContextSelector(ChatSettingContext, (v) => v.handlePaneChange); const SettingHeader = useCallback( ({ children }: { children?: React.ReactNode }) => ( @@ -65,6 +68,9 @@ const ChatSetting = () => { diff --git a/projects/app/src/pageComponents/chat/ChatTeamApp/index.tsx b/projects/app/src/pageComponents/chat/ChatTeamApp/index.tsx index 3e8f8e86d..9e405b812 100644 --- a/projects/app/src/pageComponents/chat/ChatTeamApp/index.tsx +++ b/projects/app/src/pageComponents/chat/ChatTeamApp/index.tsx @@ -28,7 +28,9 @@ const MyApps = () => { (v) => v ); + const pane = useContextSelector(ChatSettingContext, (v) => v.pane); const chatSettings = useContextSelector(ChatSettingContext, (v) => v.chatSettings); + const handlePaneChange = useContextSelector(ChatSettingContext, (v) => v.handlePaneChange); const onCloseSlider = useContextSelector(ChatContext, (v) => v.onCloseSlider); const isOpenSlider = useContextSelector(ChatContext, (v) => v.isOpenSlider); @@ -78,6 +80,9 @@ const MyApps = () => { diff --git a/projects/app/src/pageComponents/chat/ChatWindow/AppChatWindow.tsx b/projects/app/src/pageComponents/chat/ChatWindow/AppChatWindow.tsx index 7f03eadad..8762b49be 100644 --- a/projects/app/src/pageComponents/chat/ChatWindow/AppChatWindow.tsx +++ b/projects/app/src/pageComponents/chat/ChatWindow/AppChatWindow.tsx @@ -37,7 +37,6 @@ const AppChatWindow = ({ myApps }: Props) => { const { t } = useTranslation(); const { isPc } = useSystem(); - const handlePaneChange = useContextSelector(ChatSettingContext, (v) => v.handlePaneChange); const isOpenSlider = useContextSelector(ChatContext, (v) => v.isOpenSlider); const forbidLoadChat = useContextSelector(ChatContext, (v) => v.forbidLoadChat); const onCloseSlider = useContextSelector(ChatContext, (v) => v.onCloseSlider); @@ -51,6 +50,10 @@ const AppChatWindow = ({ myApps }: Props) => { const chatRecords = useContextSelector(ChatRecordContext, (v) => v.chatRecords); const totalRecordsCount = useContextSelector(ChatRecordContext, (v) => v.totalRecordsCount); + const pane = useContextSelector(ChatSettingContext, (v) => v.pane); + const chatSettings = useContextSelector(ChatSettingContext, (v) => v.chatSettings); + const handlePaneChange = useContextSelector(ChatSettingContext, (v) => v.handlePaneChange); + const { loading } = useRequest2( async () => { if (!appId || forbidLoadChat.current) return; @@ -122,7 +125,12 @@ const AppChatWindow = ({ myApps }: Props) => { {/* show history slider */} {isPc || !appId ? ( - + ) : ( { > - + )} @@ -148,6 +161,8 @@ const AppChatWindow = ({ myApps }: Props) => { flexDirection={'column'} > { const { llmModelList, defaultModels, feConfigs } = useSystemStore(); const { chatId, appId, outLinkAuthData } = useChatStore(); - const handlePaneChange = useContextSelector(ChatSettingContext, (v) => v.handlePaneChange); - const isOpenSlider = useContextSelector(ChatContext, (v) => v.isOpenSlider); const forbidLoadChat = useContextSelector(ChatContext, (v) => v.forbidLoadChat); const onCloseSlider = useContextSelector(ChatContext, (v) => v.onCloseSlider); @@ -89,7 +87,9 @@ const HomeChatWindow = ({ myApps }: Props) => { const setChatBoxData = useContextSelector(ChatItemContext, (v) => v.setChatBoxData); const resetVariables = useContextSelector(ChatItemContext, (v) => v.resetVariables); + const pane = useContextSelector(ChatSettingContext, (v) => v.pane); const chatSettings = useContextSelector(ChatSettingContext, (v) => v.chatSettings); + const handlePaneChange = useContextSelector(ChatSettingContext, (v) => v.handlePaneChange); const chatRecords = useContextSelector(ChatRecordContext, (v) => v.chatRecords); const totalRecordsCount = useContextSelector(ChatRecordContext, (v) => v.totalRecordsCount); @@ -101,6 +101,14 @@ const HomeChatWindow = ({ myApps }: Props) => { const [selectedModel, setSelectedModel] = useLocalStorageState('chat_home_model', { defaultValue: defaultModels.llm?.model }); + const selectedModelAvatar = useMemo(() => { + const modelData = getModelFromList(llmModelList, selectedModel || ''); + return modelData?.avatar || HUGGING_FACE_ICON; + }, [selectedModel, llmModelList]); + const selectedModelButtonLabel = useMemo(() => { + const modelData = availableModels.find((model) => model.value === selectedModel); + return modelData?.label || selectedModel; + }, [selectedModel, availableModels]); const availableTools = useMemo( () => chatSettings?.selectedTools || [], @@ -246,33 +254,38 @@ const HomeChatWindow = ({ myApps }: Props) => { <> {/* 模型选择 */} {availableModels.length > 0 && ( - - { - setChatBoxData((state) => ({ - ...state, - app: { - ...state.app, - chatConfig: { - ...state.app.chatConfig, - fileSelectConfig: { - ...defaultFileSelectConfig, - canSelectImg: !!getWebLLMModel(model).vision - } + + {isPc && } + {selectedModelButtonLabel} + + } + onChange={async (model) => { + setChatBoxData((state) => ({ + ...state, + app: { + ...state.app, + chatConfig: { + ...state.app.chatConfig, + fileSelectConfig: { + ...defaultFileSelectConfig, + canSelectImg: !!getWebLLMModel(model).vision } } - })); - setSelectedModel(model); - }} - /> - + } + })); + setSelectedModel(model); + }} + /> )} {/* 工具选择下拉框 */} @@ -348,7 +361,9 @@ const HomeChatWindow = ({ myApps }: Props) => { selectedToolIds, setSelectedToolIds, setChatBoxData, - isPc + isPc, + selectedModelAvatar, + selectedModelButtonLabel ] ); @@ -363,6 +378,9 @@ const HomeChatWindow = ({ myApps }: Props) => { ) : ( @@ -378,6 +396,9 @@ const HomeChatWindow = ({ myApps }: Props) => { @@ -407,6 +428,8 @@ const HomeChatWindow = ({ myApps }: Props) => { ) ) : ( { }; const BottomSection = () => { + const pathname = usePathname(); const { t } = useTranslation(); const { feConfigs } = useSystemStore(); const isProVersion = !!feConfigs.isPlus; @@ -335,6 +337,7 @@ const BottomSection = () => { const avatar = userInfo?.avatar; const username = userInfo?.username; const isAdmin = !!userInfo?.team.permission.hasManagePer; + const isShare = pathname === '/chat/share'; const isCollapsed = useContextSelector(ChatSettingContext, (v) => v.collapse === 1); const isSettingActive = useContextSelector( @@ -354,7 +357,7 @@ const BottomSection = () => { h={isCollapsed ? 'auto' : '40px'} minH="40px" > - {isAdmin && isProVersion && ( + {isAdmin && isProVersion && !isShare && ( import('@/pageComponents/chat/CustomPluginRunBox')); @@ -220,6 +221,8 @@ const OutLink = (props: Props) => { const RenderHistoryList = useMemo(() => { const Children = ( ); @@ -272,6 +275,8 @@ const OutLink = (props: Props) => { {/* header */} {showHead === '1' ? ( ({ export const ChatSettingContextProvider = ({ children }: { children: React.ReactNode }) => { const router = useRouter(); + const pathname = usePathname(); const { feConfigs } = useSystemStore(); const { appId, setLastPane, setLastChatAppId, lastPane } = useChatStore(); - const { pane = lastPane || ChatSidebarPaneEnum.HOME } = router.query as { - pane: ChatSidebarPaneEnum; - }; + const { pane = lastPane || ChatSidebarPaneEnum.HOME } = ( + pathname === '/chat/share' ? { pane: ChatSidebarPaneEnum.RECENTLY_USED_APPS } : router.query + ) as { pane: ChatSidebarPaneEnum }; const [collapse, setCollapse] = useState(defaultCollapseStatus); @@ -86,6 +88,7 @@ export const ChatSettingContextProvider = ({ children }: { children: React.React await router.replace({ query: { + ...router.query, appId: _id, pane: newPane } @@ -101,7 +104,7 @@ export const ChatSettingContextProvider = ({ children }: { children: React.React if (!Object.values(ChatSidebarPaneEnum).includes(pane)) { handlePaneChange(ChatSidebarPaneEnum.HOME); } - }, [pane]); + }, [pane, handlePaneChange]); const logos: Pick = useMemo( () => ({