// Call sheet — confirmation avant d'ouvrir l'application Téléphone. // // Pourquoi une confirmation plutôt qu'un `tel:` direct sur le bouton Appeler : // un `tel:` posé sur l'action elle-même part au premier tap, et en démo sur // Mac ça ouvre FaceTime par-dessus l'app. Ici le premier tap n'ouvre qu'une // feuille — le lien réel n'est atteint qu'au second, délibéré. Sur un vrai // iPhone le comportement reste celui attendu : l'appel se lance. // // Même architecture que ToastStore : un store hors React, appelable de // n'importe où sans provider ni prop drilling. const CS_VT = window.VT || {}; const CS_INK = CS_VT.ink || '#0a0a0a'; const CS_SUB = CS_VT.sub || '#6b7280'; const CS_SURF = CS_VT.surface || '#ffffff'; const CS_HAIR2 = CS_VT.hair2 || 'rgba(10,10,10,0.10)'; const CS_MED = CS_VT.medBlue || '#3d6b8f'; const CS_MED_TINT = CS_VT.medBlueTint || 'rgba(61,107,143,0.10)'; const CS_OK = CS_VT.success || '#059669'; const CallStore = { target: null, listeners: new Set(), subscribe(fn) { this.listeners.add(fn); return () => this.listeners.delete(fn); }, open(name, phone) { this.target = { name: name || 'ce patient', phone: phone || '' }; this.listeners.forEach((fn) => fn(this.target)); }, close() { this.target = null; this.listeners.forEach((fn) => fn(null)); }, }; // API publique : requestCall('Martin Jean', '06 88 41 09 22') function requestCall(name, phone) { if (!phone) { showToast(`Aucun numéro enregistré pour ${name || 'ce patient'}`, 'error'); return; } CallStore.open(name, phone); } function CallHost() { const [target, setTarget] = React.useState(CallStore.target); React.useEffect(() => CallStore.subscribe(setTarget), []); if (!target) return null; // Les numéros mockés sont écrits avec des espaces ; tel: veut du brut. const dial = `tel:${String(target.phone).replace(/[^\d+]/g, '')}`; return ( <>