import React, { useState, useCallback } from 'react';
import { Flex, useTheme, 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 { InitChatResponse } from '@/global/core/chat/api';
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 { AppListItemType } from '@fastgpt/global/core/app/type';
import {
GetResourceFolderListProps,
GetResourceListItemResponse
} from '@fastgpt/global/common/parentFolder/type';
import { getMyApps } from '@/web/core/app/api';
import SelectOneResource from '@/components/common/folder/SelectOneResource';
const ChatHeader = ({
chatData,
history,
showHistory,
apps,
onRouteToAppDetail
}: {
history: ChatItemType[];
showHistory?: boolean;
chatData: InitChatResponse;
apps?: AppListItemType[];
onRouteToAppDetail?: () => void;
}) => {
const isPlugin = chatData.app.type === AppTypeEnum.plugin;
const { isPc } = useSystem();
return isPc && isPlugin ? null : (
{isPc ? (
<>
>
) : (
)}
{/* 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 && (
)}
>
);
};
const PcHeader = ({
title,
chatModels,
history
}: {
title: string;
chatModels?: string[];
history: ChatItemType[];
}) => {
const { t } = useTranslation();
return (
<>
{title}
{history.length === 0
? t('common:core.chat.New Chat')
: t('common:core.chat.History Amount', { amount: history.length })}
{!!chatModels && chatModels.length > 0 && (
{chatModels.join(',')}
)}
>
);
};
export default ChatHeader;