/** * Utility for WhatsApp Embedded Signup via Meta SDK */ import { logWarn } from './logger'; declare global { interface Window { FB: any; fbAsyncInit: () => void; } } const META_APP_ID = import.meta.env.VITE_META_APP_ID; export const initMetaSDK = () => { if (!META_APP_ID) { logWarn("[META-SDK] VITE_META_APP_ID is missing. Embedded signup will not work."); return; } const initOptions = { appId : META_APP_ID, cookie : true, xfbml : true, version: 'v22.0' }; if (window.FB) { window.FB.init(initOptions); } else { window.fbAsyncInit = function() { window.FB.init(initOptions); }; } }; export interface MetaSignupResult { code: string; waba_id: string; phone_number_id: string; } export const launchEmbeddedSignup = (): Promise => { return new Promise((resolve, reject) => { if (!window.FB) { return reject(new Error("Le SDK Meta n'est pas chargé.")); } // Collect both the OAuth code (from FB.login) and the WABA/phone IDs // (from WA_EMBEDDED_SIGNUP_EVENT) before resolving — they arrive independently. const collected: Partial = {}; let settled = false; const tryResolve = () => { if (settled) return; if (collected.code && collected.waba_id && collected.phone_number_id) { settled = true; window.removeEventListener('message', sessionHandler); resolve(collected as MetaSignupResult); } }; const sessionHandler = (event: MessageEvent) => { if (event.origin !== "https://www.facebook.com") return; try { const data = JSON.parse(event.data as string); if (data.type === 'WA_EMBEDDED_SIGNUP_EVENT') { if (data.event === 'FINISH') { collected.waba_id = data.data.waba_id; collected.phone_number_id = data.data.phone_number_id; tryResolve(); } else if (data.event === 'CANCEL' && !settled) { settled = true; window.removeEventListener('message', sessionHandler); reject(new Error("L'utilisateur a annulé l'onboarding.")); } } } catch { // Not our event } }; window.addEventListener('message', sessionHandler); window.FB.login((response: any) => { if (response.authResponse?.code) { collected.code = response.authResponse.code; tryResolve(); } else if (!settled) { settled = true; window.removeEventListener('message', sessionHandler); reject(new Error("Connexion Facebook échouée ou annulée.")); } }, { config_id: import.meta.env.VITE_META_CONFIG_ID || '', response_type: 'code', override_default_response_type: true, scope: 'whatsapp_business_management,whatsapp_business_messaging', extras: { feature: 'whatsapp_embedded_signup' } }); }); };