From 53b63769660f850272886f440c962a4acb1f907d Mon Sep 17 00:00:00 2001 From: koreacomp5 Date: Fri, 24 Oct 2025 21:40:16 +0900 Subject: [PATCH] 222 --- src/app/components/PostList.tsx | 12 ++++--- src/app/posts/[id]/edit/page.tsx | 49 +++++++++++++++++++++---- src/app/posts/[id]/page.tsx | 39 ++++++++++++++------ src/app/posts/new/page.tsx | 62 ++++++++++++++++++++++++++------ 4 files changed, 129 insertions(+), 33 deletions(-) diff --git a/src/app/components/PostList.tsx b/src/app/components/PostList.tsx index 173a6d4..be48fc4 100644 --- a/src/app/components/PostList.tsx +++ b/src/app/components/PostList.tsx @@ -43,16 +43,20 @@ export function PostList({ boardId, sort = "recent", q, tag, author, start, end return (
{/* 정렬 스위치 */} -
- 정렬 +
+ 정렬 { const p = new URLSearchParams(); if (q) p.set("q", q); if (boardId) p.set("boardId", boardId); p.set("sort", "recent"); return p.toString(); })()}`} > 최신 { const p = new URLSearchParams(); if (q) p.set("q", q); if (boardId) p.set("boardId", boardId); p.set("sort", "popular"); return p.toString(); })()}`} > 인기 diff --git a/src/app/posts/[id]/edit/page.tsx b/src/app/posts/[id]/edit/page.tsx index 4d6e7ca..131af37 100644 --- a/src/app/posts/[id]/edit/page.tsx +++ b/src/app/posts/[id]/edit/page.tsx @@ -4,6 +4,7 @@ import { useParams, useRouter } from "next/navigation"; import { useToast } from "@/app/components/ui/ToastProvider"; import { UploadButton } from "@/app/components/UploadButton"; import { Editor } from "@/app/components/Editor"; +import { HeroBanner } from "@/app/components/HeroBanner"; export default function EditPostPage() { const params = useParams<{ id: string }>(); @@ -39,14 +40,48 @@ export default function EditPostPage() { setLoading(false); } } - if (!form) return
불러오는 중...
; + if (!form) return
불러오는 중...
; return ( -
-

글 수정

- setForm({ ...form, title: e.target.value })} /> - setForm({ ...form, content: v })} placeholder="내용을 입력하세요" /> - setForm((f) => (!f ? f : { ...f, content: `${f.content}\n![image](${url})` }))} /> - +
+ {/* 상단 배너 */} +
+ +
+ + {/* 수정 카드 */} +
+
+

글 수정

+
+
+ setForm({ ...form, title: e.target.value })} + /> + setForm({ ...form, content: v })} placeholder="내용을 입력하세요" /> +
+ setForm((f) => (!f ? f : { ...f, content: `${f.content}\n![image](${url})` }))} /> +
+
+
+ + +
+
); } diff --git a/src/app/posts/[id]/page.tsx b/src/app/posts/[id]/page.tsx index 7bf78cf..c4339ce 100644 --- a/src/app/posts/[id]/page.tsx +++ b/src/app/posts/[id]/page.tsx @@ -1,5 +1,6 @@ import { notFound } from "next/navigation"; import { headers } from "next/headers"; +import { HeroBanner } from "@/app/components/HeroBanner"; // 서버 전용 페이지: params가 Promise일 수 있어 안전 언랩 후 절대 URL로 fetch합니다. export default async function PostDetail({ params }: { params: any }) { @@ -12,18 +13,34 @@ export default async function PostDetail({ params }: { params: any }) { const res = await fetch(new URL(`/api/posts/${id}`, base).toString(), { cache: "no-store" }); if (!res.ok) return notFound(); const { post } = await res.json(); + const createdAt = post?.createdAt ? new Date(post.createdAt) : null; return ( -
-

{post.title}

-
-
- -
-
- -
-
-

{post.content}

+
+ {/* 상단 배너 */} +
+ +
+ + {/* 본문 카드 */} +
+
+

{post.title}

+ {createdAt && ( +

{createdAt.toLocaleString()}

+ )} +
+
+
{post.content}
+
+
+
+ +
+
+ +
+
+
); } diff --git a/src/app/posts/new/page.tsx b/src/app/posts/new/page.tsx index e6faf0d..2e65c10 100644 --- a/src/app/posts/new/page.tsx +++ b/src/app/posts/new/page.tsx @@ -5,6 +5,7 @@ import { useRouter, useSearchParams } from "next/navigation"; import { useToast } from "@/app/components/ui/ToastProvider"; import { UploadButton } from "@/app/components/UploadButton"; import { Editor } from "@/app/components/Editor"; +import { HeroBanner } from "@/app/components/HeroBanner"; export default function NewPostPage() { const router = useRouter(); @@ -49,17 +50,56 @@ export default function NewPostPage() { } } return ( -
-

새 글

- setForm({ ...form, boardId: e.target.value })} /> - setForm({ ...form, title: e.target.value })} /> - setForm({ ...form, content: v })} placeholder="내용을 입력하세요" /> - setForm((f) => ({ ...f, content: `${f.content}\n![image](${url})` }))} - {...(boardSlug ? require("@/lib/photoPresets").getPhotoPresetBySlug(boardSlug) : {})} - /> - +
+ {/* 상단 배너 */} +
+ +
+ + {/* 작성 카드 */} +
+
+

새 글

+
+
+ setForm({ ...form, boardId: e.target.value })} + /> + setForm({ ...form, title: e.target.value })} + /> + setForm({ ...form, content: v })} placeholder="내용을 입력하세요" /> +
+ setForm((f) => ({ ...f, content: `${f.content}\n![image](${url})` }))} + {...(boardSlug ? require("@/lib/photoPresets").getPhotoPresetBySlug(boardSlug) : {})} + /> +
+
+ +
); }