/** * ============================================================================= * Job·Ka — Groupe KA * Auteur : Simon-Pierre Boucher * Contact : contact@spboucher.ai * Fichier : frontend/src/fiche/JobHero.tsx * Rôle : Héro de la fiche — logo + employeur · lieu, salaire en exergue * (+ équivalent annuel), capsules (marché, nouveau, offre directe), * titre du poste (H1) + résumé, actions (favoris · partager · * Postuler). Ordre DOM = ordre visuel. * Créé : 2026-09-07 * ============================================================================= */ import { useState } from "react"; import { Job, daysSince, displayTitle, formatSalary, yearlyEquiv } from "../api"; import { Ico, IcoHeart } from "../components/Icons"; import { ComparaisonSalaire, ligneResume } from "./synthese"; import { NBSP } from "./ui"; export function SalaryCapsule({ cmp, short = false }: { cmp: ComparaisonSalaire | null; short?: boolean }) { if (!cmp) return null; return ( {short ? {cmp.court} : <>{cmp.label}{cmp.court}} ); } export function EmployerLogo({ job, size = 56 }: { job: Job; size?: number }) { const [ok, setOk] = useState(true); if (!job.company_logo || !ok) return ; return {`Logo setOk(false)} />; } export default function JobHero({ job, cmp, fav, onFav, onShare, actionsRef }: { job: Job; cmp: ComparaisonSalaire | null; fav: boolean; onFav: () => void; onShare: () => void; actionsRef: React.RefObject; }) { const salaire = formatSalary(job); const yearly = yearlyEquiv(job); const days = daysSince(job.date_posted); const resume = ligneResume(job); return (
{job.employer}{job.location_label ? ` — ${job.location_label}` : job.city ? ` — ${job.city}` : ""}
{salaire ?? Salaire non affiché} {yearly && {yearly}}
{days != null && days <= 3 && {days === 0 ? "Aujourd'hui" : "Nouveau"}} {job.is_direct !== false && Offre directe} {job.active === 0 && Offre retirée} {job.ka_reco && Recommandé pour vous}

{displayTitle(job)} {resume.length > 0 && {resume.join(" · ")}}

Postuler chez {job.employer}

La candidature se fait chez l'employeur{job.ats ? ` (${job.ats})` : ""} — Job·Ka n'est pas un intermédiaire.{NBSP}

); }