import InputError from '@/components/input-error'; import LoadingButton from '@/components/loading-button'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Label } from '@/components/ui/label'; import { Separator } from '@/components/ui/separator'; import { useForm } from '@inertiajs/react'; import { AlertCircle, Calendar, CheckCircle2, Clock, FileText, Upload, XCircle } from 'lucide-react'; import { useState } from 'react'; import { Editor } from 'richtor'; import 'richtor/styles'; interface Props { assignment: CourseAssignment; submissions?: AssignmentSubmission[]; } const AssignmentSubmission = ({ assignment, submissions = [] }: Props) => { const [selectedFile, setSelectedFile] = useState(null); const latestSubmission = submissions.length > 0 ? submissions[0] : null; const { data, setData, post, reset, errors, processing } = useForm({ course_assignment_id: assignment.id, submission_text: '', attachment: null as File | null, }); const handleFileChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0] || null; setSelectedFile(file); setData('attachment', file); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); post('/dashboard/assignment/submission', { onSuccess: () => { reset(); setSelectedFile(null); }, }); }; const isDeadlinePassed = assignment.deadline ? new Date(assignment.deadline) < new Date() : false; const isLateDeadlinePassed = assignment.late_deadline ? new Date(assignment.late_deadline) < new Date() : false; const canSubmit = !isDeadlinePassed || (assignment.late_submission && !isLateDeadlinePassed); const remainingAttempts = assignment.retake - submissions.length; const getStatusBadge = (status: string) => { switch (status) { case 'graded': return ( Graded ); case 'pending': return ( Pending ); case 'late': return ( Late Submission ); default: return ( {status} ); } }; return (
{/* Assignment Details */} {assignment.title} {assignment.summary &&
}

Deadline

{assignment.deadline ? new Date(assignment.deadline).toLocaleString() : 'No deadline'}

Total Marks

{assignment.total_mark} (Pass: {assignment.pass_mark})

Attempts

{submissions.length} / {assignment.retake}

{assignment.late_submission && (

Late Deadline

{assignment.late_deadline ? new Date(assignment.late_deadline).toLocaleString() : 'N/A'}

)}
{/* Latest Submission Status */} {latestSubmission && ( Latest Submission
Status: {getStatusBadge(latestSubmission.status)} Attempt {latestSubmission.attempt_number} of {assignment.retake}
{latestSubmission.marks_obtained !== null && (

Grade: {latestSubmission.marks_obtained} / {assignment.total_mark}

)} {latestSubmission.instructor_feedback && (

Instructor Feedback:

{latestSubmission.instructor_feedback}

)}
)} {/* Submission Form */} {canSubmit && remainingAttempts > 0 ? ( Submit Assignment {isDeadlinePassed && assignment.late_submission ? `Late submission allowed until ${new Date(assignment.late_deadline!).toLocaleString()}` : `You have ${remainingAttempts} attempt(s) remaining`}
setData((prev) => ({ ...prev, submission_text: value as string, })) } />
{selectedFile && (
{selectedFile.name}
)}
Submit Assignment
) : ( Cannot Submit {remainingAttempts <= 0 ? 'You have used all your attempts for this assignment.' : 'The deadline for this assignment has passed.'} )} {/* Submission History */} {submissions.length > 0 && ( Submission History View all your previous submissions
{submissions.map((submission, index) => (
{index > 0 && }

Attempt {submission.attempt_number}

Submitted: {submission.submitted_at ? new Date(submission.submitted_at).toLocaleString() : 'N/A'}

{getStatusBadge(submission.status)}
{submission.attachment_name && (
{submission.attachment_name}
)} {submission.marks_obtained !== null && (

Grade: {submission.marks_obtained} / {assignment.total_mark}

{submission.instructor_feedback && (

{submission.instructor_feedback}

)}
)}
))}
)}
); }; export default AssignmentSubmission;