'use client' import { useAtomValue } from 'jotai' import { useEffect } from 'react' import Loading from '@/app/components/base/loading' import { ExternalApiPanelProvider } from '@/context/external-api-panel-context' import { ExternalKnowledgeApiProvider } from '@/context/external-knowledge-api-context' import { workspacePermissionKeysAtom, workspacePermissionKeysLoadingAtom, } from '@/context/permission-state' import { currentWorkspaceIdAtom, currentWorkspaceLoadingAtom } from '@/context/workspace-state' import { usePathname, useRouter } from '@/next/navigation' import { hasPermission } from '@/utils/permission' const isDatasetCreatePath = (pathname: string) => { return ( pathname === '/datasets/create' || pathname.startsWith('/datasets/create/') || pathname === '/datasets/create-from-pipeline' || pathname.startsWith('/datasets/create-from-pipeline/') ) } const isDatasetExternalConnectPath = (pathname: string) => { return pathname === '/datasets/connect' || pathname.startsWith('/datasets/connect/') } export default function DatasetsLayout({ children }: { children: React.ReactNode }) { const currentWorkspaceId = useAtomValue(currentWorkspaceIdAtom) const isLoadingCurrentWorkspace = useAtomValue(currentWorkspaceLoadingAtom) const isLoadingWorkspacePermissionKeys = useAtomValue(workspacePermissionKeysLoadingAtom) const workspacePermissionKeys = useAtomValue(workspacePermissionKeysAtom) const router = useRouter() const pathname = usePathname() const isLoadingAccess = isLoadingCurrentWorkspace || !!isLoadingWorkspacePermissionKeys const canCreateDataset = hasPermission(workspacePermissionKeys, 'dataset.create_and_management') const canConnectExternalDataset = hasPermission( workspacePermissionKeys, 'dataset.external.connect', ) const shouldRedirectToDatasets = !isLoadingAccess && !!currentWorkspaceId && ((isDatasetCreatePath(pathname) && !canCreateDataset) || (isDatasetExternalConnectPath(pathname) && !canConnectExternalDataset)) useEffect(() => { if (shouldRedirectToDatasets) router.replace('/datasets') }, [shouldRedirectToDatasets, router]) if (isLoadingAccess || !currentWorkspaceId) return if (shouldRedirectToDatasets) { return null } return ( {children} ) }