48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
import { OpenPanel } from './index';
|
|
|
|
((window) => {
|
|
if (window.op) {
|
|
const queue = window.op.q || [];
|
|
// @ts-expect-error
|
|
const op = new OpenPanel(queue.shift()[1]);
|
|
queue.forEach((item) => {
|
|
if (item[0] in op) {
|
|
// @ts-expect-error
|
|
op[item[0]](...item.slice(1));
|
|
}
|
|
});
|
|
|
|
// Create a Proxy that supports both window.op('track', ...) and window.op.track(...)
|
|
const opCallable = new Proxy(
|
|
((method: string, ...args: any[]) => {
|
|
const fn = (op as any)[method]
|
|
? (op as any)[method].bind(op)
|
|
: undefined;
|
|
if (typeof fn === 'function') {
|
|
fn(...args);
|
|
} else {
|
|
console.warn(`OpenPanel: ${method} is not a function`);
|
|
}
|
|
}) as typeof op & ((method: string, ...args: any[]) => void),
|
|
{
|
|
get(target, prop) {
|
|
// Handle special properties
|
|
if (prop === 'q') {
|
|
return undefined; // q doesn't exist after SDK loads
|
|
}
|
|
// If accessing a method on op, return the bound method
|
|
const value = (op as any)[prop];
|
|
if (typeof value === 'function') {
|
|
return value.bind(op);
|
|
}
|
|
// Otherwise return the property from op (for things like options, etc.)
|
|
return value;
|
|
},
|
|
}
|
|
);
|
|
|
|
window.op = opCallable;
|
|
window.openpanel = op;
|
|
}
|
|
})(window);
|