diff --git a/src/app/boards/[id]/page.tsx b/src/app/boards/[id]/page.tsx new file mode 100644 index 0000000..1c7aa9f --- /dev/null +++ b/src/app/boards/[id]/page.tsx @@ -0,0 +1,16 @@ +import { PostList } from "@/app/components/PostList"; + +export default async function BoardDetail({ params, searchParams }: { params: { id: string }; searchParams?: { sort?: "recent" | "popular" } }) { + const sort = searchParams?.sort ?? "recent"; + return ( +
+
+

게시판

+ +
+ +
+ ); +} + + diff --git a/src/app/boards/page.tsx b/src/app/boards/page.tsx new file mode 100644 index 0000000..a5ea9a4 --- /dev/null +++ b/src/app/boards/page.tsx @@ -0,0 +1,16 @@ +export default async function BoardsPage() { + const res = await fetch(`${process.env.NEXT_PUBLIC_BASE_URL ?? ""}/api/boards`, { cache: "no-store" }); + const { boards } = await res.json(); + return ( +
+

게시판

+ +
+ ); +} + + diff --git a/src/app/components/PostForm.tsx b/src/app/components/PostForm.tsx new file mode 100644 index 0000000..9e22da7 --- /dev/null +++ b/src/app/components/PostForm.tsx @@ -0,0 +1,44 @@ +"use client"; +import { useState } from "react"; +import { useRouter } from "next/navigation"; +import { useToast } from "@/app/components/ui/ToastProvider"; +import { UploadButton } from "@/app/components/UploadButton"; + +type Values = { title: string; content: string }; + +export function PostForm({ + initial, + onSubmit, + submitText = "등록", +}: { + initial?: Partial; + onSubmit: (values: Values) => Promise<{ id: string } | void>; + submitText?: string; +}) { + const router = useRouter(); + const { show } = useToast(); + const [form, setForm] = useState({ title: initial?.title ?? "", content: initial?.content ?? "" }); + const [loading, setLoading] = useState(false); + async function handleSubmit() { + try { + setLoading(true); + const res = await onSubmit(form); + show("저장되었습니다"); + if (res && res.id) router.push(`/posts/${res.id}`); + } catch (e) { + show("저장 실패"); + } finally { + setLoading(false); + } + } + return ( +
+ setForm({ ...form, title: e.target.value })} /> +