import { FC, ReactElement, useState } from 'react'; import { ControlledInputField } from '@imphnen-frontend-service/ui/organisms'; import { Button, Textarea } from '@imphnen-frontend-service/ui/atoms'; import { useNavigate, useParams } from 'react-router'; import { useForm, Controller } from 'react-hook-form'; import { projectSubmissionSchema, TProjectSubmissionForm, useSubmitProject, useTeamById, useTeamSubmission, useUploadFile, useAuthStore, } from '@imphnen-frontend-service/service'; import { zodResolver } from '@hookform/resolvers/zod'; const SubmitProjectPage: FC = (): ReactElement => { const { teamId } = useParams<{ teamId: string }>(); const navigate = useNavigate(); const { session } = useAuthStore(); const [showConfirmModal, setShowConfirmModal] = useState(false); const [screenshots, setScreenshots] = useState([]); const { data: teamData } = useTeamById(teamId || ''); const { data: submissionData } = useTeamSubmission(teamId || '', !!teamId); const { mutateAsync: submitProject, isPending: isSubmitting } = useSubmitProject(teamId || ''); const { mutateAsync: uploadFile, isPending: isUploading } = useUploadFile(); const team = teamData?.data; const currentUserId = session?.user?.id; const isLeader = currentUserId === team?.leader_id; const hasSubmission = !!submissionData?.data; const form = useForm({ resolver: zodResolver(projectSubmissionSchema), mode: 'all', }); if (!isLeader) { return (

Access Denied

Only the team leader can submit projects

); } if (hasSubmission) { return (

Project Already Submitted

Your team has already submitted a project

); } const handleScreenshotUpload = async ( e: React.ChangeEvent ) => { const files = e.target.files; if (!files) return; try { const uploadPromises = Array.from(files).map((file) => uploadFile(file)); const results = await Promise.all(uploadPromises); const urls = results.map((r) => r.data.url); setScreenshots([...screenshots, ...urls]); } catch (error) { console.error('Failed to upload screenshots:', error); } }; const removeScreenshot = (index: number) => { setScreenshots(screenshots.filter((_, i) => i !== index)); }; const onSubmit = form.handleSubmit(async (data) => { try { await submitProject({ ...data, screenshots, }); navigate(`/teams/${teamId}/submission`); } catch (error) { console.error('Failed to submit project:', error); } }); return (

Submit Project

{team?.name}

{/* Warning Banner */}
⚠️

IMPORTANT WARNING

  • • You can only submit your project ONCE
  • • After submission, you CANNOT edit or change anything
  • • Make sure all information is correct before submitting
  • • Review your project details carefully
{ e.preventDefault(); setShowConfirmModal(true); }} className="space-y-6" > {/* Project Name */} {/* Description */}
(