Skip to content

Commit 53bdb26

Browse files
authored
feat: only load preview frame when needed (#544)
1 parent 1bc8caa commit 53bdb26

File tree

4 files changed

+65
-12
lines changed

4 files changed

+65
-12
lines changed

blocks/edit/da-content/da-content.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ export default class DaContent extends LitElement {
1111
permissions: { attribute: false },
1212
proseEl: { attribute: false },
1313
wsProvider: { attribute: false },
14+
startPreviewing: { attribute: false },
15+
stopPreviewing: { attribute: false },
1416
_editorLoaded: { state: true },
1517
_versionUrl: { state: true },
1618
_ueUrl: { state: true },
@@ -29,8 +31,18 @@ export default class DaContent extends LitElement {
2931
}
3032

3133
showPreview() {
32-
this.classList.add('show-preview');
33-
this.shadowRoot.querySelector('da-preview').classList.add('show-preview');
34+
this.daPreview.showPreview(() => {
35+
if (this.startPreviewing) {
36+
this.startPreviewing();
37+
}
38+
});
39+
}
40+
41+
hidePreview() {
42+
this.daPreview.hidePreview();
43+
if (this.stopPreviewing) {
44+
this.stopPreviewing();
45+
}
3446
}
3547

3648
showVersions() {
@@ -80,6 +92,10 @@ export default class DaContent extends LitElement {
8092
return this.shadowRoot.querySelector('da-versions');
8193
}
8294

95+
get daPreview() {
96+
return this.shadowRoot.querySelector('da-preview');
97+
}
98+
8399
render() {
84100
return html`
85101
<div class="editor-wrapper">

blocks/edit/da-preview/da-preview.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,26 @@ export default class DaPreview extends LitElement {
3333
return path.endsWith('index') ? path.substring(0, path.lastIndexOf('/') + 1) : path;
3434
}
3535

36+
showPreview(callback) {
37+
const src = this.iframe.getAttribute('src');
38+
39+
const show = () => {
40+
callback();
41+
// leave a small delay to allow the body replacement to complete
42+
setTimeout(() => {
43+
this.classList.add('show-preview');
44+
this._daContent.classList.add('show-preview');
45+
}, 500);
46+
};
47+
48+
if (!src) {
49+
this.onFrameLoaded = show;
50+
this.iframe.src = `${this.formatPath(this.path)}?martech=off&dapreview=${this.getEnv()}`;
51+
} else {
52+
show();
53+
}
54+
}
55+
3656
hidePreview() {
3757
this._daContent.classList.remove('show-preview');
3858
this.classList.remove('show-preview');
@@ -52,13 +72,17 @@ export default class DaPreview extends LitElement {
5272
}
5373

5474
iframeLoaded({ target }) {
75+
const src = target.getAttribute('src');
76+
if (!src) return;
77+
5578
const channel = new MessageChannel();
5679
this.port1 = channel.port1;
5780
this.port2 = channel.port2;
5881

5982
setTimeout(() => {
6083
this.port1.onmessage = (e) => { this.setHeight(e.data); };
6184
target.contentWindow.postMessage({ init: true }, '*', [this.port2]);
85+
if (this.onFrameLoaded) this.onFrameLoaded();
6286
}, 1500);
6387
}
6488

@@ -74,10 +98,10 @@ export default class DaPreview extends LitElement {
7498
class="da-preview-menuitem set-${key}"
7599
@click=${() => this.setWidth(key)}>
76100
</span>`)}
77-
<span class="da-preview-menuitem" @click=${this.hidePreview}></span>
101+
<span class="da-preview-menuitem" @click=${() => this._daContent.hidePreview()}></span>
78102
</div>
79103
<iframe
80-
src="${this.formatPath(this.path)}?martech=off&dapreview=${this.getEnv()}"
104+
src=""
81105
@load=${this.iframeLoaded}
82106
allow="clipboard-write *"
83107
scrolling="no"></iframe>

blocks/edit/edit.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import getPathDetails from '../shared/pathDetails.js';
33
let prose;
44
let proseEl;
55
let wsProvider;
6+
let startPreviewing;
7+
let stopPreviewing;
68

79
async function setUI(el, utils) {
810
const details = getPathDetails();
@@ -43,9 +45,17 @@ async function setUI(el, utils) {
4345
daContent.wsProvider = undefined;
4446
}
4547

46-
({ proseEl, wsProvider } = prose.default({ path: details.sourceUrl, permissions }));
48+
({
49+
proseEl,
50+
wsProvider,
51+
startPreviewing,
52+
stopPreviewing,
53+
} = prose.default({ path: details.sourceUrl, permissions }));
54+
4755
daContent.proseEl = proseEl;
4856
daContent.wsProvider = wsProvider;
57+
daContent.startPreviewing = startPreviewing;
58+
daContent.stopPreviewing = stopPreviewing;
4959
}
5060

5161
export default async function init(el) {

blocks/edit/prose/index.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,18 @@ function handleProseLoaded(editor) {
8585
const opts = { bubbles: true, composed: true };
8686
const event = new CustomEvent('proseloaded', opts);
8787
daEditor.dispatchEvent(event);
88-
89-
// Give the preview elements time to create
90-
setTimeout(() => {
91-
setPreviewBody();
92-
pollForUpdates();
93-
}, 3000);
9488
}, 3000);
9589
}
9690

91+
function startPreviewing() {
92+
setPreviewBody();
93+
pollForUpdates();
94+
}
95+
96+
function stopPreviewing() {
97+
if (updatePoller) clearInterval(updatePoller);
98+
}
99+
97100
function handleAwarenessUpdates(wsProvider, daTitle, win) {
98101
const users = new Set();
99102

@@ -323,5 +326,5 @@ export default function initProse({ path, permissions }) {
323326
document.execCommand('enableObjectResizing', false, 'false');
324327
document.execCommand('enableInlineTableEditing', false, 'false');
325328

326-
return { proseEl: editor, wsProvider };
329+
return { proseEl: editor, wsProvider, startPreviewing, stopPreviewing };
327330
}

0 commit comments

Comments
 (0)