// sections2.jsx — Map, Operators, Vision, Payments, Stats, FAQ, Contact, CTA, Footer
const { useState: s2UseState, useEffect: s2UseEffect, useRef: s2UseRef } = React;
// ---------- BURKINA MAP ----------
// Approximate city positions on a stylized map
const BF_CITIES = [
{ id: "ouaga", name: "Ouagadougou", x: 390, y: 220, major: true },
{ id: "bobo", name: "Bobo-Dioulasso", x: 250, y: 285, major: true },
{ id: "koudougou", name: "Koudougou", x: 340, y: 225, major: false },
{ id: "banfora", name: "Banfora", x: 215, y: 320, major: false },
{ id: "ouahigouya", name: "Ouahigouya", x: 310, y: 145, major: false },
{ id: "fada", name: "Fada N'Gourma", x: 470, y: 230, major: false },
{ id: "kaya", name: "Kaya", x: 400, y: 175, major: false },
{ id: "tenkodogo", name: "Tenkodogo", x: 430, y: 290, major: false },
];
const BF_ROUTES = [
["ouaga", "bobo"],
["ouaga", "koudougou"],
["ouaga", "ouahigouya"],
["ouaga", "fada"],
["ouaga", "kaya"],
["ouaga", "tenkodogo"],
["bobo", "banfora"],
["bobo", "koudougou"],
];
function BurkinaMap({ t }) {
const [hovered, setHovered] = s2UseState(null);
const byId = Object.fromEntries(BF_CITIES.map(c => [c.id, c]));
// Real Burkina Faso outline path (simplified from actual borders)
const bfOutline = "M 155 152 L 170 140 L 183 132 L 195 118 L 205 105 L 220 95 L 240 88 L 265 82 L 290 78 L 310 80 L 325 90 L 340 95 L 355 92 L 370 96 L 388 95 L 405 88 L 425 82 L 445 80 L 460 85 L 475 92 L 490 95 L 508 92 L 525 100 L 540 115 L 548 135 L 555 155 L 560 180 L 568 200 L 578 215 L 588 235 L 595 255 L 598 275 L 596 295 L 590 315 L 578 330 L 560 340 L 540 348 L 520 355 L 498 360 L 475 362 L 450 358 L 425 350 L 400 348 L 380 355 L 360 360 L 340 358 L 320 355 L 298 352 L 278 350 L 258 345 L 240 338 L 220 325 L 205 310 L 190 292 L 175 275 L 165 255 L 155 230 L 148 205 L 148 180 L 150 165 Z";
return (
{/* Legend */}
Grandes villes
Villes régionales
Routes desservies
);
}
function Destinations({ t }) {
return (
{t.destinations.eyebrow}
{t.destinations.title}
{t.destinations.sub}
{t.destinations.cities.map((c, i) => (
))}
);
}
// ---------- STATS BANDEAU ----------
function StatsStrip({ t }) {
return (
{t.stats.map((s, i) => (
))}
);
}
// ---------- OPERATORS ----------
function Operators({ t, onNotify, onPartner }) {
return (
{t.operators.eyebrow}
{t.operators.title}
{t.operators.lead}
{/* Dashboard mockup */}
TABLEAU DE BORD · STAF
Live
{/* Mini chart */}
{t.operators.benefits.map((b, i) => (
))}
{/* Partenaires transporteurs */}
{t.operators.partnersLabel}
{t.operators.partnersNote}
{t.operators.partnersList.map((p, i) => (
{p.n.slice(0, 3).toUpperCase()}
))}
);
}
// ---------- VISION ----------
function Vision({ t }) {
return (
{t.vision.eyebrow}
{t.vision.title}
{t.vision.lead}
{/* Phases */}
{/* Timeline line */}
{t.vision.phases.map((p, i) => {
const isLeft = i % 2 === 0;
const color = ["#dc2626", "#f59e0b", "#16a34a", "#fbbf24"][i];
return (
0{i+1}
Phase {i+1} · {p.tag}
{p.t}
{p.d}
);
})}
{/* Founder */}
{t.vision.founderIntro}
« Nous ne vendons pas des billets. Nous rendons l'Afrique plus proche. »
NY
{t.vision.founder}
{t.vision.founderRole}
);
}
// ---------- PAYMENTS ----------
function Payments({ t }) {
const icons = [
{ name: "Orange Money", color: "#ff6600", text: "OM" },
{ name: "Moov Money", color: "#0066cc", text: "MM" },
{ name: "Wave", color: "#1dc8f5", text: "W" },
{ name: "Visa", color: "#1a1f71", text: "VISA" },
{ name: "Mastercard", color: "#eb001b", text: "MC" },
];
return (
{t.payments.eyebrow}
{t.payments.title}
{icons.map((m, i) => (
))}
);
}
// ---------- FAQ ----------
function FAQ({ t }) {
const [open, setOpen] = s2UseState(null);
return (
{t.faq.eyebrow}
{t.faq.title}
{t.faq.items.map((it, i) => (
setOpen(open === i ? null : i)} data-hover>
{it.q}
+
{it.a}
))}
);
}
// ---------- CTA + Contact ----------
function FinalCTA({ t, onNotify, lang }) {
const waLink = `https://wa.me/${(t.contact.phone || "+22600000000").replace(/[^\d]/g, "")}`;
return (
);
}
// ---------- FOOTER ----------
function Footer({ t }) {
return (
);
}
// ---------- Agent WhatsApp (réservation par chat) ----------
// Numéro WhatsApp Business officiel de FasoTravel, format international SANS « + ».
// WA-AGENT (déploiement — 2026-06-18) : numéro officiel posé. NB : le webhook de
// l'agent IA n'est réellement actif qu'en Phase 3 (WABA prod — RCCM/IFU).
const WA_AGENT_NUMBER = "22651591414";
function WhatsAppAgent({ t, lang, onNotify }) {
const a = (t && t.agent) || {};
const waUrl =
`https://wa.me/${WA_AGENT_NUMBER.replace(/[^\d]/g, "")}` +
`?text=${encodeURIComponent(a.prefill || "Bonjour FasoTravel")}`;
const points = a.points || [];
const thread = a.thread || [];
const WaGlyph = ({ size = 22 }) => (
);
return (
{/* Colonne texte + CTA */}
{a.badge}
{a.eyebrow}
{a.title}
{a.lead}
{points.map((p, i) => (
))}
{/* Colonne aperçu conversation (mockup WhatsApp) */}
{a.chatName || "FasoTravel"}
{a.chatStatus}
{thread.map((m, i) => {
if (m.kind === "chips") {
return (
{(m.items || []).map((c, j) => {c})}
);
}
if (m.kind === "ticket") {
return (
🎟️{m.text}
);
}
const out = m.from === "user";
return (
{m.text}{out && ✓✓}
);
})}
);
}
Object.assign(window, { BurkinaMap, Destinations, StatsStrip, Operators, Vision, Payments, FAQ, FinalCTA, Footer, WhatsAppAgent });