/* global React, SERVICES_DATA, POLE_ICONS */
const { useState: useState_r, useMemo: useMemo_r } = React;
const RDV_STEPS = [
{ id: 1, label: "Spécialité" },
{ id: 2, label: "Médecin (optionnel)" },
{ id: 3, label: "Créneau" },
{ id: 4, label: "Coordonnées" },
{ id: 5, label: "Paiement" },
{ id: 6, label: "Confirmation" },
];
const MOCK_DOCTORS = {
default: [
{ name: "Dr. Aïssatou Kpogli", role: "Médecin senior", lang: "FR · EN" },
{ name: "Pr. Mathieu Aklassou", role: "Hospitalo-universitaire", lang: "FR" },
{ name: "Dr. Évariste Dossou", role: "Praticien hospitalier", lang: "FR · EN" },
],
};
const MOCK_SLOTS = ["08:30", "09:00", "09:30", "10:30", "11:00", "11:30", "14:00", "14:30", "15:00", "15:30", "16:00", "16:30"];
function CalendarMini({ value, onChange }) {
const today = new Date();
const [month, setMonth] = useState_r(new Date(today.getFullYear(), today.getMonth(), 1));
const monthLabel = month.toLocaleDateString("fr-FR", { month: "long", year: "numeric" });
const days = useMemo_r(() => {
const arr = [];
const first = new Date(month);
const startDow = (first.getDay() + 6) % 7; // Mon=0
for (let i = 0; i < startDow; i++) arr.push(null);
const last = new Date(month.getFullYear(), month.getMonth() + 1, 0);
for (let d = 1; d <= last.getDate(); d++) arr.push(new Date(month.getFullYear(), month.getMonth(), d));
return arr;
}, [month]);
const isDisabled = (d) => {
if (!d) return true;
const day = d.getDay();
if (day === 0 || day === 6) return true; // closed weekends
const t0 = new Date(); t0.setHours(0,0,0,0);
return d < t0;
};
const dow = ["L", "M", "M", "J", "V", "S", "D"];
return (
{monthLabel}
setMonth(new Date(month.getFullYear(), month.getMonth() - 1, 1))} aria-label="Mois précédent">
setMonth(new Date(month.getFullYear(), month.getMonth() + 1, 1))} aria-label="Mois suivant">
{dow.map((d, i) =>
{d}
)}
{days.map((d, i) => {
if (!d) return
;
const sel = value && d.toDateString() === value.toDateString();
const dis = isDisabled(d);
const we = d.getDay() === 0 || d.getDay() === 6;
return (
onChange(d)}>
{d.getDate()}
);
})}
);
}
function RdvPage({ presetSpecialty }) {
const [step, setStep] = useState_r(1);
const [spec, setSpec] = useState_r(presetSpecialty || null);
const [doctor, setDoctor] = useState_r(null);
const [date, setDate] = useState_r(null);
const [slot, setSlot] = useState_r(null);
const [info, setInfo] = useState_r({ first: "", last: "", phone: "", email: "", reason: "" });
const [mm, setMm] = useState_r(null);
const openSpecs = SERVICES_DATA.filter(s => s.status === "open");
const goNext = () => setStep(s => Math.min(6, s + 1));
const goBack = () => setStep(s => Math.max(1, s - 1));
const canNext =
step === 1 ? !!spec :
step === 2 ? true :
step === 3 ? !!(date && slot) :
step === 4 ? !!(info.first && info.last && info.phone) :
step === 5 ? !!mm :
true;
return (
{/* Hero light */}
Prise de rendez-vous · en ligne
Réservez votre consultation en quelques étapes.
Le CHIC fonctionne exclusivement sur rendez-vous. Consultations du lundi au vendredi, 8h–17h.
Paiement par Mobile Money à la prise de RDV.
L'accès aux consultations et examens se fait uniquement sur rendez-vous.
{" "}Aucun accueil d'urgence n'est possible pour le moment.
{/* Stepper */}
{RDV_STEPS.map((s, i) => {
const state = step === s.id ? "active" : step > s.id ? "done" : "";
return (
{step > s.id ? : s.id}
{s.label}
);
})}
Besoin d’aide ?
Appelez la prise de RDV : +229 01 21 400 111 Lun.–ven., 8h–17h
{/* Form */}
{step === 1 && (
<>
Pour quelle spécialité ?
Sélectionnez parmi les services actuellement ouverts. Les autres seront disponibles prochainement.
{openSpecs.map(s => {
const Icon = POLE_ICONS[s.pole] || IconHeart;
const sel = spec && spec.name === s.name;
return (
setSpec(s)}>
{s.name}
{s.pole}
);
})}
>
)}
{step === 2 && (
<>
Choisir un médecin
Optionnel — vous pouvez laisser l’équipe vous orienter vers le praticien disponible.
setDoctor(null)} style={{minHeight: 120}}>
Sans préférence
Le CHIC m’oriente
{MOCK_DOCTORS.default.map(d => (
setDoctor(d)} style={{minHeight: 120}}>
{d.name}
{d.role} · {d.lang}
))}
>
)}
{step === 3 && (
<>
Choisir un créneau
Le CHIC est ouvert du lundi au vendredi, de 8h à 17h.
{ setDate(d); setSlot(null); }} />
{date ? `Créneaux du ${date.toLocaleDateString("fr-FR", { weekday: "long", day: "numeric", month: "long" })}` : "Sélectionnez une date"}
{date ? (
{MOCK_SLOTS.map(s => (
setSlot(s)}>{s}
))}
) : (
Choisissez d’abord une date à gauche.
)}
>
)}
{step === 4 && (
<>
Vos coordonnées
Nous utilisons ces informations pour confirmer votre rendez-vous et vous joindre si besoin.
>
)}
{step === 5 && (
<>
Paiement Mobile Money
Le règlement de la consultation se fait à la prise de rendez-vous, par Mobile Money.
Spécialité {spec ? spec.name : "—"}
Médecin {doctor ? doctor.name : "Sans préférence"}
Date & heure {date ? date.toLocaleDateString("fr-FR", {weekday:"long", day:"numeric", month:"long"}) : "—"}{slot ? ` · ${slot}` : ""}
Patient {info.first} {info.last}
Montant consultation 25 000 FCFA
Choisir un opérateur
setMm("mtn")}>
MTN
MTN Mobile Money
Vous recevrez un code USSD
setMm("moov")}>
M
Moov Money
Vous recevrez un code USSD
Les Urgences ne sont pas encore ouvertes. En cas d’urgence vitale, appelez le standard +229 01 21 400 100 qui vous orientera.
>
)}
{step === 6 && (
<>
Rendez-vous confirmé.
Un récapitulatif vous a été envoyé par SMS{info.email ? ` et par e-mail à ${info.email}` : ""}.
Référence CHIC-{Math.floor(Math.random()*900000+100000)}
Spécialité {spec ? spec.name : "—"}
Médecin {doctor ? doctor.name : "Sans préférence"}
Date & heure {date ? date.toLocaleDateString("fr-FR", {weekday:"long", day:"numeric", month:"long"}) : "—"}{slot ? ` · ${slot}` : ""}
Patient {info.first} {info.last} · {info.phone}
À savoir
Présentez-vous 20 minutes avant l’heure de votre rendez-vous.
Apportez vos examens et ordonnances antérieurs si applicable.
Le standard d’accueil : +229 01 21 400 100 .
>
)}
{/* Navigation */}
{step < 6 && (
Retour
{step === 5 ? "Confirmer le rendez-vous" : "Continuer"}
)}
{step === 6 && (
Retour à l’accueil
{ setStep(1); setSpec(null); setDoctor(null); setDate(null); setSlot(null); setInfo({first:"",last:"",phone:"",email:"",reason:""}); setMm(null); }}>
Prendre un autre RDV
)}
{/* Documents à préparer + Bon à savoir */}
Documents à préparer
Le jour de votre rendez-vous
Une pièce d'identité avec photo en cours de validité — carte d'identité,
passeport ou à défaut un titre de séjour
Vos documents médicaux — courrier du médecin référent, radiographies,
résultats d'examens, ordonnances en cours
Un moyen de règlement — carte bancaire, espèces ou Mobile Money
Votre carte d'assurance , si vous en disposez *
* La prise en charge sans avance de frais n'est possible que si votre organisme
d'assurance a signé une convention avec le CHIC. Dans le cas contraire, les frais
devront être réglés avant la consultation ou l'examen.
Bon à savoir
Quelques règles d'or
Arrivez 30 minutes avant l'heure du rendez-vous afin de finaliser
votre dossier administratif.
L'accès au site est réservé aux patients ayant un rendez-vous programmé
pour le jour concerné. Vous pouvez être accompagné·e d'un proche si nécessaire.
L'accueil se trouve dans le hall principal, sous l'apatam .
{/* Spécialités & imagerie disponibles */}
Consultations disponibles
Spécialités médicales actuellement accessibles, uniquement sur rendez-vous :
{(window.RDV_SPECIALTIES || []).map(s => (
{s}
))}
Examens d'imagerie disponibles
Sur prescription d'un médecin référent.
{(window.RDV_IMAGING || []).map(s => (
{s}
))}
);
}
window.RdvPage = RdvPage;