UNPKG

@omnizapi/connect

Version:

Omnizapi SDK for browser applications

71 lines (63 loc) • 2.97 kB
/** * Sandbox URLs must point to your deployed API and connection frontend. * Load after these elements; both buttons use the same Meta WhatsApp channel: * <button type="button" data-omnizapi-connect>Connect with default flow</button> * <button type="button" data-omnizapi-connect data-direct="true">Connect directly</button> * <p id="status" role="status"></p> * Channel config or the connection frontend origin may select native signup * even with direct: false, and direct: true degrades to the proxy flow when * this page cannot run the native setup (for example a conflicting or unknown * host Meta SDK). Only native login still awaiting its FB.login callback * blocks another native attempt: wait for that callback or reload the page. * Native signup still needs real-browser testing with the Meta SDK's user gesture. */ import Omnizapi, { Environment, OmnizapiError } from "@omnizapi/connect"; import type { OmnizapiClient } from "@omnizapi/connect"; let client: OmnizapiClient | undefined; if (typeof document !== "undefined") { const buttons = document.querySelectorAll<HTMLButtonElement>("[data-omnizapi-connect]"); const statusElement = document.querySelector<HTMLElement>("#status"); if (statusElement) { buttons.forEach((button) => { button.addEventListener("click", async () => { if (button.disabled) return; buttons.forEach((item) => { item.disabled = true; }); statusElement.textContent = "Connecting..."; try { client ??= Omnizapi.newClient({ publicKey: "your-public-key", logo: "https://app.example.com/logo.png", environment: Environment.SANDBOX, apiUrl: "https://api.example.com", frontUrl: "https://connect.example.com", }); const result = await client.connect({ channelId: "your-meta-whatsapp-channel-id", direct: button.dataset.direct === "true", timeoutMs: 5 * 60 * 1000, }); if (!result.success) { statusElement.textContent = `Connection not completed (${result.reason}).`; return; } const response = await fetch("/api/connect-channel", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(result), }); if (!response.ok) { statusElement.textContent = "The backend could not finalize the connection."; return; } statusElement.textContent = "Channel connected!"; } catch (error) { statusElement.textContent = error instanceof OmnizapiError ? `Connection error (${error.code}). Check the integration before retrying.` : "Could not confirm the connection. Check its backend status before retrying."; } finally { buttons.forEach((item) => { item.disabled = false; }); } }); }); } }