Skip to content

Commit dc9e3e3

Browse files
authored
Show error page if embed version out of supported range (#335)
1 parent 27b8030 commit dc9e3e3

File tree

7 files changed

+79
-10
lines changed

7 files changed

+79
-10
lines changed

packages/core-cairo/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ export { OptionsError } from './error';
2020
export type { Kind } from './kind';
2121
export { sanitizeKind } from './kind';
2222

23-
export { contractsVersion, contractsVersionTag } from './utils/version';
23+
export { contractsVersion, contractsVersionTag, compatibleContractsSemver } from './utils/version';
2424

2525
export { erc20, erc721, custom } from './api';

packages/core/src/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ export { OptionsError } from './error';
1919
export type { Kind } from './kind';
2020
export { sanitizeKind } from './kind';
2121

22-
export { erc20, erc721, erc1155, governor, custom } from './api';
22+
export { erc20, erc721, erc1155, governor, custom } from './api';
23+
24+
export { compatibleContractsSemver } from './utils/version';

packages/ui/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"@types/resize-observer-browser": "^0.1.5",
2020
"@types/uuid": "^9.0.0",
2121
"@types/node": "^18.0.0",
22+
"@types/semver": "^7.5.7",
2223
"autoprefixer": "^10.4.2",
2324
"path-browserify": "^1.0.1",
2425
"postcss": "^8.2.8",
@@ -43,6 +44,7 @@
4344
"sirv-cli": "^2.0.0",
4445
"tippy.js": "^6.3.1",
4546
"util": "^0.12.4",
46-
"uuid": "^9.0.0"
47+
"uuid": "^9.0.0",
48+
"semver": "^7.6.0"
4749
}
4850
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<script lang="ts">
2+
export let requestedVersion: string;
3+
export let compatibleVersionSemver: string;
4+
</script>
5+
6+
<div class="container flex flex-col gap-4 p-4">
7+
<div class="header flex justify-between items-center">
8+
<h1 class="text-lg font-bold">Unsupported Version</h1>
9+
</div>
10+
11+
<div class="controls p-4">
12+
<p>
13+
Version <strong>{requestedVersion}</strong> is not supported by the Wizard.
14+
</p>
15+
<p>
16+
Select a version that is compatible with the version range: <strong>{compatibleVersionSemver}</strong>.
17+
</p>
18+
</div>
19+
</div>
20+
21+
<style lang="postcss">
22+
.container {
23+
background-color: var(--gray-1);
24+
border: 1px solid var(--gray-2);
25+
border-radius: 10px;
26+
min-width: 32rem;
27+
}
28+
29+
.header {
30+
font-size: var(--text-small);
31+
}
32+
33+
.controls {
34+
background-color: white;
35+
padding: var(--size-4);
36+
border-radius: 5px;
37+
box-shadow: var(--shadow);
38+
}
39+
</style>

packages/ui/src/embed.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,22 @@ const currentScript = new URL(document.currentScript.src);
88

99
const iframes = new WeakMap<MessageEventSource, HTMLIFrameElement>();
1010

11+
let unsupportedVersion: boolean = false;
12+
const unsupportedVersionFrameHeight = 'auto';
13+
1114
window.addEventListener('message', function (e: MessageEvent<Message>) {
12-
if (e.source && e.data.kind === 'oz-wizard-resize') {
13-
const iframe = iframes.get(e.source);
14-
if (iframe) {
15-
iframe.style.height = 'calc(100vh - 158px)';
15+
if (e.source) {
16+
if (e.data.kind === 'oz-wizard-unsupported-version') {
17+
unsupportedVersion = true;
18+
const iframe = iframes.get(e.source);
19+
if (iframe) {
20+
iframe.style.height = unsupportedVersionFrameHeight;
21+
}
22+
} else if (e.data.kind === 'oz-wizard-resize') {
23+
const iframe = iframes.get(e.source);
24+
if (iframe) {
25+
iframe.style.height = unsupportedVersion ? unsupportedVersionFrameHeight : 'calc(100vh - 158px)';
26+
}
1627
}
1728
}
1829
});
@@ -27,6 +38,7 @@ onDOMContentLoaded(function () {
2738

2839
setSearchParam(w, src.searchParams, 'data-lang', 'lang');
2940
setSearchParam(w, src.searchParams, 'data-tab', 'tab');
41+
setSearchParam(w, src.searchParams, 'version', 'version');
3042
const sync = w.getAttribute('data-sync-url');
3143

3244
if (sync === 'fragment') {

packages/ui/src/main.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import type {} from 'svelte';
44
import App from './App.svelte';
55
import CairoApp from './cairo/App.svelte';
66
import { postMessage } from './post-message';
7+
import UnsupportedVersion from './UnsupportedVersion.svelte';
8+
import semver from 'semver';
9+
import { compatibleContractsSemver as compatibleSolidityContractsSemver } from '@openzeppelin/wizard';
10+
import { compatibleContractsSemver as compatibleCairoContractsSemver } from '@openzeppelin/wizard-cairo';
711

812
function postResize() {
913
const { height } = document.documentElement.getBoundingClientRect();
@@ -18,10 +22,16 @@ resizeObserver.observe(document.body);
1822
const params = new URLSearchParams(window.location.search);
1923

2024
const initialTab = params.get('tab') ?? undefined;
21-
const lang = params.get('lang');
25+
const lang = params.get('lang') ?? undefined;
26+
const requestedVersion = params.get('version') ?? undefined;
27+
28+
let compatibleVersionSemver = lang === 'cairo' ? compatibleCairoContractsSemver : compatibleSolidityContractsSemver;
2229

2330
let app;
24-
if (lang === 'cairo') {
31+
if (requestedVersion && !semver.satisfies(requestedVersion, compatibleVersionSemver)) {
32+
postMessage({ kind: 'oz-wizard-unsupported-version' });
33+
app = new UnsupportedVersion({ target: document.body, props: { requestedVersion, compatibleVersionSemver }});
34+
} else if (lang === 'cairo') {
2535
app = new CairoApp({ target: document.body, props: { initialTab } });
2636
} else {
2737
app = new App({ target: document.body, props: { initialTab } });

packages/ui/src/post-message.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export type Message = ResizeMessage | TabChangeMessage;
1+
export type Message = ResizeMessage | TabChangeMessage | UnsupportedVersionMessage;
22

33
export interface ResizeMessage {
44
kind: 'oz-wizard-resize';
@@ -10,6 +10,10 @@ export interface TabChangeMessage {
1010
tab: string;
1111
}
1212

13+
export interface UnsupportedVersionMessage {
14+
kind: 'oz-wizard-unsupported-version';
15+
}
16+
1317
export function postMessage(msg: Message) {
1418
if (parent) {
1519
parent.postMessage(msg, '*');

0 commit comments

Comments
 (0)