import { PermissionAction } from '@supabase/shared-types/out/constants' import { Send } from 'lucide-react' import { useRouter } from 'next/router' import { useEffect, useState, type PropsWithChildren } from 'react' import { toast } from 'sonner' import { useParams } from 'common' import { useIsAPIDocsSidePanelEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { EdgeFunctionTesterSheet } from 'components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionTesterSheet' import { PageLayout } from 'components/layouts/PageLayout/PageLayout' import APIDocsButton from 'components/ui/APIDocsButton' import { DocsButton } from 'components/ui/DocsButton' import NoPermission from 'components/ui/NoPermission' import { useEdgeFunctionQuery } from 'data/edge-functions/edge-function-query' import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { withAuth } from 'hooks/misc/withAuth' import { useFlag } from 'hooks/ui/useFlag' import { Button } from 'ui' import ProjectLayout from '../ProjectLayout/ProjectLayout' import EdgeFunctionsLayout from './EdgeFunctionsLayout' interface EdgeFunctionDetailsLayoutProps { title?: string } const EdgeFunctionDetailsLayout = ({ title, children, }: PropsWithChildren) => { const router = useRouter() const { functionSlug, ref } = useParams() const edgeFunctionCreate = useFlag('edgeFunctionCreate') const isNewAPIDocsEnabled = useIsAPIDocsSidePanelEnabled() const { isLoading, can: canReadFunctions } = useAsyncCheckProjectPermissions( PermissionAction.FUNCTIONS_READ, '*' ) const [isOpen, setIsOpen] = useState(false) const { data: selectedFunction, error, isError, } = useEdgeFunctionQuery({ projectRef: ref, slug: functionSlug }) const name = selectedFunction?.name || '' const breadcrumbItems = [ { label: 'Edge Functions', href: `/project/${ref}/functions`, }, ] const navigationItems = functionSlug ? [ { label: 'Overview', href: `/project/${ref}/functions/${functionSlug}`, }, { label: 'Invocations', href: `/project/${ref}/functions/${functionSlug}/invocations`, }, { label: 'Logs', href: `/project/${ref}/functions/${functionSlug}/logs`, }, ...(edgeFunctionCreate ? [ { label: 'Code', href: `/project/${ref}/functions/${functionSlug}/code`, }, ] : []), { label: 'Details', href: `/project/${ref}/functions/${functionSlug}/details`, }, ] : [] useEffect(() => { let cancel = false if (!!functionSlug && isError && error.code === 404 && !cancel) { toast('Edge function cannot be found in your project') router.push(`/project/${ref}/functions`) } return () => { cancel = true } }, [isError]) if (!isLoading && !canReadFunctions) { return ( ) } return ( {isNewAPIDocsEnabled && ( )} {edgeFunctionCreate && !!functionSlug && ( )} } > {children} setIsOpen(false)} /> ) } export default withAuth(EdgeFunctionDetailsLayout)