darabos commited on
Commit
1b098e4
·
1 Parent(s): ab4322d

Fix dynamic import of y-monaco.

Browse files
Files changed (1) hide show
  1. lynxkite-app/web/src/Code.tsx +31 -16
lynxkite-app/web/src/Code.tsx CHANGED
@@ -14,39 +14,53 @@ import Backspace from "~icons/tabler/backspace.jsx";
14
  import Close from "~icons/tabler/x.jsx";
15
  import favicon from "./assets/favicon.ico";
16
  import theme from "./code-theme.ts";
17
- // For some reason y-monaco is gigantic. The other Monaco packages are small.
18
- const MonacoBinding = await import("y-monaco").then((m) => m.MonacoBinding);
19
 
20
  export default function Code() {
21
  const { path } = useParams();
22
  const parentDir = path!.split("/").slice(0, -1).join("/");
23
- const ydoc = useRef<any>();
24
- const wsProvider = useRef<any>();
25
- const monacoBinding = useRef<any>();
 
 
 
 
 
 
 
 
 
 
26
  function beforeMount(monaco: Monaco) {
27
  monaco.editor.defineTheme("lynxkite", theme);
28
  }
29
  function onMount(_editor: editor.IStandaloneCodeEditor) {
30
- ydoc.current = new Y.Doc();
31
- const text = ydoc.current.getText("text");
 
 
 
 
 
 
32
  const proto = location.protocol === "https:" ? "wss:" : "ws:";
33
- wsProvider.current = new WebsocketProvider(
34
  `${proto}//${location.host}/ws/code/crdt`,
35
  path!,
36
- ydoc.current,
37
  );
38
- monacoBinding.current = new MonacoBinding(
39
  text,
40
- _editor.getModel()!,
41
- new Set([_editor]),
42
- wsProvider.current.awareness,
43
  );
44
  }
45
  useEffect(() => {
46
  return () => {
47
- ydoc.current?.destroy();
48
- wsProvider.current?.destroy();
49
- monacoBinding.current?.destroy();
50
  };
51
  });
52
  return (
@@ -74,6 +88,7 @@ export default function Code() {
74
  path={path}
75
  beforeMount={beforeMount}
76
  onMount={onMount}
 
77
  options={{
78
  cursorStyle: "block",
79
  cursorBlinking: "solid",
 
14
  import Close from "~icons/tabler/x.jsx";
15
  import favicon from "./assets/favicon.ico";
16
  import theme from "./code-theme.ts";
 
 
17
 
18
  export default function Code() {
19
  const { path } = useParams();
20
  const parentDir = path!.split("/").slice(0, -1).join("/");
21
+ const yDocRef = useRef<any>();
22
+ const wsProviderRef = useRef<any>();
23
+ const monacoBindingRef = useRef<any>();
24
+ const yMonacoRef = useRef<any>();
25
+ const editorRef = useRef<any>();
26
+ useEffect(() => {
27
+ const loadMonaco = async () => {
28
+ // y-monaco is gigantic. The other Monaco packages are small.
29
+ yMonacoRef.current = await import("y-monaco");
30
+ initCRDT();
31
+ };
32
+ loadMonaco();
33
+ }, []);
34
  function beforeMount(monaco: Monaco) {
35
  monaco.editor.defineTheme("lynxkite", theme);
36
  }
37
  function onMount(_editor: editor.IStandaloneCodeEditor) {
38
+ editorRef.current = _editor;
39
+ initCRDT();
40
+ }
41
+ function initCRDT() {
42
+ if (!yMonacoRef.current || !editorRef.current) return;
43
+ if (yDocRef.current) return;
44
+ yDocRef.current = new Y.Doc();
45
+ const text = yDocRef.current.getText("text");
46
  const proto = location.protocol === "https:" ? "wss:" : "ws:";
47
+ wsProviderRef.current = new WebsocketProvider(
48
  `${proto}//${location.host}/ws/code/crdt`,
49
  path!,
50
+ yDocRef.current,
51
  );
52
+ monacoBindingRef.current = new yMonacoRef.current.MonacoBinding(
53
  text,
54
+ editorRef.current.getModel()!,
55
+ new Set([editorRef.current]),
56
+ wsProviderRef.current.awareness,
57
  );
58
  }
59
  useEffect(() => {
60
  return () => {
61
+ yDocRef.current?.destroy();
62
+ wsProviderRef.current?.destroy();
63
+ monacoBindingRef.current?.destroy();
64
  };
65
  });
66
  return (
 
88
  path={path}
89
  beforeMount={beforeMount}
90
  onMount={onMount}
91
+ loading={null}
92
  options={{
93
  cursorStyle: "block",
94
  cursorBlinking: "solid",