/** * ============================================================================= * Job·Ka — Groupe KA * Auteur : Simon-Pierre Boucher * Contact : contact@spboucher.ai * Fichier : frontend/src/pages/Employeurs.tsx * Rôle : Page « Publier une offre » — dépôt direct par les employeurs * (POST /api/employeurs/offres, modération avant publication) * Créé : 2026-08-18 Modifié : 2026-08-22 * ============================================================================= */ import { FormEvent, useEffect, useState } from "react"; interface FormState { employer: string; contact_email: string; title: string; city: string; url: string; salary_label: string; employment_type: string; work_mode: string; description: string; website: string; // pot de miel anti-robots (doit rester vide) } const EMPTY: FormState = { employer: "", contact_email: "", title: "", city: "", url: "", salary_label: "", employment_type: "", work_mode: "", description: "", website: "", }; export default function EmployeursPage() { const [form, setForm] = useState(EMPTY); const [sending, setSending] = useState(false); const [done, setDone] = useState(null); const [err, setErr] = useState(null); useEffect(() => { document.title = "Publier une offre | Job-Ka — Un service Groupe KA"; window.scrollTo(0, 0); }, []); const set = (k: keyof FormState) => (e: React.ChangeEvent) => setForm((f) => ({ ...f, [k]: e.target.value })); const submit = (e: FormEvent) => { e.preventDefault(); setSending(true); setErr(null); fetch("/api/employeurs/offres", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ...form, employment_type: form.employment_type || null, work_mode: form.work_mode || null, }), }) .then(async (r) => { if (!r.ok) { const body = await r.json().catch(() => null); throw new Error(body?.detail?.[0]?.msg ?? body?.detail ?? `Erreur ${r.status}`); } return r.json(); }) .then((d) => { setDone(d.message ?? "Offre reçue — merci !"); setForm(EMPTY); }) .catch((ex) => setErr(String(ex?.message ?? ex))) .finally(() => setSending(false)); }; return (
Employeurs

Publiez votre offre directement

Job-Ka référence les offres à la source : pages carrières des employeurs québécois d'abord, portails ensuite. Vous êtes un employeur sans page carrière connectée ? Déposez votre offre ici — elle est vérifiée par notre équipe avant publication, puis affichée avec le badge « Offre directe employeur ». C'est gratuit.

  • Votre offre reste traçable : elle renvoie vers votre site si vous fournissez un lien.
  • Si votre entreprise utilise un ATS (Workday, Lever, Njoyn, Taleo…), écrivez-nous : nous pouvons connecter votre page carrière et synchroniser toutes vos offres automatiquement.
  • Le courriel de contact sert uniquement à la modération — il n'est jamais affiché.
{done ? (

Offre reçue ✓

{done}

) : (