Untitled
"use client"; import { useState } from "react"; import { TextField, Button, Box, Typography, Paper, FormControl, FormHelperText, Switch, } from "@mui/material"; import { useRouter } from "next/navigation"; export default function NewClient({ user }) { const router = useRouter(); const [formData, setFormData] = useState({ title: "", abstract: "", authors: "", labName: "", advisorName: "", coAuthorNames: "", submissionType: "", forumName: "", forumLevel: "", acceptanceDate: "", }); const [errors, setErrors] = useState({}); const [files, setFiles] = useState({ mainFile: null, proof: null }); const [isPoster, setIsPoster] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const allowedFileTypes = [ "application/pdf", "image/png", "image/jpeg", "image/jpg", ]; const validate = () => { const newErrors = {}; if (!formData.title) newErrors.title = "Title is required"; if (!formData.abstract) newErrors.abstract = "Abstract is required"; if (!formData.authors) newErrors.authors = "Authors are required"; if (!formData.labName) newErrors.labName = "Lab name is required"; if (!formData.advisorName) newErrors.advisorName = "Advisor name is required"; if (!formData.submissionType) newErrors.submissionType = "Submission type is required"; if (!formData.forumName) newErrors.forumName = "Forum name is required"; if (!formData.forumLevel) newErrors.forumLevel = "Forum level is required"; if (!formData.acceptanceDate) newErrors.acceptanceDate = "Acceptance date is required"; if (!files.mainFile) newErrors.mainFile = "Paper file is required"; if (!files.proof) newErrors.proof = "Proof of acceptance is required"; setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleChange = (field) => (e) => { setFormData((prev) => ({ ...prev, [field]: e.target.value })); }; const handleFileChange = (type) => (e) => { const file = e.target.files[0]; if (file && allowedFileTypes.includes(file.type)) { setFiles((prev) => ({ ...prev, [type]: file })); } else { alert("Please upload a valid file type (PDF, PNG, JPG, JPEG)"); } }; const handleSubmit = async (e) => { e.preventDefault(); if (!validate()) return; setIsSubmitting(true); try { const formDataToSend = new FormData(); formDataToSend.append("user_roll_no", user.roll.toString()); formDataToSend.append("title", formData.title); formDataToSend.append("abstract", formData.abstract); formDataToSend.append("authors", formData.authors); formDataToSend.append("file_url", files.mainFile); formDataToSend.append("acceptance_proof", files.proof); formDataToSend.append("is_poster", isPoster); formDataToSend.append("lab_name", formData.labName); formDataToSend.append("advisor_name", formData.advisorName); formDataToSend.append("co_author_names", formData.coAuthorNames); formDataToSend.append("submission_type", formData.submissionType); formDataToSend.append("forum_name", formData.forumName); formDataToSend.append("forum_level", formData.forumLevel); formDataToSend.append("acceptance_date", formData.acceptanceDate); const response = await fetch( `/api/submissions`, { method: "POST", body: formDataToSend, } ); if (response.ok) { router.push(`/applications`); } else { throw new Error("Failed to submit application."); } } catch (error) { alert(error.message); } finally { setIsSubmitting(false); } }; return ( <Box sx={{ p: 6, maxWidth: 1000, mx: "auto", }} > <Paper elevation={0} sx={{ p: 6, borderRadius: 4 }}> <Box sx={{ textAlign: "center", display: "flex", justifyContent: "space-between", }} > <Typography variant="h4" gutterBottom sx={{ fontWeight: 700, fontSize: "1.7rem", textAlign: "center", mb: 4, }} > Submit Your Paper </Typography> <Box> <Switch id="poster" checked={isPoster} onChange={() => setIsPoster((prev) => !prev)} /> <Typography variant="caption" display="block" gutterBottom> Poster </Typography> </Box> </Box> <form onSubmit={handleSubmit}> <FormControl fullWidth margin="normal" error={!!errors.title}> <TextField id="title" value={formData.title} onChange={handleChange("title")} label="Title" variant="outlined" sx={{ fontSize: "1.2rem" }} /> <FormHelperText>{errors.title}</FormHelperText> </FormControl> <FormControl fullWidth margin="normal" error={!!errors.abstract}> <TextField id="abstract" value={formData.abstract} onChange={handleChange("abstract")} label="Abstract" variant="outlined" multiline rows={4} sx={{ fontSize: "1.2rem" }} /> <FormHelperText>{errors.abstract}</FormHelperText> </FormControl> <FormControl fullWidth margin="normal" error={!!errors.authors}> <TextField id="authors" value={formData.authors} onChange={handleChange("authors")} label="Authors" variant="outlined" sx={{ fontSize: "1.2rem" }} /> <FormHelperText>{errors.authors}</FormHelperText> </FormControl> <FormControl fullWidth margin="normal" error={!!errors.labName}> <TextField id="labName" value={formData.labName} onChange={handleChange("labName")} label="Lab Name" variant="outlined" sx={{ fontSize: "1.2rem" }} /> <FormHelperText>{errors.labName}</FormHelperText> </FormControl> <FormControl fullWidth margin="normal" error={!!errors.advisorName}> <TextField id="advisorName" value={formData.advisorName} onChange={handleChange("advisorName")} label="Advisor(s) Name" variant="outlined" sx={{ fontSize: "1.2rem" }} /> <FormHelperText>{errors.advisorName}</FormHelperText> </FormControl> <FormControl fullWidth margin="normal" error={!!errors.coAuthorNames}> <TextField id="coAuthorNames" value={formData.coAuthorNames} onChange={handleChange("coAuthorNames")} label="Co-author Names" variant="outlined" sx={{ fontSize: "1.2rem" }} /> <FormHelperText>{errors.coAuthorNames}</FormHelperText> </FormControl> <FormControl fullWidth margin="normal" error={!!errors.submissionType}> <TextField id="submissionType" value={formData.submissionType} onChange={handleChange("submissionType")} label="Original Submission Type" variant="outlined" helperText="Workshop, Short Paper, Full Paper, Journal, etc." sx={{ fontSize: "1.2rem" }} /> <FormHelperText>{errors.submissionType}</FormHelperText> </FormControl> <FormControl fullWidth margin="normal" error={!!errors.forumName}> <TextField id="forumName" value={formData.forumName} onChange={handleChange("forumName")} label="Conference/Journal/Forum Name" variant="outlined" sx={{ fontSize: "1.2rem" }} /> <FormHelperText>{errors.forumName}</FormHelperText> </FormControl> <FormControl fullWidth margin="normal" error={!!errors.forumLevel}> <TextField id="forumLevel" value={formData.forumLevel} onChange={handleChange("forumLevel")} label="Level of the Forum" variant="outlined" helperText="A*/A/B/Below B/Workshop/Others" sx={{ fontSize: "1.2rem" }} /> <FormHelperText>{errors.forumLevel}</FormHelperText> </FormControl> <FormControl fullWidth margin="normal" error={!!errors.acceptanceDate}> <TextField id="acceptanceDate" type="date" value={formData.acceptanceDate} onChange={handleChange("acceptanceDate")} label="Date of Original Submission Acceptance" variant="outlined" InputLabelProps={{ shrink: true }} sx={{ fontSize: "1.2rem" }} /> <FormHelperText>{errors.acceptanceDate}</FormHelperText> </FormControl> <Box sx={{ mt: 3 }}> <FormControl fullWidth error={!!errors.mainFile}> <input accept=".pdf" type="file" onChange={handleFileChange("mainFile")} style={{ padding: "10px 0", fontSize: "1rem" }} /> <FormHelperText>{errors.mainFile}</FormHelperText> </FormControl> <Typography variant="caption" display="block" gutterBottom> Upload Paper (PDF) </Typography> </Box> <Box sx={{ mt: 3 }}> <FormControl fullWidth error={!!errors.proof}> <input accept=".pdf" type="file" onChange={handleFileChange("proof")} style={{ padding: "10px 0", fontSize: "1rem" }} /> <FormHelperText>{errors.proof}</FormHelperText> </FormControl> <Typography variant="caption" display="block" gutterBottom> Upload Proof of Acceptance (PDF) </Typography> </Box> <Button type="submit" variant="contained" sx={{ mt: 4, p: 2, fontSize: "1.2rem", fontWeight: 700, backgroundColor: "var(--theme-bg-color)", color: "#fff", "&:hover": { backgroundColor: "#0056b3", boxShadow: "0 8px 16px rgba(0, 0, 0, 0.15)", }, }} fullWidth disabled={isSubmitting} > {isSubmitting ? "Submitting..." : "Submit Application"} </Button> </form> </Paper> </Box> ); }
Leave a Comment