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 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, confirmClearText, onDelHistory, onClearHistory, onSetHistoryTop, onSetCustomTitle }: { appId?: string; appName: string; appAvatar: string; 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 isUserChatPage = router.pathname === '/chat'; const { t } = useTranslation(); const { isPc } = useSystem(); const { userInfo } = useUserStore(); const { onChangeChatId, chatId: activeChatId, isLoading, ScrollList, historyList, histories } = useContextSelector(ChatContext, (v) => v); const concatHistory = useMemo(() => { const formatHistories: HistoryItemType[] = historyList.map((data) => { const item = data.data; return { 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, historyList, 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 && ( {t('common:core.chat.History')} )} {/* Clear */} {isPc && histories.length > 0 && ( openConfirm(() => { onClearHistory(); })() } > )} {/* chat history */} <> {concatHistory.map((item, i) => ( { onChangeChatId(item.id); } })} {...(i !== concatHistory.length - 1 && { mb: '8px' })} > {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 && isUserChatPage && ( 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;