@formbricks/js
Version:
Formbricks-js allows you to connect your index to Formbricks, display surveys and trigger events.
93 lines (92 loc) • 3.09 kB
JavaScript
let isInitializing = false;
let isInitialized = false;
const loadFormbricksSDK = async (apiHostParam) => {
if (!window.formbricks) {
const scriptTag = document.createElement("script");
scriptTag.type = "text/javascript";
scriptTag.src = `${apiHostParam}/js/formbricks.umd.cjs`;
scriptTag.async = true;
const getFormbricks = async () => new Promise((resolve, reject) => {
const timeoutId = setTimeout(() => {
reject(new Error(`Formbricks SDK loading timed out`));
}, 1e4);
scriptTag.onload = () => {
clearTimeout(timeoutId);
resolve();
};
scriptTag.onerror = () => {
clearTimeout(timeoutId);
reject(new Error(`Failed to load Formbricks SDK`));
};
});
document.head.appendChild(scriptTag);
try {
await getFormbricks();
return { ok: true, data: void 0 };
} catch (error) {
const err = error;
return {
ok: false,
error: new Error(err.message ?? `Failed to load Formbricks SDK`)
};
}
}
return { ok: true, data: void 0 };
};
const functionsToProcess = [];
const loadFormbricksToProxy = async (prop, ...args) => {
if (!isInitialized) {
if (prop === "setup") {
if (isInitializing) {
console.warn("🧱 Formbricks - Warning: Formbricks is already initializing.");
return;
}
isInitializing = true;
const argsTyped = args[0];
const { appUrl, environmentId } = argsTyped;
if (!appUrl) {
console.error("🧱 Formbricks - Error: appUrl is required");
return;
}
if (!environmentId) {
console.error("🧱 Formbricks - Error: environmentId is required");
return;
}
const loadSDKResult = await loadFormbricksSDK(appUrl);
if (loadSDKResult.ok) {
if (window.formbricks) {
const formbricksInstance = window.formbricks;
void formbricksInstance.setup(...args);
isInitializing = false;
isInitialized = true;
for (const { prop: functionProp, args: functionArgs } of functionsToProcess) {
if (typeof formbricksInstance[functionProp] !== "function") {
console.error(`🧱 Formbricks - Error: Method ${functionProp} does not exist on formbricks`);
continue;
}
formbricksInstance[functionProp](...functionArgs);
}
}
}
} else {
console.warn(
"🧱 Formbricks - Warning: Formbricks not initialized. This method will be queued and executed after initialization."
);
functionsToProcess.push({ prop, args });
}
} else if (window.formbricks) {
const formbricksInstance = window.formbricks;
const functionPropTyped = prop;
await formbricksInstance[functionPropTyped](...args);
}
};
const formbricksProxyHandler = {
get(_target, prop, _receiver) {
return (...args) => loadFormbricksToProxy(prop, ...args);
}
};
const formbricks = new Proxy({}, formbricksProxyHandler);
export {
formbricks as default
};
//# sourceMappingURL=index.js.map