| |
| |
| |
| 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<MetaSignupResult> => { |
| return new Promise((resolve, reject) => { |
| if (!window.FB) { |
| return reject(new Error("Le SDK Meta n'est pas chargé.")); |
| } |
|
|
| |
| |
| const collected: Partial<MetaSignupResult> = {}; |
| 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 { |
| |
| } |
| }; |
|
|
| 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' } |
| }); |
| }); |
| }; |
|
|