diff --git a/docs/publicar-vaga-routes.md b/docs/publicar-vaga-routes.md new file mode 100644 index 0000000..67adb68 --- /dev/null +++ b/docs/publicar-vaga-routes.md @@ -0,0 +1,12 @@ +# Rotas de publicar vaga (frontend) + +As principais rotas usadas para publicar vagas no projeto são: + +1. `/publicar-vaga` — landing/formulário público de anúncio de vaga. +2. `/post-job` — fluxo principal multi-etapas para publicação com dados da empresa e da vaga. +3. `/register/job` — formulário público alternativo para criação de vaga. + +## Pontos de entrada no sistema + +- Link para `/publicar-vaga` na página **About** e no **Footer**. +- Link para `/post-job` na página **Contact**. diff --git a/frontend/src/app/dashboard/jobs/new/page.tsx b/frontend/src/app/dashboard/jobs/new/page.tsx index c31277c..642716a 100644 --- a/frontend/src/app/dashboard/jobs/new/page.tsx +++ b/frontend/src/app/dashboard/jobs/new/page.tsx @@ -1,330 +1,5 @@ -"use client" +import { redirect } from "next/navigation" -import { useState, useEffect } from "react" -import { useRouter } from "next/navigation" -import { Button } from "@/components/ui/button" -import { Input } from "@/components/ui/input" -import { Label } from "@/components/ui/label" -import { Textarea } from "@/components/ui/textarea" -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" -import { Separator } from "@/components/ui/separator" -import { ArrowLeft, Loader2, Building2, DollarSign, FileText, Briefcase, MapPin, Clock } from "lucide-react" -import { jobsApi, adminCompaniesApi, type CreateJobPayload, type AdminCompany } from "@/lib/api" -import { useTranslation } from "@/lib/i18n" -import { toast } from "sonner" - -export default function NewJobPage() { - const router = useRouter() - const { t } = useTranslation() - const [isSubmitting, setIsSubmitting] = useState(false) - const [companies, setCompanies] = useState([]) - const [loadingCompanies, setLoadingCompanies] = useState(true) - - const [formData, setFormData] = useState({ - // Job Details - title: "", - description: "", - location: "", - // Salary - salaryMin: "", - salaryMax: "", - salaryType: "monthly", - currency: "BRL", - employmentType: "", - workingHours: "", - // Company - companyId: "", - // Status - status: "draft" as "draft" | "published", - }) - - useEffect(() => { - const loadCompanies = async () => { - try { - setLoadingCompanies(true) - const data = await adminCompaniesApi.list(undefined, 1, 100) - setCompanies(data.data ?? []) - } catch (error) { - console.error("Failed to load companies:", error) - toast.error("Failed to load companies") - } finally { - setLoadingCompanies(false) - } - } - loadCompanies() - }, []) - - const updateField = (field: string, value: string | boolean) => { - setFormData(prev => ({ ...prev, [field]: value })) - } - - const canSubmit = () => { - return formData.title.length >= 5 && - formData.description.length >= 20 && - formData.companyId !== "" - } - - const handleSubmit = async (publishNow: boolean = false) => { - if (!canSubmit()) { - toast.error("Please fill in all required fields") - return - } - - setIsSubmitting(true) - try { - const payload: CreateJobPayload = { - companyId: formData.companyId, - title: formData.title, - description: formData.description, - location: formData.location || undefined, - employmentType: formData.employmentType as CreateJobPayload['employmentType'] || undefined, - salaryMin: formData.salaryMin ? parseFloat(formData.salaryMin) : undefined, - salaryMax: formData.salaryMax ? parseFloat(formData.salaryMax) : undefined, - salaryType: formData.salaryType as CreateJobPayload['salaryType'] || undefined, - currency: formData.currency as CreateJobPayload['currency'] || undefined, - workingHours: formData.workingHours || undefined, - status: publishNow ? "published" : "draft", - } - - await jobsApi.create(payload) - toast.success(publishNow ? "Job published successfully!" : "Job saved as draft!") - router.push("/dashboard/jobs") - } catch (error) { - console.error("Failed to create job:", error) - toast.error("Failed to create job. Please try again.") - } finally { - setIsSubmitting(false) - } - } - - return ( -
- {/* Header */} -
- -
-

{t('admin.jobs.newJob')}

-

{t('admin.jobs.edit.subtitle')}

-
-
- - {/* Job Details Section */} - - - - - {t('admin.jobs.details.title')} - - {t('admin.jobs.details.description')} - - -
- - updateField("title", e.target.value)} - /> - {formData.title.length > 0 && formData.title.length < 5 && ( -

Title must be at least 5 characters

- )} -
-
- -