my-fullstack-ai-platform/components/tutorial/fetch-data-steps.tsx

164 lines
4.9 KiB
TypeScript
Raw Permalink Normal View History

2026-04-04 20:00:53 +00:00
import { TutorialStep } from "./tutorial-step";
import { CodeBlock } from "./code-block";
const create = `create table notes (
id bigserial primary key,
title text
);
insert into notes(title)
values
('Today I created a Supabase project.'),
('I added some data and queried it from Next.js.'),
('It was awesome!');
`.trim();
const rls = `alter table notes enable row level security;
create policy "Allow public read access" on notes
for select
using (true);`.trim();
const server = `import { createClient } from '@/lib/supabase/server'
export default async function Page() {
const supabase = await createClient()
const { data: notes } = await supabase.from('notes').select()
return <pre>{JSON.stringify(notes, null, 2)}</pre>
}
`.trim();
const client = `'use client'
import { createClient } from '@/lib/supabase/client'
import { useEffect, useState } from 'react'
export default function Page() {
const [notes, setNotes] = useState<any[] | null>(null)
const supabase = createClient()
useEffect(() => {
const getData = async () => {
const { data } = await supabase.from('notes').select()
setNotes(data)
}
getData()
}, [])
return <pre>{JSON.stringify(notes, null, 2)}</pre>
}
`.trim();
export function FetchDataSteps() {
return (
<ol className="flex flex-col gap-6">
<TutorialStep title="Create some tables and insert some data">
<p>
Head over to the{" "}
<a
href="https://supabase.com/dashboard/project/_/editor"
className="font-bold hover:underline text-foreground/80"
target="_blank"
rel="noreferrer"
>
Table Editor
</a>{" "}
for your Supabase project to create a table and insert some example
data. If you&apos;re stuck for creativity, you can copy and paste the
following into the{" "}
<a
href="https://supabase.com/dashboard/project/_/sql/new"
className="font-bold hover:underline text-foreground/80"
target="_blank"
rel="noreferrer"
>
SQL Editor
</a>{" "}
and click RUN!
</p>
<CodeBlock code={create} />
</TutorialStep>
<TutorialStep title="Enable Row Level Security (RLS)">
<p>
Supabase enables Row Level Security (RLS) by default. To query data
from your <code>notes</code> table, you need to add a policy. You can
do this in the{" "}
<a
href="https://supabase.com/dashboard/project/_/editor"
className="font-bold hover:underline text-foreground/80"
target="_blank"
rel="noreferrer"
>
Table Editor
</a>{" "}
or via the{" "}
<a
href="https://supabase.com/dashboard/project/_/sql/new"
className="font-bold hover:underline text-foreground/80"
target="_blank"
rel="noreferrer"
>
SQL Editor
</a>
.
</p>
<p>
For example, you can run the following SQL to allow public read
access:
</p>
<CodeBlock code={rls} />
<p>
You can learn more about RLS in the{" "}
<a
href="https://supabase.com/docs/guides/auth/row-level-security"
className="font-bold hover:underline text-foreground/80"
target="_blank"
rel="noreferrer"
>
Supabase docs
</a>
.
</p>
</TutorialStep>
<TutorialStep title="Query Supabase data from Next.js">
<p>
To create a Supabase client and query data from an Async Server
Component, create a new page.tsx file at{" "}
<span className="relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-xs font-medium text-secondary-foreground border">
/app/notes/page.tsx
</span>{" "}
and add the following.
</p>
<CodeBlock code={server} />
<p>Alternatively, you can use a Client Component.</p>
<CodeBlock code={client} />
</TutorialStep>
<TutorialStep title="Explore the Supabase UI Library">
<p>
Head over to the{" "}
<a
href="https://supabase.com/ui"
className="font-bold hover:underline text-foreground/80"
>
Supabase UI library
</a>{" "}
and try installing some blocks. For example, you can install a
Realtime Chat block by running:
</p>
<CodeBlock
code={
"npx shadcn@latest add https://supabase.com/ui/r/realtime-chat-nextjs.json"
}
/>
</TutorialStep>
<TutorialStep title="Build in a weekend and scale to millions!">
<p>You&apos;re ready to launch your product to the world! 🚀</p>
</TutorialStep>
</ol>
);
}