import React, { useEffect, useMemo, useCallback } from 'react'; import { useRouter } from 'next/router'; import { Box, Flex, IconButton, useTheme } from '@chakra-ui/react'; import { useUserStore } from '@/store/user'; import dynamic from 'next/dynamic'; import { defaultApp } from '@/constants/model'; import { useToast } from '@/hooks/useToast'; import { useQuery } from '@tanstack/react-query'; import Tabs from '@/components/Tabs'; import SideTabs from '@/components/SideTabs'; import Avatar from '@/components/Avatar'; import MyIcon from '@/components/Icon'; import PageContainer from '@/components/PageContainer'; import Loading from '@/components/Loading'; import BasicEdit from './components/BasicEdit'; import { serviceSideProps } from '@/utils/i18n'; const AdEdit = dynamic(() => import('./components/AdEdit'), { ssr: false, loading: () => }); const OutLink = dynamic(() => import('./components/OutLink'), { ssr: false }); const API = dynamic(() => import('./components/API'), { ssr: false }); enum TabEnum { 'basicEdit' = 'basicEdit', 'adEdit' = 'adEdit', 'outLink' = 'outLink', 'API' = 'API' } const AppDetail = ({ currentTab }: { currentTab: `${TabEnum}` }) => { const router = useRouter(); const theme = useTheme(); const { toast } = useToast(); const { appId } = router.query as { appId: string }; const { appDetail = defaultApp, loadAppDetail, clearAppModules } = useUserStore(); const setCurrentTab = useCallback( (tab: `${TabEnum}`) => { router.replace({ query: { appId, currentTab: tab } }); }, [appId, router] ); const tabList = useMemo( () => [ { label: '简易配置', id: TabEnum.basicEdit, icon: 'overviewLight' }, { label: '高级编排', id: TabEnum.adEdit, icon: 'settingLight' }, { label: '外部使用', id: TabEnum.outLink, icon: 'shareLight' }, { label: 'API访问', id: TabEnum.API, icon: 'apiLight' }, { label: '立即对话', id: 'startChat', icon: 'chat' } ], [] ); useEffect(() => { const listen = process.env.NODE_ENV === 'production' ? (e: any) => { e.preventDefault(); e.returnValue = '内容已修改,确认离开页面吗?'; } : () => {}; window.addEventListener('beforeunload', listen); return () => { window.removeEventListener('beforeunload', listen); clearAppModules(); }; }, []); useQuery([appId], () => loadAppDetail(appId, true), { onError(err: any) { toast({ title: err?.message || '获取应用异常', status: 'error' }); router.replace('/app/list'); }, onSettled() { router.prefetch(`/chat?appId=${appId}`); } }); return ( {/* pc tab */} {appDetail.name} { if (e === 'startChat') { router.push(`/chat?appId=${appId}`); } else { setCurrentTab(e); } }} /> router.replace('/app/list')} > } bg={'white'} boxShadow={'1px 1px 9px rgba(0,0,0,0.15)'} h={'28px'} size={'sm'} borderRadius={'50%'} aria-label={''} /> 我的应用 {/* phone tab */} {appDetail.name} { if (e === 'startChat') { router.push(`/chat?appId=${appId}`); } else { setCurrentTab(e); } }} /> {currentTab === TabEnum.basicEdit && } {currentTab === TabEnum.adEdit && appDetail && ( setCurrentTab(TabEnum.basicEdit)} /> )} {currentTab === TabEnum.API && } {currentTab === TabEnum.outLink && } ); }; export async function getServerSideProps(context: any) { const currentTab = context?.query?.currentTab || TabEnum.basicEdit; return { props: { currentTab, ...(await serviceSideProps(context)) } }; } export default AppDetail;