'use client'; /** * 동적 게시판 수정 폼 컴포넌트 * - mode=edit 또는 /edit 페이지에서 사용 */ import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { ArrowLeft, X, Save, MessageSquare } from 'lucide-react'; import { DetailPageSkeleton } from '@/components/ui/skeleton'; import { PageLayout } from '@/components/organisms/PageLayout'; import { PageHeader } from '@/components/organisms/PageHeader'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Checkbox } from '@/components/ui/checkbox'; import { useMenuStore } from '@/stores/menuStore'; import { getDynamicBoardPost, updateDynamicBoardPost } from '@/components/board/DynamicBoard/actions'; import { getBoardByCode } from '@/components/board/BoardManagement/actions'; import type { PostApiData } from '@/components/customer-center/shared/types'; interface BoardPost { id: string; title: string; content: string; authorId: string; authorName: string; status: string; views: number; isNotice: boolean; isSecret: boolean; createdAt: string; updatedAt: string; } // API 데이터 → 프론트엔드 타입 변환 function transformApiToPost(apiData: PostApiData): BoardPost { return { id: String(apiData.id), title: apiData.title, content: apiData.content, authorId: String(apiData.user_id), authorName: apiData.author?.name || '회원', status: apiData.status, views: apiData.views, isNotice: apiData.is_notice, isSecret: apiData.is_secret, createdAt: apiData.created_at, updatedAt: apiData.updated_at, }; } interface DynamicBoardEditFormProps { boardCode: string; postId: string; } export function DynamicBoardEditForm({ boardCode, postId }: DynamicBoardEditFormProps) { const router = useRouter(); const sidebarCollapsed = useMenuStore((state) => state.sidebarCollapsed); // 게시판 정보 const [boardName, setBoardName] = useState('게시판'); // 원본 게시글 const [post, setPost] = useState(null); const [isLoading, setIsLoading] = useState(true); const [loadError, setLoadError] = useState(null); // 폼 상태 const [title, setTitle] = useState(''); const [content, setContent] = useState(''); const [isSecret, setIsSecret] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); // 게시판 정보 로드 useEffect(() => { async function fetchBoardInfo() { const result = await getBoardByCode(boardCode); if (result.success && result.data) { setBoardName(result.data.boardName); } } fetchBoardInfo(); }, [boardCode]); // 게시글 로드 useEffect(() => { async function fetchPost() { setIsLoading(true); setLoadError(null); const result = await getDynamicBoardPost(boardCode, postId); if (result.success && result.data) { const postData = transformApiToPost(result.data); setPost(postData); setTitle(postData.title); setContent(postData.content); setIsSecret(postData.isSecret); } else { setLoadError(result.error || '게시글을 찾을 수 없습니다.'); } setIsLoading(false); } fetchPost(); }, [boardCode, postId]); // 폼 제출 const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!title.trim()) { setError('제목을 입력해주세요.'); return; } if (!content.trim()) { setError('내용을 입력해주세요.'); return; } setIsSubmitting(true); setError(null); const result = await updateDynamicBoardPost(boardCode, postId, { title: title.trim(), content: content.trim(), is_secret: isSecret, }); if (result.success) { router.push(`/ko/boards/${boardCode}/${postId}?mode=view`); } else { setError(result.error || '게시글 수정에 실패했습니다.'); setIsSubmitting(false); } }; // 취소 const handleCancel = () => { router.push(`/ko/boards/${boardCode}/${postId}?mode=view`); }; // 로딩 상태 if (isLoading) { return ( ); } // 로드 에러 if (loadError || !post) { return (

{loadError || '게시글을 찾을 수 없습니다.'}

); } return (
게시글 수정 {error && (

{error}

)} {/* 제목 */}
setTitle(e.target.value)} placeholder="제목을 입력하세요" disabled={isSubmitting} />
{/* 내용 */}