From 0c66bf6fa7530373043eeeadaac1695f73d600a8 Mon Sep 17 00:00:00 2001 From: koreacomp5 Date: Thu, 9 Oct 2025 17:49:39 +0900 Subject: [PATCH] =?UTF-8?q?9.1=20=EC=97=90=EB=94=94=ED=84=B0(Tiptap/Quill?= =?UTF-8?q?=20=EC=A4=91=20=ED=83=9D1)=20=ED=86=B5=ED=95=A9=20o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/components/Editor.tsx | 28 ++++++++++++++++++++++++++++ src/app/posts/[id]/edit/page.tsx | 3 ++- src/app/posts/new/page.tsx | 3 ++- todolist.txt | 10 ++++++---- 4 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 src/app/components/Editor.tsx diff --git a/src/app/components/Editor.tsx b/src/app/components/Editor.tsx new file mode 100644 index 0000000..2439750 --- /dev/null +++ b/src/app/components/Editor.tsx @@ -0,0 +1,28 @@ +"use client"; +import { useEffect, useRef } from "react"; + +export function Editor({ value, onChange, placeholder }: { value: string; onChange: (v: string) => void; placeholder?: string }) { + const ref = useRef(null); + useEffect(() => { + const el = ref.current; + if (!el) return; + if (el.innerHTML !== value) el.innerHTML = value || ""; + }, [value]); + return ( +
onChange((e.target as HTMLDivElement).innerHTML)} + data-placeholder={placeholder} + style={{ + minHeight: 160, + border: "1px solid #ddd", + borderRadius: 6, + padding: 12, + }} + suppressContentEditableWarning + /> + ); +} + + diff --git a/src/app/posts/[id]/edit/page.tsx b/src/app/posts/[id]/edit/page.tsx index 40dd223..4d6e7ca 100644 --- a/src/app/posts/[id]/edit/page.tsx +++ b/src/app/posts/[id]/edit/page.tsx @@ -3,6 +3,7 @@ import { useEffect, useState } from "react"; 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"; export default function EditPostPage() { const params = useParams<{ id: string }>(); @@ -43,7 +44,7 @@ export default function EditPostPage() {

글 수정

setForm({ ...form, title: e.target.value })} /> -