"use client" import * as React from "react" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import { toast } from "sonner" import * as z from "zod" import { Upload } from "lucide-react" import { Button } from "@/components/ui/button" import { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, } from "@/components/ui/sheet" import { Form, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { uploadProjectGtcFile } from "../service" import type { ProjectGtcView } from "@/db/schema" const updateProjectSchema = z.object({ gtcFile: z.instanceof(File).optional(), }) type UpdateProjectFormValues = z.infer interface UpdateGtcFileSheetProps { project: ProjectGtcView | null open: boolean onOpenChange: (open: boolean) => void } export function UpdateGtcFileSheet({ project, open, onOpenChange, }: UpdateGtcFileSheetProps) { const [isLoading, setIsLoading] = React.useState(false) const [selectedFile, setSelectedFile] = React.useState(null) const form = useForm({ resolver: zodResolver(updateProjectSchema), defaultValues: { gtcFile: undefined, }, }) // 기존 값 세팅 (프로젝트 변경 시) React.useEffect(() => { if (project) { form.reset({ gtcFile: undefined, }) setSelectedFile(null) } }, [project, form]) // 파일 선택 처리 const handleFileSelect = (event: React.ChangeEvent) => { const file = event.target.files?.[0] if (file) { // PDF 파일만 허용 if (file.type !== 'application/pdf') { toast.error("PDF 파일만 업로드 가능합니다.") return } setSelectedFile(file) form.setValue("gtcFile", file) } } // 폼 제출 핸들러 async function onSubmit(data: UpdateProjectFormValues) { if (!project) { toast.error("프로젝트 정보를 찾을 수 없습니다.") return } setIsLoading(true) try { // GTC 파일이 있으면 업로드 if (data.gtcFile) { const fileResult = await uploadProjectGtcFile(project.id, data.gtcFile) if (!fileResult.success) { toast.error(fileResult.error || "GTC 파일 업로드에 실패했습니다.") return } toast.success("GTC 파일이 성공적으로 업로드되었습니다.") } else { toast.info("변경사항이 없습니다.") } form.reset() setSelectedFile(null) onOpenChange(false) } catch (error) { console.error("GTC 파일 업로드 오류:", error) toast.error("GTC 파일 업로드 중 오류가 발생했습니다.") } finally { setIsLoading(false) } } if (!project) return null return ( GTC 파일 수정 프로젝트 정보는 수정할 수 없으며, GTC 파일만 업로드할 수 있습니다.
{/* 프로젝트 정보 (읽기 전용) */}
프로젝트 코드
프로젝트명
프로젝트 타입
{/* GTC 파일 업로드 */} ( GTC 파일 (PDF만, 선택 시 기존 파일 교체)
)} />
) }