@base-org/account
Version:
Base Account SDK
100 lines • 3.98 kB
JavaScript
import { PACKAGE_NAME, PACKAGE_VERSION } from '../core/constants.js';
import { standardErrors } from '../core/error/errors.js';
import { logDialogActionClicked, logDialogShown } from '../core/telemetry/events/dialog.js';
import { store } from '../store/store.js';
import { initDialog } from '../ui/Dialog/index.js';
import { getCrossOriginOpenerPolicy } from './checkCrossOriginOpenerPolicy.js';
const POPUP_WIDTH = 420;
const POPUP_HEIGHT = 700;
const POPUP_BLOCKED_TITLE = '{app} wants to continue in Base Account';
const POPUP_BLOCKED_MESSAGE = 'This action requires your permission to open a new window.';
export function openPopup(url) {
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;
}
const popup = tryOpenPopup();
// If the popup was blocked, show a snackbar with a retry button
if (!popup) {
return openPopupWithDialog(tryOpenPopup);
}
return Promise.resolve(popup);
}
export function closePopup(popup) {
if (popup && !popup.closed) {
popup.close();
}
}
function appendAppInfoQueryParams(url) {
const params = {
sdkName: PACKAGE_NAME,
sdkVersion: PACKAGE_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());
}
}
}
function openPopupWithDialog(tryOpenPopup) {
var _a, _b;
const dappName = (_b = (_a = store.config.get().metadata) === null || _a === void 0 ? void 0 : _a.appName) !== null && _b !== void 0 ? _b : 'App';
const dialog = initDialog();
return new Promise((resolve, reject) => {
logDialogShown({ dialogContext: 'popup_blocked' });
dialog.presentItem({
title: POPUP_BLOCKED_TITLE.replace('{app}', dappName),
message: POPUP_BLOCKED_MESSAGE,
onClose: () => {
logDialogActionClicked({
dialogContext: 'popup_blocked',
dialogAction: 'cancel',
});
reject(standardErrors.rpc.internal('Popup window was blocked'));
},
actionItems: [
{
text: 'Try again',
variant: 'primary',
onClick: () => {
logDialogActionClicked({
dialogContext: 'popup_blocked',
dialogAction: 'confirm',
});
const popup = tryOpenPopup();
if (popup) {
resolve(popup);
}
else {
reject(standardErrors.rpc.internal('Popup window was blocked'));
}
dialog.clear();
},
},
{
text: 'Cancel',
variant: 'secondary',
onClick: () => {
logDialogActionClicked({
dialogContext: 'popup_blocked',
dialogAction: 'cancel',
});
reject(standardErrors.rpc.internal('Popup window was blocked'));
dialog.clear();
},
},
],
});
});
}
//# sourceMappingURL=web.js.map