edtech / apps /admin /src /lib /meta-signup.ts
CognxSafeTrack
fix: upgrade Meta Graph API from deprecated v18/v19 to v22.0
b25d16e
/**
* 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<MetaSignupResult> => {
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<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 {
// 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' }
});
});
};