Skip to content

Commit 0eba8f9

Browse files
committed
load import source in effect
1 parent 3f8803e commit 0eba8f9

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-8
lines changed

src/client/packages/idom-client-react/src/components.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import ReactDOM from "react-dom";
33
import htm from "htm";
44

55
import { useJsonPatchCallback } from "./json-patch.js";
6-
import { loadModelImportSource } from "./import-source.js";
6+
import { useImportSource } from "./import-source.js";
77
import {
88
createElementAttributes,
99
createElementChildren,
@@ -101,14 +101,9 @@ function ImportedElement({ model }) {
101101
const layoutContext = React.useContext(LayoutContext);
102102

103103
const importSourceFallback = model.importSource.fallback;
104-
const [importSource, setImportSource] = React.useState(null);
104+
const importSource = useImportSource(model.importSource);
105105

106106
if (!importSource) {
107-
// load the import source in the background
108-
loadModelImportSource(layoutContext, model.importSource).then(
109-
setImportSource
110-
);
111-
112107
// display a fallback if one was given
113108
if (!importSourceFallback) {
114109
return html`<div />`;

src/client/packages/idom-client-react/src/import-source.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,32 @@
1+
import React from "react";
2+
13
import {
24
createElementAttributes,
35
createElementChildren,
46
} from "./element-utils.js";
57

6-
export function loadModelImportSource(layoutContext, importSource) {
8+
export function useImportSource(importSource) {
9+
const layoutContext = React.useContext(LayoutContext);
10+
const [importSource, setImportSource] = React.useState(null);
11+
12+
useEffect(() => {
13+
let unmounted = false;
14+
15+
loadModelImportSource(layoutContext, model.importSource).then((src) => {
16+
if (!unmounted) {
17+
setImportSource(src);
18+
}
19+
});
20+
21+
return () => {
22+
unmounted = true;
23+
};
24+
}, [layoutContext, model.importSource, setImportSource]);
25+
26+
return importSource;
27+
}
28+
29+
function loadModelImportSource(layoutContext, importSource) {
730
return layoutContext
831
.loadImportSource(importSource.source, importSource.sourceType)
932
.then((module) => {

0 commit comments

Comments
 (0)