import { ArrowDown, ArrowUp, Plus, Sparkles, Trash2 } from "lucide-react"; import { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { Button, ErrorNote, Field, Input, Panel, Select, Spinner, Textarea, useCatalog } from "../components/ui"; import { api, type Job, type PlanQuestion } from "../lib/api"; import { useI18n } from "../lib/i18n"; export default function JobEditor() { const { id } = useParams(); const { t, lang } = useI18n(); const catalog = useCatalog(); const nav = useNavigate(); const [loaded, setLoaded] = useState(!id); const [title, setTitle] = useState(""); const [track, setTrack] = useState("data_engineering"); const [level, setLevel] = useState("junior"); const [desc, setDesc] = useState(""); const [secs, setSecs] = useState(120); const [status, setStatus] = useState("open"); const [qs, setQs] = useState([{ text: "" }]); const [location, setLocation] = useState(""); const [workMode, setWorkMode] = useState("onsite"); const [empType, setEmpType] = useState("full_time"); const [salary, setSalary] = useState(""); const [skills, setSkills] = useState(""); const [deadline, setDeadline] = useState(""); const [visibility, setVisibility] = useState("public"); const [requireCamera, setRequireCamera] = useState(false); const [recordVideo, setRecordVideo] = useState(false); const [busy, setBusy] = useState(false); const [suggesting, setSuggesting] = useState(false); const [error, setError] = useState(null); useEffect(() => { if (!id) return; api.get(`/jobs/${id}`).then((j) => { setTitle(j.title); setTrack(j.track); setLevel(j.level); setDesc(j.description || ""); setSecs(j.answer_seconds); setStatus(j.status); setQs(j.questions.length ? j.questions : [{ text: "" }]); setLocation(j.location || ""); setWorkMode(j.work_mode); setEmpType(j.employment_type); setSalary(j.salary || ""); setSkills((j.skills || []).join(", ")); setDeadline(j.deadline || ""); setVisibility(j.visibility); setRequireCamera(!!j.require_camera); setRecordVideo(!!j.record_video); setLoaded(true); }); }, [id]); const suggest = async () => { setSuggesting(true); setError(null); try { const r = await api.post<{ questions: PlanQuestion[] }>("/questions/generate", { track, level, interview_type: "mixed", count: 6, custom_role: title, jd_text: desc }); setQs((cur) => [...cur.filter((x) => x.text.trim()), ...r.questions]); } catch (e: any) { setError(e.message); } finally { setSuggesting(false); } }; const move = (i: number, d: number) => setQs((cur) => { const n = [...cur]; const j = i + d; if (j < 0 || j >= n.length) return n; [n[i], n[j]] = [n[j], n[i]]; return n; }); const save = async () => { setBusy(true); setError(null); try { const body = { title, track, level, description: desc, answer_seconds: secs, status, questions: qs.filter((x) => x.text.trim()), location: location.trim() || null, work_mode: workMode, employment_type: empType, salary: salary.trim() || null, skills: skills.split(/[,،\n]/).map((x) => x.trim()).filter(Boolean), deadline: deadline || null, visibility, require_camera: requireCamera || recordVideo, record_video: recordVideo, }; const j = id ? await api.put(`/jobs/${id}`, body) : await api.post("/jobs", body); nav(`/app/jobs/${j.id}`); } catch (e: any) { setError(e.message); setBusy(false); } }; if (!loaded || !catalog) return ; const levels = ["intern", "junior", "mid", "senior", "lead"]; return (

{id ? title : t("new_job")}

setTitle(e.target.value)} placeholder="Junior Data Engineer" /> ({ value: l, label: t(`lv_${l}` as "lv_junior") }))} />
setStatus(v as Job["status"])} options={(["open", "draft", "closed"] as const).map((s) => ({ value: s, label: t(`jst_${s}`) }))} />
setLocation(e.target.value)} placeholder={t("location_ph")} />
setEmpType(v as Job["employment_type"])} options={(["full_time", "part_time", "internship", "contract"] as const).map((m) => ({ value: m, label: t(`et_${m}`) }))} />
setSalary(e.target.value)} placeholder={t("salary_ph")} /> setDeadline(e.target.value)} />
setSkills(e.target.value)} placeholder={t("skills_ph")} dir="ltr" />