GettingStartedSection() — supabase Function Reference
Architecture documentation for the GettingStartedSection() function in GettingStartedSection.tsx from the supabase codebase.
Entity Profile
Dependency Diagram
graph TD 4a2bd464_5f31_b7aa_976f_6a2afeca5117["GettingStartedSection()"] 2b942197_cc1f_9040_908f_497d02691d6c["useGettingStartedProgress()"] 4a2bd464_5f31_b7aa_976f_6a2afeca5117 -->|calls| 2b942197_cc1f_9040_908f_497d02691d6c 76f5611e_c96b_993a_4c62_d723d401415c["getCodeWorkflowSteps()"] 4a2bd464_5f31_b7aa_976f_6a2afeca5117 -->|calls| 76f5611e_c96b_993a_4c62_d723d401415c c7696fa6_7464_8eca_14ca_c46f7a3ba488["getNoCodeWorkflowSteps()"] 4a2bd464_5f31_b7aa_976f_6a2afeca5117 -->|calls| c7696fa6_7464_8eca_14ca_c46f7a3ba488 style 4a2bd464_5f31_b7aa_976f_6a2afeca5117 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
apps/studio/components/interfaces/HomeNew/GettingStarted/GettingStartedSection.tsx lines 26–243
export function GettingStartedSection({ value, onChange }: GettingStartedSectionProps) {
const { ref } = useParams()
const track = useTrack()
const aiSnap = useAiAssistantStateSnapshot()
const { openSidebar } = useSidebarManagerSnapshot()
const workflow: 'no-code' | 'code' | null = value === 'code' || value === 'no-code' ? value : null
const [previousWorkflow, setPreviousWorkflow] = useState<'no-code' | 'code' | null>(null)
const statuses = useGettingStartedProgress()
const openAiChat = useCallback(
(name: string, initialInput: string) => {
openSidebar(SIDEBAR_KEYS.AI_ASSISTANT)
aiSnap.newChat({ name, initialInput })
},
[aiSnap, openSidebar]
)
const connectActions: GettingStartedAction[] = useMemo(() => {
return [
{
label: 'Connect',
component: <ConnectButton buttonType="primary" />,
},
]
}, [])
const codeSteps: GettingStartedStep[] = useMemo(
() =>
getCodeWorkflowSteps({
ref,
openAiChat,
connectActions,
statuses,
}),
[connectActions, openAiChat, ref, statuses]
)
const noCodeSteps: GettingStartedStep[] = useMemo(
() =>
getNoCodeWorkflowSteps({
ref,
openAiChat,
connectActions,
statuses,
}),
[connectActions, openAiChat, ref, statuses]
)
const steps = workflow === 'code' ? codeSteps : workflow === 'no-code' ? noCodeSteps : []
const hasTrackedExposure = useRef(false)
useEffect(() => {
if (!IS_PLATFORM) return
if (hasTrackedExposure.current) return
hasTrackedExposure.current = true
track('home_getting_started_section_exposed', {
workflow: workflow === 'no-code' ? 'no_code' : workflow === 'code' ? 'code' : null,
})
}, [workflow, track])
return (
<section className="w-full">
<div className="flex justify-between items-center mb-6">
<h3 className="heading-section">Getting started</h3>
<div className="flex items-center gap-2">
<ToggleGroup
type="single"
value={workflow ?? undefined}
onValueChange={(v) => {
if (v) {
const newWorkflow = v as 'no-code' | 'code'
setPreviousWorkflow(workflow)
onChange(newWorkflow)
track('home_getting_started_workflow_clicked', {
workflow: newWorkflow === 'no-code' ? 'no_code' : 'code',
is_switch: previousWorkflow !== null,
})
}
}}
>
<ToggleGroupItem
value="no-code"
aria-label="No-code workflow"
size="sm"
className="text-xs gap-2 h-auto"
>
<Table2 size={16} strokeWidth={1.5} />
No-code
</ToggleGroupItem>
<ToggleGroupItem
value="code"
size="sm"
aria-label="Code workflow"
className="text-xs gap-2 h-auto"
>
<Code size={16} strokeWidth={1.5} />
Code
</ToggleGroupItem>
</ToggleGroup>
<Button
size="tiny"
type="outline"
onClick={() => {
onChange('hidden')
if (workflow) {
const completedSteps = (workflow === 'code' ? codeSteps : noCodeSteps).filter(
(step) => step.status === 'complete'
).length
const totalSteps = (workflow === 'code' ? codeSteps : noCodeSteps).length
track('home_getting_started_closed', {
workflow: workflow === 'no-code' ? 'no_code' : 'code',
steps_completed: completedSteps,
total_steps: totalSteps,
})
}
}}
>
Dismiss
</Button>
</div>
</div>
{steps.length === 0 ? (
<Card className="bg-background/25 border-dashed relative">
<div className="absolute -inset-16 z-0 opacity-50">
<img
src={`${BASE_PATH}/img/reports/bg-grafana-dark.svg`}
alt="Supabase Grafana"
className="w-full h-full object-cover object-right hidden dark:block"
/>
<img
src={`${BASE_PATH}/img/reports/bg-grafana-light.svg`}
alt="Supabase Grafana"
className="w-full h-full object-cover object-right dark:hidden"
/>
<div className="absolute inset-0 bg-gradient-to-r from-background-alternative to-transparent" />
</div>
<CardContent className="relative z-10 p-8 md:p-12 grid lg:grid-cols-2 gap-16 items-center">
<div>
<h2 className="heading-subSection mb-0 heading-meta text-foreground-light mb-4">
Choose a preferred workflow
</h2>
<p className="text-foreground">
With Supabase, you have the flexibility to adopt a workflow that works for you. You
can do everything via the dashboard, or manage your entire project within your own
codebase.
</p>
</div>
<div className="flex items-stretch gap-4">
<Button
size="medium"
type="outline"
onClick={() => {
setPreviousWorkflow(workflow)
onChange('no-code')
track('home_getting_started_workflow_clicked', {
workflow: 'no_code',
is_switch: previousWorkflow !== null,
})
}}
className="block gap-2 h-auto p-4 md:p-8 max-w-80 text-left justify-start bg-background "
>
<Table2 size={20} strokeWidth={1.5} className="text-brand" />
<div className="mt-4">
<div>No-code</div>
<div className="text-foreground-light w-full whitespace-normal">
Ideal for prototyping or getting your project up and running
</div>
</div>
</Button>
<Button
size="medium"
type="outline"
onClick={() => {
setPreviousWorkflow(workflow)
onChange('code')
track('home_getting_started_workflow_clicked', {
workflow: 'code',
is_switch: previousWorkflow !== null,
})
}}
className="bg-background block gap-2 h-auto p-4 md:p-8 max-w-80 text-left justify-start"
>
<Code size={20} strokeWidth={1.5} className="text-brand" />
<div className="mt-4">
<div>Code</div>
<div className="text-foreground-light whitespace-normal">
Ideal for teams that want full control of their project
</div>
</div>
</Button>
</div>
</CardContent>
</Card>
) : (
<GettingStarted
steps={steps}
onStepClick={({ stepIndex, stepTitle, actionType, wasCompleted }) => {
if (workflow) {
track('home_getting_started_step_clicked', {
workflow: workflow === 'no-code' ? 'no_code' : 'code',
step_number: stepIndex + 1,
step_title: stepTitle,
action_type: actionType,
was_completed: wasCompleted,
})
}
}}
/>
)}
</section>
)
}
Domain
Subdomains
Source
Frequently Asked Questions
What does GettingStartedSection() do?
GettingStartedSection() is a function in the supabase codebase.
What does GettingStartedSection() call?
GettingStartedSection() calls 3 function(s): getCodeWorkflowSteps, getNoCodeWorkflowSteps, useGettingStartedProgress.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free