'use client'; import { useState, useTransition } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { Input } from '@workspace/ui/components/input'; import { Textarea } from '@workspace/ui/components/textarea'; import { Button } from '@workspace/ui/components/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@workspace/ui/components/form'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@workspace/ui/components/select'; import { Card, CardContent, CardHeader, CardTitle } from '@workspace/ui/components/card'; import { jobSchema, JobFormData } from './schema'; import { createJob, createCompany } from './actions'; import { Popover, PopoverTrigger, PopoverContent } from '@workspace/ui/components/popover'; import { Calendar } from '@workspace/ui/components/calendar'; import { format } from 'date-fns'; import { Calendar as CalendarIcon } from 'lucide-react'; import { cn } from '@workspace/ui/lib/utils'; function NewJobForm({ companies }: { companies: { id: number; name: string }[] }) { const [success, setSuccess] = useState(false); const [error, setError] = useState(null); const [isPending, startTransition] = useTransition(); const [showModal, setShowModal] = useState(false); const [addingCompany, setAddingCompany] = useState(false); const [companyList, setCompanyList] = useState(companies); const [newCompanyName, setNewCompanyName] = useState(''); const [newCompanyEmail, setNewCompanyEmail] = useState(''); const [newCompanyLink, setNewCompanyLink] = useState(''); const [newCompanyDescription, setNewCompanyDescription] = useState(''); const [newCompanyImageURL, setNewCompanyImageURL] = useState(''); const [companyError, setCompanyError] = useState(null); const form = useForm({ resolver: zodResolver(jobSchema), defaultValues: { companyId: companies[0]?.id ?? 0, title: '', link: '', description: '', location: '', imageURL: '', salary: '', applicationDeadline: new Date(), minCGPA: 0, minSSC: 0, minHSC: 0, allowDeadKT: true, allowLiveKT: true, }, }); async function handleSubmit(formData: FormData) { setError(null); setSuccess(false); startTransition(async () => { const result = await createJob(formData); if (result?.success) { setSuccess(true); form.reset(form.formState.defaultValues); } else { setError(result?.error || 'Failed to create job'); } }); } async function handleAddCompany(e: React.FormEvent) { e.preventDefault(); setCompanyError(null); if (!newCompanyName.trim() || !newCompanyEmail.trim() || !newCompanyLink.trim() || !newCompanyDescription.trim()) return; setAddingCompany(true); const formData = new FormData(); formData.append('name', newCompanyName.trim()); formData.append('email', newCompanyEmail.trim()); formData.append('link', newCompanyLink.trim()); formData.append('description', newCompanyDescription.trim()); formData.append('imageURL', newCompanyImageURL.trim()); const result = await createCompany(formData); if (result?.success && result.company) { setCompanyList((prev) => [...prev, result.company]); form.setValue('companyId', result.company.id); setNewCompanyName(''); setNewCompanyEmail(''); setNewCompanyLink(''); setNewCompanyDescription(''); setNewCompanyImageURL(''); setShowModal(false); } else { setCompanyError(result?.error || 'Failed to add company'); } setAddingCompany(false); } return (
Create a New Job
( Company * )} /> ( Title * )} /> ( Job Link * )} /> ( Description *