import React, { useMemo } from 'react'; import { Box, Button, Flex, useTheme, IconButton } from '@chakra-ui/react'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; import { useEditTitle } from '@/web/common/hooks/useEditTitle'; import { useRouter } from 'next/router'; import Avatar from '@fastgpt/web/components/common/Avatar'; import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useTranslation } from 'next-i18next'; import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; import { useUserStore } from '@/web/support/user/useUserStore'; import { AppListItemType } from '@fastgpt/global/core/app/type'; import { useI18n } from '@/web/context/I18n'; import MyMenu from '@fastgpt/web/components/common/MyMenu'; import { useContextSelector } from 'use-context-selector'; import { ChatContext } from '@/web/core/chat/context/chatContext'; import MyBox from '@fastgpt/web/components/common/MyBox'; type HistoryItemType = { id: string; title: string; customTitle?: string; top?: boolean; }; const ChatHistorySlider = ({ appId, appName, appAvatar, apps = [], confirmClearText, onDelHistory, onClearHistory, onSetHistoryTop, onSetCustomTitle }: { appId?: string; appName: string; appAvatar: string; apps?: AppListItemType[]; confirmClearText: string; onDelHistory: (e: { chatId: string }) => void; onClearHistory: () => void; onSetHistoryTop?: (e: { chatId: string; top: boolean }) => void; onSetCustomTitle?: (e: { chatId: string; title: string }) => void; }) => { const theme = useTheme(); const router = useRouter(); const isTeamChat = router.pathname === '/chat/team'; const { t } = useTranslation(); const { appT } = useI18n(); const { isPc } = useSystem(); const { userInfo } = useUserStore(); const { histories, onChangeChatId, chatId: activeChatId, isLoading } = useContextSelector(ChatContext, (v) => v); const concatHistory = useMemo(() => { const formatHistories: HistoryItemType[] = histories.map((item) => ({ id: item.chatId, title: item.title, customTitle: item.customTitle, top: item.top })); const newChat: HistoryItemType = { id: activeChatId, title: t('common:core.chat.New Chat') }; const activeChat = histories.find((item) => item.chatId === activeChatId); return !activeChat ? [newChat].concat(formatHistories) : formatHistories; }, [activeChatId, histories, t]); // custom title edit const { onOpenModal, EditModal: EditTitleModal } = useEditTitle({ title: t('common:core.chat.Custom History Title'), placeholder: t('common:core.chat.Custom History Title Description') }); const { openConfirm, ConfirmModal } = useConfirm({ content: confirmClearText }); const canRouteToDetail = useMemo( () => appId && userInfo?.team.permission.hasWritePer, [appId, userInfo?.team.permission.hasWritePer] ); return ( {isPc && ( canRouteToDetail && router.push({ pathname: '/app/detail', query: { appId } }) } > {appName} )} {/* menu */} {!isPc && appId && ( {t('common:core.chat.History')} )} {/* Clear */} {isPc && ( openConfirm(() => { onClearHistory(); })() } > )} {/* chat history */} <> {concatHistory.map((item, i) => ( { onChangeChatId(item.id); } })} > {item.customTitle || item.title} {!!item.id && ( } aria-label={''} /> } menuList={[ { children: [ ...(onSetHistoryTop ? [ { label: item.top ? t('common:core.chat.Unpin') : t('common:core.chat.Pin'), icon: 'core/chat/setTopLight', onClick: () => { onSetHistoryTop({ chatId: item.id, top: !item.top }); } } ] : []), ...(onSetCustomTitle ? [ { label: t('common:common.Custom Title'), icon: 'common/customTitleLight', onClick: () => { onOpenModal({ defaultVal: item.customTitle || item.title, onSuccess: (e) => onSetCustomTitle({ chatId: item.id, title: e }) }); } } ] : []), { label: t('common:common.Delete'), icon: 'delete', onClick: () => { onDelHistory({ chatId: item.id }); if (item.id === activeChatId) { onChangeChatId(); } }, type: 'danger' } ] } ]} /> )} ))} {/* exec */} {!isPc && appId && !isTeamChat && ( router.push('/app/list')} > } bg={'white'} boxShadow={'1px 1px 9px rgba(0,0,0,0.15)'} size={'smSquare'} borderRadius={'50%'} aria-label={''} /> {t('common:core.chat.Exit Chat')} )} ); }; export default ChatHistorySlider;