@lukasrosario/wallet-sdk
Version:
Coinbase Wallet JavaScript SDK
107 lines • 4.21 kB
JavaScript
import { standardErrors } from "../core/error/errors.js";
import { logSnackbarActionClicked, logSnackbarShown, } from "../core/telemetry/events/snackbar.js";
import { RETRY_SVG_PATH } from "../sign/walletlink/relay/ui/WalletLinkRelayUI.js";
import { Snackbar } from "../sign/walletlink/relay/ui/components/Snackbar/Snackbar.js";
import { NAME, VERSION } from "../sdk-info.js";
import { getCrossOriginOpenerPolicy } from "./checkCrossOriginOpenerPolicy.js";
const POPUP_WIDTH = 420;
const POPUP_HEIGHT = 700;
const RETRY_BUTTON = {
isRed: false,
info: "Retry",
svgWidth: "10",
svgHeight: "11",
path: RETRY_SVG_PATH,
defaultFillRule: "evenodd",
defaultClipRule: "evenodd",
};
const POPUP_BLOCKED_MESSAGE = "Popup was blocked. Try again.";
let snackbar = null;
export function openPopup(url, mode, cdp) {
if (mode === "embedded") {
const walletFrame = document.createElement("iframe");
walletFrame.id = "wallet-frame";
walletFrame.style.cssText =
"overflow:hidden;overflow-x:hidden;overflow-y:hidden;height:100%;width:100%;position:absolute;top:0px;left:0px;right:0px;bottom:0px;backgroundColor:transparent;";
walletFrame.frameBorder = "0";
walletFrame.allowFullscreen = true;
walletFrame.allow =
"publickey-credentials-get; publickey-credentials-create";
walletFrame.src = `${url.toString()}?cdp=${cdp}`;
document.body.appendChild(walletFrame);
if (!walletFrame.contentWindow) {
throw standardErrors.rpc.internal("Pop up window failed to open");
}
return Promise.resolve(walletFrame.contentWindow);
}
const left = (window.innerWidth - POPUP_WIDTH) / 2 + window.screenX;
const top = (window.innerHeight - POPUP_HEIGHT) / 2 + window.screenY;
appendAppInfoQueryParams(url);
function tryOpenPopup() {
const popupId = `wallet_${crypto.randomUUID()}`;
const popup = window.open(url, popupId, `width=${POPUP_WIDTH}, height=${POPUP_HEIGHT}, left=${left}, top=${top}`);
popup === null || popup === void 0 ? void 0 : popup.focus();
if (!popup) {
return null;
}
return popup;
}
let popup = tryOpenPopup();
// If the popup was blocked, show a snackbar with a retry button
if (!popup) {
const sb = initSnackbar();
return new Promise((resolve, reject) => {
logSnackbarShown({ snackbarContext: "popup_blocked" });
sb.presentItem({
autoExpand: true,
message: POPUP_BLOCKED_MESSAGE,
menuItems: [
Object.assign(Object.assign({}, RETRY_BUTTON), { onClick: () => {
logSnackbarActionClicked({
snackbarContext: "popup_blocked",
snackbarAction: "confirm",
});
popup = tryOpenPopup();
if (popup) {
resolve(popup);
}
else {
reject(standardErrors.rpc.internal("Popup window was blocked"));
}
sb.clear();
} }),
],
});
});
}
return Promise.resolve(popup);
}
export function closePopup(popup) {
if (popup && !popup.closed) {
popup.close();
}
}
function appendAppInfoQueryParams(url) {
const params = {
sdkName: NAME,
sdkVersion: VERSION,
origin: window.location.origin,
coop: getCrossOriginOpenerPolicy(),
};
for (const [key, value] of Object.entries(params)) {
if (!url.searchParams.has(key)) {
url.searchParams.append(key, value.toString());
}
}
}
export function initSnackbar() {
if (!snackbar) {
const root = document.createElement("div");
root.className = "-cbwsdk-css-reset";
document.body.appendChild(root);
snackbar = new Snackbar();
snackbar.attach(root);
}
return snackbar;
}
//# sourceMappingURL=web.js.map