import { useParams } from 'common'
import { Code, Play, Terminal } from 'lucide-react'
import Link from 'next/link'
import { useRouter } from 'next/router'
import { parseAsString, useQueryState } from 'nuqs'
import { useMemo } from 'react'
import {
AiIconAnimation,
Button,
Card,
CardContent,
CardHeader,
CardTitle,
cn,
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogSection,
DialogTitle,
DialogTrigger,
Separator,
} from 'ui'
import { CodeBlock } from 'ui-patterns/CodeBlock'
import { EDGE_FUNCTION_TEMPLATES } from './Functions.templates'
import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider'
import { ScaffoldSectionTitle } from '@/components/layouts/Scaffold'
import { DocsButton } from '@/components/ui/DocsButton'
import { ResourceItem } from '@/components/ui/Resource/ResourceItem'
import { ResourceList } from '@/components/ui/Resource/ResourceList'
import { useSendEventMutation } from '@/data/telemetry/send-event-mutation'
import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'
import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization'
import { DOCS_URL } from '@/lib/constants'
import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state'
import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state'
export const FunctionsEmptyState = () => {
const { ref } = useParams()
const router = useRouter()
const aiSnap = useAiAssistantStateSnapshot()
const { openSidebar } = useSidebarManagerSnapshot()
const { mutate: sendEvent } = useSendEventMutation()
const { data: org } = useSelectedOrganizationQuery()
const [, setCreateMethod] = useQueryState('create', parseAsString)
const showStripeExample = useIsFeatureEnabled('edge_functions:show_stripe_example')
const templates = useMemo(() => {
if (showStripeExample) {
return EDGE_FUNCTION_TEMPLATES
}
// Filter out Stripe template
return EDGE_FUNCTION_TEMPLATES.filter((template) => template.value !== 'stripe-webhook')
}, [showStripeExample])
return (
<>
Create and edit functions directly in the browser. Download to local at any time.
Let our AI assistant help you create functions. Perfect for kickstarting a function.
Create and deploy functions using the Supabase CLI. Ideal for local development and
version control.
{template.name} {template.description}
Via Editor
AI Assistant
Via CLI
Create a new edge function called hello-world in your project via the
Supabase CLI.
You can run your Edge Function locally using supabase functions serve.
While serving your local Edge Functions, you can invoke it using cURL or one of the client libraries.
Edge Functions are available in self-hosted Supabase via Supabase Edge Runtime.
Unlike the platform, functions must be added manually — place each function at{' '}
volumes/functions/<function-name>/index.ts
{' '}
and restart the functions service to pick
up changes. See the guide to learn more about configuration, secrets, and routing.
Secrets can be loaded in two ways:
.env file at{' '}
supabase/functions/.env — picked up
automatically on supabase start.
--env-file to{' '}
supabase functions serve, e.g.{' '}
supabase functions serve --env-file ./path/to/.env-file
Configure secrets in your .env file and{' '}
docker-compose.yml under the{' '}
functions service.