forked from reactive-python/reactpy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
94 lines (83 loc) · 2.35 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import { SimpleReactPyClient, mount } from "@reactpy/client";
let didMountDebug = false;
export function mountWidgetExample(
mountID,
viewID,
reactpyServerHost,
useActivateButton,
) {
let reactpyHost, reactpyPort;
if (reactpyServerHost) {
[reactpyHost, reactpyPort] = reactpyServerHost.split(":", 2);
} else {
reactpyHost = window.location.hostname;
reactpyPort = window.location.port;
}
const client = new SimpleReactPyClient({
serverLocation: {
url: `${window.location.protocol}//${reactpyHost}:${reactpyPort}`,
route: "/",
query: `?view_id=${viewID}`,
},
});
const mountEl = document.getElementById(mountID);
let isMounted = false;
triggerIfInViewport(mountEl, () => {
if (!isMounted) {
activateView(mountEl, client, useActivateButton);
isMounted = true;
}
});
}
function activateView(mountEl, client, useActivateButton) {
if (!useActivateButton) {
mount(mountEl, client);
return;
}
const enableWidgetButton = document.createElement("button");
enableWidgetButton.appendChild(document.createTextNode("Activate"));
enableWidgetButton.setAttribute("class", "enable-widget-button");
enableWidgetButton.addEventListener("click", () =>
fadeOutElementThenCallback(enableWidgetButton, () => {
{
mountEl.removeChild(enableWidgetButton);
mountEl.setAttribute("class", "interactive widget-container");
mountWithLayoutServer(mountEl, serverInfo);
}
}),
);
function fadeOutElementThenCallback(element, callback) {
{
var op = 1; // initial opacity
var timer = setInterval(function () {
{
if (op < 0.001) {
{
clearInterval(timer);
element.style.display = "none";
callback();
}
}
element.style.opacity = op;
element.style.filter = "alpha(opacity=" + op * 100 + ")";
op -= op * 0.5;
}
}, 50);
}
}
mountEl.appendChild(enableWidgetButton);
}
function triggerIfInViewport(element, callback) {
const observer = new window.IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
callback();
}
},
{
root: null,
threshold: 0.1, // set offset 0.1 means trigger if at least 10% of element in viewport
},
);
observer.observe(element);
}