@whop/iframe
Version:
Powers communication between Whop and your embedded app
119 lines (116 loc) • 4.37 kB
JavaScript
import {
appsServerSchema,
createSDK,
postmessageTransport,
reactNativeClientTransport,
transport_exports,
whopServerSchema
} from "./chunk-DPDPUJJX.mjs";
// src/sdk/mobile-app-postmessage.ts
function getReactNativePostMessage() {
const reactNativePostMessage = typeof window !== "undefined" && "ReactNativeWebView" in window && typeof window.ReactNativeWebView === "object" && window.ReactNativeWebView && "postMessage" in window.ReactNativeWebView && typeof window.ReactNativeWebView.postMessage === "function" ? (data) => {
if (typeof window !== "undefined" && "ReactNativeWebView" in window && typeof window.ReactNativeWebView === "object" && window.ReactNativeWebView && "postMessage" in window.ReactNativeWebView && typeof window.ReactNativeWebView.postMessage === "function")
window?.ReactNativeWebView?.postMessage(data);
} : void 0;
return reactNativePostMessage;
}
function getSwiftPostMessage() {
const swiftMessageHandler = typeof window !== "undefined" && "webkit" in window && typeof window.webkit === "object" && window.webkit !== null && "messageHandlers" in window.webkit && typeof window.webkit.messageHandlers === "object" && window.webkit.messageHandlers !== null && "SwiftWebView" in window.webkit.messageHandlers && typeof window.webkit.messageHandlers.SwiftWebView === "object" && window.webkit.messageHandlers.SwiftWebView !== null && "postMessage" in window.webkit.messageHandlers.SwiftWebView ? window.webkit.messageHandlers.SwiftWebView : null;
const swiftPostMessage = swiftMessageHandler ? (data) => {
if (typeof swiftMessageHandler.postMessage === "function") {
swiftMessageHandler.postMessage(data);
}
} : void 0;
return swiftPostMessage;
}
// src/sdk/sync-href.ts
function syncHref({
onChange
}) {
if (typeof window === "undefined") return;
const initialHref = window.location.href;
onChange({ href: initialHref }).catch(() => null);
let lastKnown = initialHref;
window.addEventListener("popstate", () => {
const { href } = window.location;
onChange({ href }).catch(() => null);
lastKnown = href;
});
if (window._whop_sync_href_interval) {
clearInterval(window._whop_sync_href_interval);
}
window._whop_sync_href_interval = setInterval(() => {
const { href } = window.location;
if (href === lastKnown) return;
onChange({ href }).catch(() => null);
lastKnown = href;
}, 250);
}
// src/sdk/index.ts
function setColorTheme(theme) {
document.documentElement.dispatchEvent(
new CustomEvent("frosted-ui:set-theme", {
detail: theme
})
);
}
function createSdk({
onMessage = {},
appId = process.env.NEXT_PUBLIC_WHOP_APP_ID,
overrideParentOrigins
}) {
const mobileWebView = getSwiftPostMessage() ?? getReactNativePostMessage();
const remoteWindow = typeof window === "undefined" ? void 0 : window.parent;
if (!appId) {
throw new Error(
"[createSdk]: appId is required. Please provide an appId or set the NEXT_PUBLIC_WHOP_APP_ID environment variable."
);
}
const sdk = createSDK({
clientSchema: whopServerSchema,
serverSchema: appsServerSchema,
forceCompleteness: false,
serverImplementation: onMessage,
localAppId: appId,
remoteAppId: "app_whop",
transport: mobileWebView ? reactNativeClientTransport({
postMessage: mobileWebView,
targetOrigin: "com.whop.whopapp"
}) : postmessageTransport({
remoteWindow,
targetOrigins: overrideParentOrigins ?? [
"https://whop.com",
"https://dash.whop.com",
"http://localhost:8003"
]
}),
serverComplete: true,
serverMiddleware: [
{
onColorThemeChange: setColorTheme
}
],
timeout: 15e3,
timeouts: {
inAppPurchase: 1e3 * 60 * 60 * 24,
// 24 hours, we never want this to timeout.
onHrefChange: 500
// we don't really care about a response here.
}
});
if (typeof window !== "undefined") {
sdk.getColorTheme().then(setColorTheme).catch(() => null);
document.documentElement.addEventListener("frosted-ui:mounted", () => {
sdk.getColorTheme().then(setColorTheme).catch(() => null);
});
}
syncHref({ onChange: sdk.onHrefChange });
return sdk;
}
export {
appsServerSchema,
createSdk,
transport_exports as transport,
whopServerSchema
};
//# sourceMappingURL=index.mjs.map