dify/web/app/(commonLayout)/datasets/layout.tsx
Stephen Zhou a84c2d36a3
style: format with vp fmt (#38803)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-07-12 15:57:46 +00:00

64 lines
2.4 KiB
TypeScript

'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 <Loading type="app" />
if (shouldRedirectToDatasets) {
return null
}
return (
<ExternalKnowledgeApiProvider enabled={canConnectExternalDataset}>
<ExternalApiPanelProvider>{children}</ExternalApiPanelProvider>
</ExternalKnowledgeApiProvider>
)
}