"use client"; import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { createAnnouncement, uploadFile } from "@/lib/services"; import { useAuth } from "@/hooks"; import ImageUpload, { PendingImage } from "@/components/ImageUpload"; interface AnnouncementFormData { title: string; isImportant: boolean; } export default function CreateAnnouncementPage() { const [pendingImages, setPendingImages] = useState([]); const router = useRouter(); const { user, isLoading } = useAuth(); const { register, handleSubmit, formState: { errors, isSubmitting }, } = useForm({ defaultValues: { title: "", isImportant: false, }, }); // 로그인하지 않은 경우 리다이렉트 useEffect(() => { if (!isLoading && !user) { alert("로그인이 필요합니다."); router.push("/login"); } }, [isLoading, user, router]); const onSubmit = async (data: AnnouncementFormData) => { if (!user) return; try { // 이미지 업로드 let uploadedFiles: { fileKey: string; fileName: string; fileSize: number; mimeType: string; }[] = []; if (pendingImages.length > 0) { const sortedImages = [...pendingImages].sort((a, b) => a.order - b.order); const uploadPromises = sortedImages.map(async (img) => { const result = await uploadFile(img.file, "/announcement"); return { fileKey: result.fileKey, fileName: img.file.name, fileSize: img.file.size, mimeType: img.file.type, }; }); uploadedFiles = await Promise.all(uploadPromises); } await createAnnouncement({ ...data, content: "", // 내용 필드는 빈 문자열로 전송 authorId: user.id, files: uploadedFiles.length > 0 ? uploadedFiles : undefined, }); // 미리보기 URL 정리 pendingImages.forEach((img) => { if (img.preview) URL.revokeObjectURL(img.preview); }); alert("주보가 등록되었습니다."); router.push("/announcements"); } catch (err) { const errorMessage = err instanceof Error ? err.message : "주보 등록에 실패했습니다."; alert(errorMessage); } }; if (isLoading) { return (
); } if (!user) { return null; } return (
{/* 제목 */}
{errors.title && (

{errors.title.message}

)}
{/* 중요 공지 체크박스 */}
{/* 이미지 업로드 */} {/* 버튼 */}
); }