import React, { useState, useCallback } from 'react'; import { Flex, Box, useDisclosure } from '@chakra-ui/react'; import MyIcon from '@fastgpt/web/components/common/Icon'; import Avatar from '@fastgpt/web/components/common/Avatar'; import ToolMenu from './ToolMenu'; import type { ChatItemType } from '@fastgpt/global/core/chat/type'; import { useTranslation } from 'next-i18next'; import MyTag from '@fastgpt/web/components/common/Tag/index'; import { useContextSelector } from 'use-context-selector'; import { ChatContext } from '@/web/core/chat/context/chatContext'; import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; import { AppFolderTypeList, AppTypeEnum } from '@fastgpt/global/core/app/constants'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; import LightRowTabs from '@fastgpt/web/components/common/Tabs/LightRowTabs'; import { useRouter } from 'next/router'; import { type AppListItemType } from '@fastgpt/global/core/app/type'; import { type GetResourceFolderListProps, type GetResourceListItemResponse } from '@fastgpt/global/common/parentFolder/type'; import { getMyApps } from '@/web/core/app/api'; import SelectOneResource from '@/components/common/folder/SelectOneResource'; import { ChatItemContext } from '@/web/core/chat/context/chatItemContext'; import VariablePopover from '@/components/core/chat/ChatContainer/ChatBox/components/VariablePopover'; const ChatHeader = ({ history, showHistory, apps, totalRecordsCount }: { history: ChatItemType[]; showHistory?: boolean; apps?: AppListItemType[]; totalRecordsCount: number; }) => { const { t } = useTranslation(); const { isPc } = useSystem(); const chatData = useContextSelector(ChatItemContext, (v) => v.chatBoxData); const isVariableVisible = useContextSelector(ChatItemContext, (v) => v.isVariableVisible); const isPlugin = chatData.app.type === AppTypeEnum.plugin; const router = useRouter(); const isChat = router.pathname === '/chat'; return isPc && isPlugin ? null : ( {isPc ? ( <> ) : ( )} {!isVariableVisible && } {/* control */} {!isPlugin && } ); }; const MobileDrawer = ({ onCloseDrawer, appId, apps }: { onCloseDrawer: () => void; appId: string; apps?: AppListItemType[]; }) => { enum TabEnum { recently = 'recently', app = 'app' } const { t } = useTranslation(); const router = useRouter(); const isTeamChat = router.pathname === '/chat/team'; const [currentTab, setCurrentTab] = useState(TabEnum.recently); const getAppList = useCallback(async ({ parentId }: GetResourceFolderListProps) => { return getMyApps({ parentId }).then((res) => res.map((item) => ({ id: item._id, name: item.name, avatar: item.avatar, isFolder: AppFolderTypeList.includes(item.type) })) ); }, []); const { onChangeAppId } = useContextSelector(ChatContext, (v) => v); const onclickApp = (id: string) => { onChangeAppId(id); onCloseDrawer(); }; return ( { onCloseDrawer(); }} > {/* menu */} e.stopPropagation()} background={'white'} position={'relative'} > gap={3} inlineStyles={{ px: 2 }} list={[ ...(isTeamChat ? [{ label: t('app:all_apps'), value: TabEnum.recently }] : [ { label: t('common:core.chat.Recent use'), value: TabEnum.recently }, { label: t('app:all_apps'), value: TabEnum.app } ]) ]} value={currentTab} onChange={setCurrentTab} /> e.stopPropagation()} borderRadius={'0 0 10px 10px'} position={'relative'} py={3} pt={0} pb={4} h={'65vh'} > {/* history */} {currentTab === TabEnum.recently && ( {Array.isArray(apps) && apps.map((item) => ( onclickApp(item._id) })} > {item.name} ))} )} {currentTab === TabEnum.app && ( { if (!id) return; onclickApp(id); }} server={getAppList} /> )} ); }; const MobileHeader = ({ showHistory, name, avatar, appId, apps }: { showHistory?: boolean; avatar: string; name: string; apps?: AppListItemType[]; appId: string; }) => { const router = useRouter(); const onOpenSlider = useContextSelector(ChatContext, (v) => v.onOpenSlider); const { isOpen: isOpenDrawer, onToggle: toggleDrawer, onClose: onCloseDrawer } = useDisclosure(); const isShareChat = router.pathname === '/chat/share'; return ( <> {showHistory && ( )} {name} {isShareChat ? null : ( )} {isOpenDrawer && !isShareChat && ( )} ); }; export const PcHeader = ({ title, chatModels, totalRecordsCount }: { title: string; chatModels?: string[]; totalRecordsCount: number; }) => { const { t } = useTranslation(); return ( <> {title} {totalRecordsCount === 0 ? t('common:core.chat.New Chat') : t('common:core.chat.History Amount', { amount: totalRecordsCount })} {!!chatModels && chatModels.length > 0 && ( {chatModels.join(',')} )} ); }; export default ChatHeader;