import { Box, Flex, Spinner, Center } from '@chakra-ui/react'; import { getWebReqUrl } from '@fastgpt/web/common/system/utils'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useToggle } from 'ahooks'; import { useRouter } from 'next/router'; import { useState, useEffect, useMemo } from 'react'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useUserStore } from '@/web/support/user/useUserStore'; import { useTranslation } from 'next-i18next'; import { getWorkorderURL } from '@/web/common/workorder/api'; import { TeamErrEnum } from '@fastgpt/global/common/error/code/team'; const BotShowRouter: { [key: string]: boolean } = { '/dashboard/agent': true, '/dashboard/tool': true, '/dashboard/systemTool': true, '/dashboard/templateMarket': true, '/dashboard/mcpServer': true, '/dashboard/evaluation': true, '/dataset/list': true, '/account/info': true }; const HelperBot = () => { const router = useRouter(); const { i18n } = useTranslation(); const [open, setOpen] = useToggle(true); const [showChat, setShowChat] = useToggle(false); const [isLoading, setIsLoading] = useState(true); const { feConfigs, setNotSufficientModalType, subPlans } = useSystemStore(); const { teamPlanStatus } = useUserStore(); const hasTicketAccess = useMemo(() => { const plan = teamPlanStatus?.standard?.currentSubLevel ? subPlans?.standard?.[teamPlanStatus?.standard?.currentSubLevel] : undefined; const ticketResponseTime = teamPlanStatus?.standard?.ticketResponseTime ?? plan?.ticketResponseTime; return !!ticketResponseTime; }, [ subPlans?.standard, teamPlanStatus?.standard?.currentSubLevel, teamPlanStatus?.standard?.ticketResponseTime ]); const botIframeUrl = feConfigs?.botIframeUrl; useEffect(() => { if (showChat) { setIsLoading(true); } }, [showChat]); useEffect(() => { const handleMessage = async (event: MessageEvent) => { if (event.data?.type === 'workorderRequest') { if (!hasTicketAccess) { setNotSufficientModalType(TeamErrEnum.ticketNotAvailable); return; } try { const data = await getWorkorderURL(); if (data?.redirectUrl) { window.open(data.redirectUrl); } } catch (error) { console.error('Failed to create workorder:', error); } } }; window.addEventListener('message', handleMessage); return () => window.removeEventListener('message', handleMessage); }, [hasTicketAccess, setNotSufficientModalType]); if (!botIframeUrl || !BotShowRouter[router.pathname]) { return null; } return ( <> {showChat && open && ( {isLoading && (
)} setShowChat.set(false)} > {/* iframe */} setIsLoading(false)} /> )} {open && ( <> { e.stopPropagation(); setOpen.set(false); setShowChat.set(false); }} > {!showChat && ( {i18n.language === 'zh-CN' ? ( ) : ( )} )} )} { if (open) { setShowChat.toggle(); } else { setOpen.set(true); } }} /> ); }; export default HelperBot;