Skip to content

Commit efa547f

Browse files
Connection resume (#1)
Add reconnection and client state side state capabilities
1 parent 8f6c8ec commit efa547f

File tree

20 files changed

+1245
-225
lines changed

20 files changed

+1245
-225
lines changed

src/js/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/js/packages/@reactpy/client/src/components.tsx

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,13 @@ export function Layout(props: { client: ReactPyClient }): JSX.Element {
2929

3030
useEffect(
3131
() =>
32-
props.client.onMessage("layout-update", ({ path, model }) => {
32+
props.client.onMessage("layout-update", ({ path, model, state_vars }) => {
3333
if (path === "") {
3434
Object.assign(currentModel, model);
3535
} else {
3636
setJsonPointer(currentModel, path, model);
3737
}
38+
props.client.updateStateVars(state_vars);
3839
forceUpdate();
3940
}),
4041
[currentModel, props.client],
@@ -125,23 +126,15 @@ function ScriptElement({ model }: { model: ReactPyVdom }) {
125126
(value): value is string => typeof value == "string",
126127
)[0];
127128

128-
let scriptElement: HTMLScriptElement;
129-
if (model.attributes) {
130-
scriptElement = document.createElement("script");
131-
for (const [k, v] of Object.entries(model.attributes)) {
132-
scriptElement.setAttribute(k, v);
133-
}
134-
if (scriptContent) {
135-
scriptElement.appendChild(document.createTextNode(scriptContent));
136-
}
137-
ref.current.appendChild(scriptElement);
138-
} else if (scriptContent) {
139-
const scriptResult = eval(scriptContent);
140-
if (typeof scriptResult == "function") {
141-
return scriptResult();
142-
}
129+
const scriptElement: HTMLScriptElement = document.createElement("script");
130+
for (const [k, v] of Object.entries(model.attributes || {})) {
131+
scriptElement.setAttribute(k, v);
132+
}
133+
if (scriptContent) {
134+
scriptElement.appendChild(document.createTextNode(scriptContent));
143135
}
144-
}, [model.key, ref.current]);
136+
ref.current.appendChild(scriptElement);
137+
}, [model.key]);
145138

146139
return <div ref={ref} />;
147140
}

src/js/packages/@reactpy/client/src/messages.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ export type LayoutEventMessage = {
1212
data: any;
1313
};
1414

15-
export type IncomingMessage = LayoutUpdateMessage;
16-
export type OutgoingMessage = LayoutEventMessage;
15+
export type ReconnectingCheckMessage = {
16+
type: "reconnecting-check";
17+
value: string;
18+
}
19+
20+
export type IncomingMessage = LayoutUpdateMessage | ReconnectingCheckMessage;
21+
export type OutgoingMessage = LayoutEventMessage | ReconnectingCheckMessage;
1722
export type Message = IncomingMessage | OutgoingMessage;

0 commit comments

Comments
 (0)