// src/components/VacancyApplicationForm.tsx (Example structure and styling) "use client"; // This likely needs to be a client component for form handling import React, { useState, useCallback, ChangeEvent, DragEvent } from "react"; import { FaUpload, FaFileAlt, FaTimes } from "react-icons/fa"; // Import icons interface VacancyApplicationFormProps { vacancyId: string; vacancyTitle: string; // onFormClose?: () => void; // Optional: If you add a close button } export default function VacancyApplicationForm({ vacancyId, vacancyTitle, }: VacancyApplicationFormProps) { const [formData, setFormData] = useState({ name: "", email: "", phone: "", linkedin: "", coverLetter: "", // Add other fields as needed }); const [resumeFile, setResumeFile] = useState(null); const [isDragging, setIsDragging] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const [submitStatus, setSubmitStatus] = useState< "idle" | "success" | "error" >("idle"); const handleInputChange = ( e: ChangeEvent ) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); }; // --- File Input Handling --- const handleFileChange = (e: ChangeEvent) => { if (e.target.files && e.target.files.length > 0) { setResumeFile(e.target.files[0]); e.target.value = ""; // Reset input value for potential re-upload } }; const handleDragEnter = useCallback((e: DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(true); }, []); const handleDragLeave = useCallback((e: DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); }, []); const handleDragOver = useCallback( (e: DragEvent) => { e.preventDefault(); // Necessary to allow drop e.stopPropagation(); if (!isDragging) setIsDragging(true); // Ensure state is true while over }, [isDragging] ); const handleDrop = useCallback((e: DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); if (e.dataTransfer.files && e.dataTransfer.files.length > 0) { setResumeFile(e.dataTransfer.files[0]); e.dataTransfer.clearData(); } }, []); const removeFile = () => { setResumeFile(null); }; // --- End File Input Handling --- const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); setSubmitStatus("idle"); const data = new FormData(); data.append("vacancyId", vacancyId); data.append("vacancyTitle", vacancyTitle); data.append("name", formData.name); data.append("email", formData.email); data.append("phone", formData.phone); data.append("linkedin", formData.linkedin); data.append("coverLetter", formData.coverLetter); if (resumeFile) { data.append("resume", resumeFile, resumeFile.name); } try { // Replace with your actual API endpoint for form submission const response = await fetch("/api/apply", { method: "POST", body: data, // FormData handles multipart/form-data automatically }); if (!response.ok) { throw new Error("Submission failed"); } setSubmitStatus("success"); // Optionally reset form: // setFormData({ name: '', email: '', ... }); // setResumeFile(null); // Optionally close form: onFormClose?.(); } catch (error) { console.error("Application submission error:", error); setSubmitStatus("error"); } finally { setIsSubmitting(false); } }; // --- Base Input Styling --- const inputBaseStyle = "block w-full px-4 py-2 mt-1 text-gray-700 bg-white border border-gray-300 rounded-md focus:border-gold-500 focus:ring focus:ring-gold-500 focus:ring-opacity-50 dark:bg-gray-800 dark:text-gray-300 dark:border-gray-600 dark:focus:border-gold-500 font-poppins"; return (
{/* Example Fields */}
{/* --- Styled File Upload Area --- */}
document.getElementById("resume-upload")?.click()} // Trigger hidden input > {/* Hidden Actual Input */} {/* Visual Cue */}

{isDragging ? "Drop file here" : "Drag & drop your file here"}

or click to browse

(PDF, DOC, DOCX, TXT)

{/* Display Selected File */} {resumeFile && (
{resumeFile.name} ({(resumeFile.size / 1024).toFixed(1)} KB)
)}
{/* --- End File Upload Area --- */}
{/* Submit Button & Status */}
{submitStatus === "success" && (

Application submitted successfully!

)} {submitStatus === "error" && (

Submission failed. Please try again.

)}
); }