-
글쓴이글
-
2024년 1월 30일 19:28 #111870
Marina참가자app/newbody.js
<div style="color: #cccccc; background-color: #1f1f1f; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;">
<div><span style="color: #ce9178;">'use client'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> { </span><span style="color: #9cdcfe;">generateHTML</span><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'@tiptap/html'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span> <span style="color: #9cdcfe;">StarterKit</span> <span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'@tiptap/starter-kit'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span> <span style="color: #9cdcfe;">Image</span> <span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'@tiptap/extension-image'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span> <span style="color: #9cdcfe;">Youtube</span> <span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'@tiptap/extension-youtube'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span> <span style="color: #9cdcfe;">Link</span> <span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'next/link'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> { </span><span style="color: #9cdcfe;">useEffect</span><span style="color: #cccccc;">, </span><span style="color: #9cdcfe;">useRef</span><span style="color: #cccccc;">, </span><span style="color: #9cdcfe;">useState</span><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'react'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> { </span><span style="color: #9cdcfe;">useSession</span><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'next-auth/react'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span> <span style="color: #9cdcfe;">UpDownBtn</span> <span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'./detail/[id]/UpDownBtn'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> { </span><span style="color: #9cdcfe;">useRouter</span><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'next/navigation'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">export</span> <span style="color: #c586c0;">default</span> <span style="color: #569cd6;">function</span> <span style="color: #dcdcaa;">NewBody</span><span style="color: #cccccc;">() {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span><span style="color: #cccccc;"> { </span><span style="color: #9cdcfe;">data</span><span style="color: #cccccc;">: </span><span style="color: #4fc1ff;">session</span><span style="color: #cccccc;">, </span><span style="color: #4fc1ff;">status</span><span style="color: #cccccc;"> } </span><span style="color: #d4d4d4;">=</span> <span style="color: #dcdcaa;">useSession</span><span style="color: #cccccc;">();</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span><span style="color: #cccccc;"> [</span><span style="color: #4fc1ff;">posts</span><span style="color: #cccccc;">, </span><span style="color: #dcdcaa;">setPosts</span><span style="color: #cccccc;">] </span><span style="color: #d4d4d4;">=</span> <span style="color: #dcdcaa;">useState</span><span style="color: #cccccc;">([]);</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">targetRef</span> <span style="color: #d4d4d4;">=</span> <span style="color: #dcdcaa;">useRef</span><span style="color: #cccccc;">(</span><span style="color: #569cd6;">null</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">router</span> <span style="color: #d4d4d4;">=</span> <span style="color: #dcdcaa;">useRouter</span><span style="color: #cccccc;">();</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">useEffect</span><span style="color: #cccccc;">(() </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">fetch</span><span style="color: #cccccc;">(</span><span style="color: #ce9178;">'/api/post/getPost'</span><span style="color: #cccccc;">)</span></div>
<div><span style="color: #cccccc;"> .</span><span style="color: #dcdcaa;">then</span><span style="color: #cccccc;">((</span><span style="color: #9cdcfe;">r</span><span style="color: #cccccc;">) </span><span style="color: #569cd6;">=></span> <span style="color: #9cdcfe;">r</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">json</span><span style="color: #cccccc;">())</span></div>
<div><span style="color: #cccccc;"> .</span><span style="color: #dcdcaa;">then</span><span style="color: #cccccc;">((</span><span style="color: #9cdcfe;">result</span><span style="color: #cccccc;">) </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">setPosts</span><span style="color: #cccccc;">(</span><span style="color: #9cdcfe;">result</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> });</span></div>
<div><span style="color: #cccccc;"> }, []);</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #6a9955;">// 무한스크롤</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">useEffect</span><span style="color: #cccccc;">(() </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">let</span> <span style="color: #9cdcfe;">observer</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">target</span> <span style="color: #d4d4d4;">=</span> <span style="color: #4fc1ff;">targetRef</span><span style="color: #cccccc;">.</span><span style="color: #9cdcfe;">current</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">if</span><span style="color: #cccccc;"> (</span><span style="color: #4fc1ff;">target</span><span style="color: #cccccc;">) {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">observer</span> <span style="color: #d4d4d4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">IntersectionObserver</span><span style="color: #cccccc;">(</span></div>
<div><span style="color: #cccccc;"> (</span><span style="color: #9cdcfe;">entries</span><span style="color: #cccccc;">) </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">entries</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">forEach</span><span style="color: #cccccc;">(</span><span style="color: #569cd6;">async</span><span style="color: #cccccc;"> (</span><span style="color: #9cdcfe;">entry</span><span style="color: #cccccc;">) </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">if</span><span style="color: #cccccc;"> (</span><span style="color: #9cdcfe;">entry</span><span style="color: #cccccc;">.</span><span style="color: #4fc1ff;">isIntersecting</span> <span style="color: #d4d4d4;">&&</span> <span style="color: #4fc1ff;">posts</span><span style="color: #cccccc;">.</span><span style="color: #9cdcfe;">length</span> <span style="color: #d4d4d4;">></span> <span style="color: #b5cea8;">0</span><span style="color: #cccccc;">) {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #6a9955;">// 마지막 게시물의 ID를 얻기</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">lastId</span> <span style="color: #d4d4d4;">=</span> <span style="color: #4fc1ff;">posts</span><span style="color: #cccccc;">[</span><span style="color: #4fc1ff;">posts</span><span style="color: #cccccc;">.</span><span style="color: #9cdcfe;">length</span> <span style="color: #d4d4d4;">-</span> <span style="color: #b5cea8;">1</span><span style="color: #cccccc;">].</span><span style="color: #9cdcfe;">_id</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">try</span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">response</span> <span style="color: #d4d4d4;">=</span> <span style="color: #c586c0;">await</span> <span style="color: #dcdcaa;">fetch</span><span style="color: #cccccc;">(</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #ce9178;">'/api/post/getPost'</span><span style="color: #cccccc;">,</span></div>
<div><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">method</span><span style="color: #9cdcfe;">:</span> <span style="color: #ce9178;">'POST'</span><span style="color: #cccccc;">,</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">headers</span><span style="color: #9cdcfe;">:</span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #ce9178;">'Content-Type'</span><span style="color: #9cdcfe;">:</span> <span style="color: #ce9178;">'application/json'</span><span style="color: #cccccc;">,</span></div>
<div><span style="color: #cccccc;"> },</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">body</span><span style="color: #9cdcfe;">:</span> <span style="color: #9cdcfe;">JSON</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">stringify</span><span style="color: #cccccc;">({ </span><span style="color: #9cdcfe;">lastId</span><span style="color: #cccccc;"> }),</span></div>
<div><span style="color: #cccccc;"> }</span></div>
<div><span style="color: #cccccc;"> );</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">newPosts</span> <span style="color: #d4d4d4;">=</span> <span style="color: #c586c0;">await</span> <span style="color: #4fc1ff;">response</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">json</span><span style="color: #cccccc;">();</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">setPosts</span><span style="color: #cccccc;">((</span><span style="color: #9cdcfe;">prevPosts</span><span style="color: #cccccc;">) </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> [</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #d4d4d4;">...</span><span style="color: #9cdcfe;">prevPosts</span><span style="color: #cccccc;">,</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #d4d4d4;">...</span><span style="color: #4fc1ff;">newPosts</span><span style="color: #cccccc;">,</span></div>
<div><span style="color: #cccccc;"> ]);</span></div>
<div><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">catch</span><span style="color: #cccccc;"> (</span><span style="color: #9cdcfe;">error</span><span style="color: #cccccc;">) {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">console</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">error</span><span style="color: #cccccc;">(</span><span style="color: #ce9178;">'Error fetching posts:'</span><span style="color: #cccccc;">, </span><span style="color: #9cdcfe;">error</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> }</span></div>
<div><span style="color: #cccccc;"> }</span></div>
<div><span style="color: #cccccc;"> });</span></div>
<div><span style="color: #cccccc;"> },</span></div>
<div><span style="color: #cccccc;"> { </span><span style="color: #9cdcfe;">threshold</span><span style="color: #9cdcfe;">:</span> <span style="color: #b5cea8;">0.5</span><span style="color: #cccccc;"> }</span></div>
<div><span style="color: #cccccc;"> );</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">observer</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">observe</span><span style="color: #cccccc;">(</span><span style="color: #4fc1ff;">target</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span><span style="color: #cccccc;"> () </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">if</span><span style="color: #cccccc;"> (</span><span style="color: #9cdcfe;">observer</span> <span style="color: #d4d4d4;">&&</span> <span style="color: #4fc1ff;">target</span><span style="color: #cccccc;">) {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">observer</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">unobserve</span><span style="color: #cccccc;">(</span><span style="color: #4fc1ff;">target</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> }</span></div>
<div><span style="color: #cccccc;"> };</span></div>
<div><span style="color: #cccccc;"> }</span></div>
<div><span style="color: #cccccc;"> }, [</span><span style="color: #4fc1ff;">targetRef</span><span style="color: #cccccc;">, </span><span style="color: #4fc1ff;">posts</span><span style="color: #cccccc;">]); </span><span style="color: #6a9955;">// targetRef와 posts에 의존성 추가</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #6a9955;">// 게시물 클릭 핸들러</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #dcdcaa;">handlePostClick</span> <span style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> (</span><span style="color: #9cdcfe;">postId</span><span style="color: #cccccc;">) </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">localStorage</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">setItem</span><span style="color: #cccccc;">(</span><span style="color: #ce9178;">'scrollY'</span><span style="color: #cccccc;">, </span><span style="color: #9cdcfe;">window</span><span style="color: #cccccc;">.</span><span style="color: #9cdcfe;">scrollY</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">toString</span><span style="color: #cccccc;">());</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #4fc1ff;">router</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">push</span><span style="color: #cccccc;">(</span><span style="color: #ce9178;">`/detail/</span><span style="color: #569cd6;">${</span><span style="color: #9cdcfe;">postId</span><span style="color: #569cd6;">}</span><span style="color: #ce9178;">`</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> };</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #dcdcaa;">refreshPosts</span> <span style="color: #d4d4d4;">=</span> <span style="color: #569cd6;">async</span><span style="color: #cccccc;"> () </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">try</span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">response</span> <span style="color: #d4d4d4;">=</span> <span style="color: #c586c0;">await</span> <span style="color: #dcdcaa;">fetch</span><span style="color: #cccccc;">(</span><span style="color: #ce9178;">'/api/post/getPost'</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">newPosts</span> <span style="color: #d4d4d4;">=</span> <span style="color: #c586c0;">await</span> <span style="color: #4fc1ff;">response</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">json</span><span style="color: #cccccc;">();</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">setPosts</span><span style="color: #cccccc;">(</span><span style="color: #4fc1ff;">newPosts</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">catch</span><span style="color: #cccccc;"> (</span><span style="color: #9cdcfe;">error</span><span style="color: #cccccc;">) {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">console</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">error</span><span style="color: #cccccc;">(</span><span style="color: #ce9178;">'Error fetching posts:'</span><span style="color: #cccccc;">, </span><span style="color: #9cdcfe;">error</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> }</span></div>
<div><span style="color: #cccccc;"> };</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #dcdcaa;">formatReativeDate</span> <span style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> (</span><span style="color: #9cdcfe;">dateString</span><span style="color: #cccccc;">) </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">date</span> <span style="color: #d4d4d4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Date</span><span style="color: #cccccc;">(</span><span style="color: #9cdcfe;">dateString</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">now</span> <span style="color: #d4d4d4;">=</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Date</span><span style="color: #cccccc;">();</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">diffInSeconds</span> <span style="color: #d4d4d4;">=</span> <span style="color: #9cdcfe;">Math</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">floor</span><span style="color: #cccccc;">((</span><span style="color: #4fc1ff;">now</span> <span style="color: #d4d4d4;">-</span> <span style="color: #4fc1ff;">date</span><span style="color: #cccccc;">) </span><span style="color: #d4d4d4;">/</span> <span style="color: #b5cea8;">1000</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">if</span><span style="color: #cccccc;"> (</span><span style="color: #4fc1ff;">diffInSeconds</span> <span style="color: #d4d4d4;"><</span> <span style="color: #b5cea8;">60</span><span style="color: #cccccc;">) {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span> <span style="color: #ce9178;">`</span><span style="color: #569cd6;">${</span><span style="color: #4fc1ff;">diffInSeconds</span><span style="color: #569cd6;">}</span><span style="color: #ce9178;">sec ago`</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">else</span> <span style="color: #c586c0;">if</span><span style="color: #cccccc;"> (</span><span style="color: #4fc1ff;">diffInSeconds</span> <span style="color: #d4d4d4;"><</span> <span style="color: #b5cea8;">3600</span><span style="color: #cccccc;">) {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span> <span style="color: #ce9178;">`</span><span style="color: #569cd6;">${</span><span style="color: #9cdcfe;">Math</span><span style="color: #d4d4d4;">.</span><span style="color: #dcdcaa;">floor</span><span style="color: #d4d4d4;">(</span><span style="color: #4fc1ff;">diffInSeconds</span><span style="color: #d4d4d4;"> / </span><span style="color: #b5cea8;">60</span><span style="color: #d4d4d4;">)</span><span style="color: #569cd6;">}</span><span style="color: #ce9178;">min ago`</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">else</span> <span style="color: #c586c0;">if</span><span style="color: #cccccc;"> (</span><span style="color: #4fc1ff;">diffInSeconds</span> <span style="color: #d4d4d4;"><</span> <span style="color: #b5cea8;">86400</span><span style="color: #cccccc;">) {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span> <span style="color: #ce9178;">`</span><span style="color: #569cd6;">${</span><span style="color: #9cdcfe;">Math</span><span style="color: #d4d4d4;">.</span><span style="color: #dcdcaa;">floor</span><span style="color: #d4d4d4;">(</span><span style="color: #4fc1ff;">diffInSeconds</span><span style="color: #d4d4d4;"> / </span><span style="color: #b5cea8;">3600</span><span style="color: #d4d4d4;">)</span><span style="color: #569cd6;">}</span><span style="color: #ce9178;">hours ago`</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">else</span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span> <span style="color: #4fc1ff;">date</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">toLocaleDateString</span><span style="color: #cccccc;">(</span><span style="color: #ce9178;">'ko-KR'</span><span style="color: #cccccc;">, {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">year</span><span style="color: #9cdcfe;">:</span> <span style="color: #ce9178;">'numeric'</span><span style="color: #cccccc;">,</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">month</span><span style="color: #9cdcfe;">:</span> <span style="color: #ce9178;">'2-digit'</span><span style="color: #cccccc;">,</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">day</span><span style="color: #9cdcfe;">:</span> <span style="color: #ce9178;">'2-digit'</span><span style="color: #cccccc;">,</span></div>
<div><span style="color: #cccccc;"> });</span></div>
<div><span style="color: #cccccc;"> }</span></div>
<div><span style="color: #cccccc;"> };</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #dcdcaa;">convertYoutubeLink</span> <span style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> (</span><span style="color: #9cdcfe;">url</span><span style="color: #cccccc;">) </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">regExp</span> <span style="color: #d4d4d4;">=</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #d16969;">/</span><span style="color: #dcdcaa;">^</span><span style="color: #d16969;">.</span><span style="color: #d7ba7d;">*</span><span style="color: #ce9178;">(</span><span style="color: #d16969;">youtu</span><span style="color: #d7ba7d;">\.</span><span style="color: #d16969;">be</span><span style="color: #d7ba7d;">\/</span><span style="color: #dcdcaa;">|</span><span style="color: #d16969;">v</span><span style="color: #d7ba7d;">\/</span><span style="color: #dcdcaa;">|</span><span style="color: #d16969;">u</span><span style="color: #d7ba7d;">\/</span><span style="color: #d16969;">\w</span><span style="color: #d7ba7d;">\/</span><span style="color: #dcdcaa;">|</span><span style="color: #d16969;">embed</span><span style="color: #d7ba7d;">\/</span><span style="color: #dcdcaa;">|</span><span style="color: #d16969;">watch</span><span style="color: #d7ba7d;">\?</span><span style="color: #d16969;">v=</span><span style="color: #dcdcaa;">|</span><span style="color: #d7ba7d;">\&</span><span style="color: #d16969;">v=</span><span style="color: #ce9178;">)([^</span><span style="color: #d16969;">#</span><span style="color: #d7ba7d;">\&\?</span><span style="color: #ce9178;">]</span><span style="color: #d7ba7d;">*</span><span style="color: #ce9178;">)</span><span style="color: #d16969;">.</span><span style="color: #d7ba7d;">*</span><span style="color: #d16969;">/</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">match</span> <span style="color: #d4d4d4;">=</span> <span style="color: #9cdcfe;">url</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">match</span><span style="color: #cccccc;">(</span><span style="color: #4fc1ff;">regExp</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span> <span style="color: #4fc1ff;">match</span> <span style="color: #d4d4d4;">&&</span> <span style="color: #4fc1ff;">match</span><span style="color: #cccccc;">[</span><span style="color: #b5cea8;">2</span><span style="color: #cccccc;">].</span><span style="color: #9cdcfe;">length</span> <span style="color: #d4d4d4;">===</span> <span style="color: #b5cea8;">11</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #d4d4d4;">?</span> <span style="color: #ce9178;">`https://www.youtube.com/embed/</span><span style="color: #569cd6;">${</span><span style="color: #4fc1ff;">match</span><span style="color: #d4d4d4;">[</span><span style="color: #b5cea8;">2</span><span style="color: #d4d4d4;">]</span><span style="color: #569cd6;">}</span><span style="color: #ce9178;">`</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #d4d4d4;">:</span> <span style="color: #9cdcfe;">url</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #cccccc;"> };</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #dcdcaa;">renderContent</span> <span style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> (</span><span style="color: #9cdcfe;">item</span><span style="color: #cccccc;">, </span><span style="color: #9cdcfe;">subIndex</span><span style="color: #cccccc;">) </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">switch</span><span style="color: #cccccc;"> (</span><span style="color: #9cdcfe;">item</span><span style="color: #cccccc;">.</span><span style="color: #9cdcfe;">type</span><span style="color: #cccccc;">) {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">case</span> <span style="color: #ce9178;">'youtube'</span><span style="color: #cccccc;">:</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">youtubeUrl</span> <span style="color: #d4d4d4;">=</span> <span style="color: #dcdcaa;">convertYoutubeLink</span><span style="color: #cccccc;">(</span><span style="color: #9cdcfe;">item</span><span style="color: #cccccc;">.</span><span style="color: #9cdcfe;">attrs</span><span style="color: #cccccc;">.</span><span style="color: #9cdcfe;">src</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span><span style="color: #cccccc;"> (</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">iframe</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">key</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #9cdcfe;">subIndex</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">src</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #4fc1ff;">youtubeUrl</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"w-full h-96"</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;">/></span></div>
<div><span style="color: #cccccc;"> );</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">default</span><span style="color: #cccccc;">:</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">htmlStr</span> <span style="color: #d4d4d4;">=</span> <span style="color: #dcdcaa;">generateHTML</span><span style="color: #cccccc;">(</span><span style="color: #9cdcfe;">item</span><span style="color: #cccccc;">, [</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #4fc1ff;">StarterKit</span><span style="color: #cccccc;">,</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #4fc1ff;">Image</span><span style="color: #cccccc;">,</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #4fc1ff;">Youtube</span><span style="color: #cccccc;">,</span></div>
<div><span style="color: #cccccc;"> ]);</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span><span style="color: #cccccc;"> (</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">code</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">key</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #9cdcfe;">subIndex</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"font-normal break-all line-clamp-1"</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">dangerouslySetInnerHTML</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #d4d4d4;">{ </span><span style="color: #9cdcfe;">__html</span><span style="color: #9cdcfe;">:</span> <span style="color: #4fc1ff;">htmlStr</span><span style="color: #d4d4d4;"> }</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;">></</span><span style="color: #569cd6;">code</span><span style="color: #808080;">></span></div>
<div><span style="color: #cccccc;"> );</span></div>
<div><span style="color: #cccccc;"> }</span></div>
<div><span style="color: #cccccc;"> };</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span><span style="color: #cccccc;"> (</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"><></span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">{</span><span style="color: #4fc1ff;">posts</span><span style="color: #d4d4d4;">.</span><span style="color: #dcdcaa;">map</span><span style="color: #d4d4d4;">((</span><span style="color: #9cdcfe;">content</span><span style="color: #d4d4d4;">, </span><span style="color: #9cdcfe;">index</span><span style="color: #d4d4d4;">) </span><span style="color: #569cd6;">=></span><span style="color: #d4d4d4;"> (</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">div</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"border rounded-lg shadow-lg p-4 w-full max-w-xl mx-auto my-1 hover:bg-slate-100"</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">key</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #9cdcfe;">index</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">div</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">onClick</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #d4d4d4;">(</span><span style="color: #9cdcfe;">e</span><span style="color: #d4d4d4;">) </span><span style="color: #569cd6;">=></span><span style="color: #d4d4d4;"> {</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">handlePostClick</span><span style="color: #d4d4d4;">(</span><span style="color: #9cdcfe;">content</span><span style="color: #d4d4d4;">.</span><span style="color: #9cdcfe;">_id</span><span style="color: #d4d4d4;">);</span></div>
<div><span style="color: #d4d4d4;"> }</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">div</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"col-span-2"</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">span</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"text-slate-700"</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> @</span><span style="color: #569cd6;">{</span><span style="color: #9cdcfe;">content</span><span style="color: #d4d4d4;">.</span><span style="color: #9cdcfe;">authorname</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">span</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">span</span><span style="color: #808080;">></span><span style="color: #d4d4d4;"> | </span><span style="color: #808080;"></</span><span style="color: #569cd6;">span</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">span</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"text-slate-700"</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">{</span><span style="color: #dcdcaa;">formatReativeDate</span><span style="color: #d4d4d4;">(</span><span style="color: #9cdcfe;">content</span><span style="color: #d4d4d4;">.</span><span style="color: #9cdcfe;">date</span><span style="color: #d4d4d4;">)</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">span</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">div</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">div</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"col-span-1"</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">h2</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"text-2xl font-semibold mb-2 hover:bg-slate-300 ellipsis"</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">{</span><span style="color: #9cdcfe;">content</span><span style="color: #d4d4d4;">.</span><span style="color: #9cdcfe;">title</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">h2</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">div</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">{</span><span style="color: #6a9955;">/* content body */</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">div</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"col-span-1 mt-3"</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">p</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"font-normal text-gray-600 break-all line-clamp-3 multi-line-ellipsis imageSizes"</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">{</span><span style="color: #9cdcfe;">content</span><span style="color: #d4d4d4;">.</span><span style="color: #9cdcfe;">content</span><span style="color: #d4d4d4;">.</span><span style="color: #9cdcfe;">content</span></div>
<div><span style="color: #d4d4d4;"> .</span><span style="color: #dcdcaa;">slice</span><span style="color: #d4d4d4;">(</span><span style="color: #b5cea8;">0</span><span style="color: #d4d4d4;">, </span><span style="color: #b5cea8;">5</span><span style="color: #d4d4d4;">)</span></div>
<div><span style="color: #d4d4d4;"> .</span><span style="color: #dcdcaa;">map</span><span style="color: #d4d4d4;">(</span><span style="color: #dcdcaa;">renderContent</span><span style="color: #d4d4d4;">)</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">p</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">div</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">div</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #569cd6;">{</span><span style="color: #4fc1ff;">session</span><span style="color: #d4d4d4;">?.</span><span style="color: #9cdcfe;">user</span><span style="color: #d4d4d4;">.</span><span style="color: #9cdcfe;">_id</span><span style="color: #d4d4d4;"> == </span><span style="color: #9cdcfe;">content</span><span style="color: #d4d4d4;">.</span><span style="color: #9cdcfe;">author</span><span style="color: #d4d4d4;"> ||</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #4fc1ff;">session</span><span style="color: #d4d4d4;">?.</span><span style="color: #9cdcfe;">user</span><span style="color: #d4d4d4;">.</span><span style="color: #9cdcfe;">role</span><span style="color: #d4d4d4;"> == </span><span style="color: #ce9178;">'admin'</span><span style="color: #d4d4d4;"> ? (</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">div</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"col-span-2 pt-3 pb-3"</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #4ec9b0;">UpDownBtn</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">content</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #9cdcfe;">content</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">session</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #4fc1ff;">session</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">refreshPosts</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #dcdcaa;">refreshPosts</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;">/></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #4ec9b0;">Link</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">href</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #ce9178;">`/edit/</span><span style="color: #569cd6;">${</span><span style="color: #9cdcfe;">content</span><span style="color: #d4d4d4;">.</span><span style="color: #9cdcfe;">_id</span><span style="color: #569cd6;">}</span><span style="color: #ce9178;">`</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"mr-3 hover:text-red-600"</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> Edit</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"></</span><span style="color: #4ec9b0;">Link</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">span</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"hover:text-red-600"</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">onClick</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{async</span><span style="color: #d4d4d4;"> () </span><span style="color: #569cd6;">=></span><span style="color: #d4d4d4;"> {</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #c586c0;">await</span> <span style="color: #dcdcaa;">fetch</span><span style="color: #d4d4d4;">(</span><span style="color: #ce9178;">'/api/post/delete'</span><span style="color: #d4d4d4;">, {</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">method</span><span style="color: #9cdcfe;">:</span> <span style="color: #ce9178;">'POST'</span><span style="color: #d4d4d4;">,</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">body</span><span style="color: #9cdcfe;">:</span> <span style="color: #9cdcfe;">JSON</span><span style="color: #d4d4d4;">.</span><span style="color: #dcdcaa;">stringify</span><span style="color: #d4d4d4;">({</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">contentId</span><span style="color: #9cdcfe;">:</span> <span style="color: #9cdcfe;">content</span><span style="color: #d4d4d4;">.</span><span style="color: #9cdcfe;">_id</span><span style="color: #d4d4d4;">,</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">authorId</span><span style="color: #9cdcfe;">:</span> <span style="color: #9cdcfe;">content</span><span style="color: #d4d4d4;">.</span><span style="color: #9cdcfe;">author</span><span style="color: #d4d4d4;">,</span></div>
<div><span style="color: #d4d4d4;"> }),</span></div>
<div><span style="color: #d4d4d4;"> })</span></div>
<div><span style="color: #d4d4d4;"> .</span><span style="color: #dcdcaa;">then</span><span style="color: #d4d4d4;">((</span><span style="color: #9cdcfe;">response</span><span style="color: #d4d4d4;">) </span><span style="color: #569cd6;">=></span><span style="color: #d4d4d4;"> {</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #c586c0;">if</span><span style="color: #d4d4d4;"> (!</span><span style="color: #9cdcfe;">response</span><span style="color: #d4d4d4;">.</span><span style="color: #4fc1ff;">ok</span><span style="color: #d4d4d4;">) {</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #c586c0;">throw</span> <span style="color: #569cd6;">new</span> <span style="color: #4ec9b0;">Error</span><span style="color: #d4d4d4;">(</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #ce9178;">'Failed to delete the post'</span></div>
<div><span style="color: #d4d4d4;"> );</span></div>
<div><span style="color: #d4d4d4;"> }</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;">// 게시물 삭제 후 목록을 다시 가져오는 API 호출</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #c586c0;">return</span> <span style="color: #dcdcaa;">fetch</span><span style="color: #d4d4d4;">(</span><span style="color: #ce9178;">'/api/post/getPost'</span><span style="color: #d4d4d4;">)</span></div>
<div><span style="color: #d4d4d4;"> .</span><span style="color: #dcdcaa;">then</span><span style="color: #d4d4d4;">((</span><span style="color: #9cdcfe;">r</span><span style="color: #d4d4d4;">) </span><span style="color: #569cd6;">=></span> <span style="color: #9cdcfe;">r</span><span style="color: #d4d4d4;">.</span><span style="color: #dcdcaa;">json</span><span style="color: #d4d4d4;">())</span></div>
<div><span style="color: #d4d4d4;"> .</span><span style="color: #dcdcaa;">then</span><span style="color: #d4d4d4;">((</span><span style="color: #9cdcfe;">result</span><span style="color: #d4d4d4;">) </span><span style="color: #569cd6;">=></span><span style="color: #d4d4d4;"> {</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #dcdcaa;">setPosts</span><span style="color: #d4d4d4;">(</span><span style="color: #9cdcfe;">result</span><span style="color: #d4d4d4;">);</span></div>
<div><span style="color: #d4d4d4;"> });</span></div>
<div><span style="color: #d4d4d4;"> })</span></div>
<div><span style="color: #d4d4d4;"> .</span><span style="color: #dcdcaa;">catch</span><span style="color: #d4d4d4;">((</span><span style="color: #9cdcfe;">error</span><span style="color: #d4d4d4;">) </span><span style="color: #569cd6;">=></span><span style="color: #d4d4d4;"> {</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #6a9955;">// 에러 핸들링</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">console</span><span style="color: #d4d4d4;">.</span><span style="color: #dcdcaa;">error</span><span style="color: #d4d4d4;">(</span><span style="color: #ce9178;">'Error:'</span><span style="color: #d4d4d4;">, </span><span style="color: #9cdcfe;">error</span><span style="color: #d4d4d4;">);</span></div>
<div><span style="color: #d4d4d4;"> });</span></div>
<div><span style="color: #d4d4d4;"> }</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> delete</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">span</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">div</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> ) : (</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">div</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"col-span-2 pt-3 pb-3"</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"><</span><span style="color: #4ec9b0;">UpDownBtn</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">content</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #9cdcfe;">content</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">session</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #4fc1ff;">session</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #9cdcfe;">refreshPosts</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #dcdcaa;">refreshPosts</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;">/></span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">div</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> )</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">div</span><span style="color: #808080;">></span></div>
<div><span style="color: #d4d4d4;"> ))</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">div</span> <span style="color: #9cdcfe;">ref</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #4fc1ff;">targetRef</span><span style="color: #569cd6;">}</span> <span style="color: #9cdcfe;">style</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #d4d4d4;">{ </span><span style="color: #9cdcfe;">height</span><span style="color: #9cdcfe;">:</span> <span style="color: #ce9178;">'50px'</span><span style="color: #d4d4d4;"> }</span><span style="color: #569cd6;">}</span><span style="color: #808080;">></</span><span style="color: #569cd6;">div</span><span style="color: #808080;">></span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"></></span></div>
<div><span style="color: #cccccc;"> );</span></div>
<div><span style="color: #cccccc;">}</span></div>
</div>components/RollBack.js
<div style="color: #cccccc; background-color: #1f1f1f; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;">
<div><span style="color: #ce9178;">'use client'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> { </span><span style="color: #9cdcfe;">useRouter</span><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'next/navigation'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> { </span><span style="color: #9cdcfe;">useEffect</span><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'react'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> { </span><span style="color: #9cdcfe;">FaArrowLeftLong</span><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'react-icons/fa6'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> { </span><span style="color: #9cdcfe;">usePathname</span><span style="color: #cccccc;">, </span><span style="color: #9cdcfe;">useSearchParams</span><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'next/navigation'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">export</span> <span style="color: #c586c0;">default</span> <span style="color: #569cd6;">function</span> <span style="color: #dcdcaa;">RollBack</span><span style="color: #cccccc;">() {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">router</span> <span style="color: #d4d4d4;">=</span> <span style="color: #dcdcaa;">useRouter</span><span style="color: #cccccc;">();</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span><span style="color: #cccccc;"> (</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">a</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"px-8 pb-4 flex items-center justify-start"</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">onClick</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #d4d4d4;">() </span><span style="color: #569cd6;">=></span><span style="color: #d4d4d4;"> {</span></div>
<div><span style="color: #d4d4d4;"> </span><span style="color: #4fc1ff;">router</span><span style="color: #d4d4d4;">.</span><span style="color: #dcdcaa;">back</span><span style="color: #d4d4d4;">();</span></div>
<div><span style="color: #d4d4d4;"> }</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;">></span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"><</span><span style="color: #4ec9b0;">FaArrowLeftLong</span> <span style="color: #9cdcfe;">size</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #b5cea8;">20</span><span style="color: #569cd6;">}</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"mr-3"</span> <span style="color: #808080;">/></span></div>
<div><span style="color: #cccccc;"> back</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">a</span><span style="color: #808080;">></span></div>
<div><span style="color: #cccccc;"> );</span></div>
<div><span style="color: #cccccc;">}</span></div>
</div>components/ScrollRestoration.js
<div style="color: #cccccc; background-color: #1f1f1f; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;">
<div><span style="color: #ce9178;">'use client'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> { </span><span style="color: #9cdcfe;">useEffect</span><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">from</span> <span style="color: #ce9178;">'react'</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #569cd6;">const</span> <span style="color: #dcdcaa;">ScrollRestoration</span> <span style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> () </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">useEffect</span><span style="color: #cccccc;">(() </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #6a9955;">// 스크롤 위치 복원</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">const</span> <span style="color: #4fc1ff;">savedScrollY</span> <span style="color: #d4d4d4;">=</span> <span style="color: #9cdcfe;">localStorage</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">getItem</span><span style="color: #cccccc;">(</span><span style="color: #ce9178;">'scrollY'</span><span style="color: #cccccc;">);</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">if</span><span style="color: #cccccc;"> (</span><span style="color: #4fc1ff;">savedScrollY</span><span style="color: #cccccc;">) {</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">window</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">scrollTo</span><span style="color: #cccccc;">(</span><span style="color: #b5cea8;">0</span><span style="color: #cccccc;">, </span><span style="color: #dcdcaa;">parseInt</span><span style="color: #cccccc;">(</span><span style="color: #4fc1ff;">savedScrollY</span><span style="color: #cccccc;">, </span><span style="color: #b5cea8;">10</span><span style="color: #cccccc;">));</span></div>
<div><span style="color: #cccccc;"> }</span></div>
<div><span style="color: #cccccc;"> }, []);</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span> <span style="color: #569cd6;">null</span><span style="color: #cccccc;">;</span></div>
<div><span style="color: #cccccc;">};</span></div>
<div><span style="color: #c586c0;">export</span> <span style="color: #c586c0;">default</span> <span style="color: #dcdcaa;">ScrollRestoration</span><span style="color: #cccccc;">;</span></div>
</div>detail/page.js
<div style="color: #cccccc; background-color: #1f1f1f; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;">
<div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span><span style="color: #cccccc;"> (</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">section</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"bg-white"</span><span style="color: #808080;">></span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"><</span><span style="color: #4ec9b0;">RollBack</span> <span style="color: #808080;">/></span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">div</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"px-4 w-full"</span><span style="color: #808080;">></span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">div</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"grid gap-8"</span><span style="color: #808080;">></span></div>
</div>app/page.js
<div style="color: #cccccc; background-color: #1f1f1f; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;">
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"><</span><span style="color: #569cd6;">div</span> <span style="color: #9cdcfe;">className</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"container grid grid-cols-1"</span><span style="color: #808080;">></span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #569cd6;">{</span><span style="color: #6a9955;">/* <BodyContent result={transformedResult} /> */</span><span style="color: #569cd6;">}</span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"><</span><span style="color: #4ec9b0;">ScrollRestoration</span> <span style="color: #808080;">/></span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"><</span><span style="color: #4ec9b0;">NewBody</span> <span style="color: #9cdcfe;">result</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #4fc1ff;">transformedResult</span><span style="color: #569cd6;">}</span> <span style="color: #808080;">/></span></div>
<div><span style="color: #cccccc;"> </span><span style="color: #808080;"></</span><span style="color: #569cd6;">div</span><span style="color: #808080;">></span></div>
</div>무한 스크롤을 만들어서 데이터를 5개씩 마우스 내릴때마다 실행하고 있어요 디테일 페이지를 들어갔다가 뒤로가기를 눌러서 나오면 항상 맨처음 데이터로 되돌아가서 스크롤 y 값을localStroage에 저장을 하고 그 값을 불러오려고 하는데 이게 잘 안되요 지금 상황은 localStorage에는 잘 저장이 되고 있는데 scrollTo로 해서 불러 오면 저장된 y값으로 이동을 안해요
-
글쓴이글
- 답변은 로그인 후 가능합니다.