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(
() => ({