rcmerci 4 лет назад
Родитель
Сommit
58a1850601

+ 6 - 0
src/main/frontend/components/header.cljs

@@ -6,6 +6,7 @@
             [frontend.components.right-sidebar :as sidebar]
             [frontend.components.search :as search]
             [frontend.components.svg :as svg]
+            [frontend.components.yjs :as yjs]
             [frontend.config :as config]
             [frontend.context.i18n :as i18n]
             [frontend.handler :as handler]
@@ -214,10 +215,15 @@
 
        (new-block-mode)
 
+
        (when refreshing?
          [:div {:class "animate-spin-reverse"}
           svg/refresh])
 
+       [:div
+        {:on-click (fn [_]
+                     (state/set-modal! yjs/setup-sync-server))}
+        svg/cloud]
        (repo/sync-status current-repo)
 
        (when show-open-folder?

+ 16 - 0
src/main/frontend/components/svg.cljs

@@ -751,3 +751,19 @@
 
 (def arrow-expand
   (hero-icon "M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4"))
+
+
+(def cloud
+  [:svg.icon.icon-tabler.icon-tabler-cloud
+   {:stroke-linejoin "round",
+    :stroke-linecap "round",
+    :fill "none",
+    :stroke "currentColor",
+    :stroke-width "2",
+    :viewbox "0 0 24 24",
+    :height "24",
+    :width "24"}
+   [:path {:fill "none", :d "M0 0h24v24H0z", :stroke "none"}]
+   [:path
+    {:d
+     "M7 18a4.6 4.4 0 0 1 0 -9a5 4.5 0 0 1 11 2h1a3.5 3.5 0 0 1 0 7h-12"}]])

+ 25 - 0
src/main/frontend/components/yjs.cljs

@@ -0,0 +1,25 @@
+(ns frontend.components.yjs
+  (:require [rum.core :as rum]
+            [frontend.handler.yjs :as yjs-handler]
+            [frontend.util :as util]
+            [frontend.ui :as ui]
+            [frontend.state :as state]))
+
+(rum/defc setup-sync-server
+  []
+  (let [address (atom nil)
+        room (atom nil)
+        username (atom nil)]
+    [:div.p-2.mt-2.rounded-md.shadow-sm.bg-base-2
+     [:input.form-input.block.w-full.pl-2.sm:text-sm.sm:leading-5
+      {:placeholder "Server Address: e.g. ws://localhost:1234"
+       :on-change (fn [e] (reset! address (util/evalue e)))}]
+     [:input.form-input.block.w-full.pl-2.sm:text-sm.sm:leading-5
+      {:placeholder "Server Roomname: e.g. roomname-1"
+       :on-change (fn [e] (reset! room (util/evalue e)))}]
+     [:input.form-input.block.w-full.pl-2.sm:text-sm.sm:leading-5
+      {:placeholder "Username for display"
+       :on-change (fn [e] (reset! username (util/evalue e)))}]
+     (ui/button "Save" :on-click (fn [e]
+                                   (util/stop e)
+                                   (yjs-handler/setup-sync-server! @address @room @username)))]))

+ 36 - 0
src/main/frontend/handler/yjs.cljs

@@ -0,0 +1,36 @@
+(ns frontend.handler.yjs
+  (:require [frontend.state :as state]
+            [frontend.modules.outliner.yjs :as outliner-yjs]
+            ["y-websocket" :as y-ws]
+            ["yjs" :as y]))
+
+(defn sync-current-page! []
+  (let [page-name (state/get-current-page)]
+    (outliner-yjs/start-sync-page page-name)
+    (println "sync current page:" page-name)))
+
+(defn current-page-syncing? []
+  (let [page-name (state/get-current-page)]
+    (outliner-yjs/page-syncing? page-name)))
+
+
+(defonce server-address (atom nil))
+(defonce server-roomname (atom nil))
+(defonce username-to-display (atom nil))
+(defonce server-conn (atom nil))
+
+(defn setup-sync-server! [address roomname username]
+  (when (and (seq address) (seq roomname) (seq username))
+    (println "setup-sync-server! " address roomname username)
+    (when @server-conn
+      (.disconnect server-conn))
+    (.destroy @outliner-yjs/doc-remote)
+    (.destroy @outliner-yjs/doc-local)
+    (reset! outliner-yjs/doc-remote (y/Doc.))
+    (reset! outliner-yjs/doc-local (y/Doc.))
+    (reset! server-conn (y-ws/WebsocketProvider. address roomname @outliner-yjs/doc-remote))))
+
+
+(defn server-connected? []
+  (and (some? @server-conn)
+       (.-wsconnected @server-conn)))

+ 19 - 22
src/main/frontend/modules/outliner/yjs.cljs

@@ -17,19 +17,16 @@
 (def ^:dynamic *debug* true)
 (declare validate-struct validate-no-left-conflict start-sync-page)
 
-(defonce doc-local (y/Doc.))
-(defonce doc-remote (y/Doc.))
+(defonce doc-local (atom (y/Doc.)))
+(defonce doc-remote (atom (y/Doc.)))
 
 (def syncing-pages (atom #{}))
 
+(defn- contentmap [] (.getMap @doc-local "content"))
+(defn- structarray [page-name] (.getArray @doc-local (str page-name "-struct")))
 
-(defonce wsProvider1 (y-ws/WebsocketProvider. "ws://localhost:1234", "test-user", doc-remote))
-
-(defn- contentmap [] (.getMap doc-local "content"))
-(defn- structarray [page-name] (.getArray doc-local (str page-name "-struct")))
-
-(defn- remote-contentmap [] (.getMap doc-remote "content"))
-(defn- remote-structarray [page-name] (.getArray doc-remote (str page-name "-struct")))
+(defn- remote-contentmap [] (.getMap @doc-remote "content"))
+(defn- remote-structarray [page-name] (.getArray @doc-remote (str page-name "-struct")))
 
 (defn page-syncing? [page-name]
   (some? (seq (structarray page-name))))
@@ -533,16 +530,16 @@ return [2 3]
 
 (defn start-sync-page [page-name]
   (let [page-blocks (db/get-page-blocks-no-cache page-name)]
-    (unobserve-page-doc page-name doc-local)
+    (unobserve-page-doc page-name @doc-local)
     (page-blocks->doc page-blocks page-name)
-    (sync-doc doc-local doc-remote)
+    (sync-doc @doc-local @doc-remote)
     (distinct-struct (structarray page-name) (atom #{}))
-    (merge-doc doc-remote doc-local)
+    (merge-doc @doc-remote @doc-local)
     (doc->page-blocks page-blocks page-name)
-    (observe-page-doc page-name doc-local)))
+    (observe-page-doc page-name @doc-local)))
 
 (defn stop-sync-page [page-name]
-  (unobserve-page-doc page-name doc-local))
+  (unobserve-page-doc page-name @doc-local))
 
 
 
@@ -658,7 +655,7 @@ return [2 3]
                                new-nodes-tree)]
         (insert-nodes-yjs struct new-nodes-tree* (str (:block/uuid target-block)) sibling?)
         (distinct-struct struct (atom #{}))
-        (merge-doc doc-remote doc-local)
+        (merge-doc @doc-remote @doc-local)
         (when *debug*
           (validate-struct struct)
           (validate-no-left-conflict page-name))
@@ -681,7 +678,7 @@ return [2 3]
        (let [struct (structarray page-name)]
          (insert-node-yjs struct new-node (str (:block/uuid target-block)) sibling?)
          (distinct-struct struct (atom #{}))
-         (merge-doc doc-remote doc-local)
+         (merge-doc @doc-remote @doc-local)
          (when *debug*
            (validate-struct struct)
            (validate-no-left-conflict page-name))
@@ -770,7 +767,7 @@ return [2 3]
                   [end-pos start-pos end-node start-node])]
             (delete-nodes-yjs struct start-pos end-pos block-ids)
             (distinct-struct struct (atom #{}))
-            (merge-doc doc-remote doc-local)
+            (merge-doc @doc-remote @doc-local)
             (when *debug*
               (validate-struct struct)
               (validate-no-left-conflict page-name))
@@ -798,7 +795,7 @@ return [2 3]
             struct (structarray page-name)]
         (println "[YJS] delete-node-op: " uuid children?)
         (delete-node-yjs struct uuid children?)
-        (merge-doc doc-remote doc-local)
+        (merge-doc @doc-remote @doc-local)
         (when *debug*
           (validate-struct struct)
           (validate-no-left-conflict page-name))
@@ -812,7 +809,7 @@ return [2 3]
         (let [struct (structarray page-name)]
           (.set contentmap (str block-uuid) (:block/content block))
           (distinct-struct struct (atom #{}))
-          (merge-doc doc-remote doc-local)
+          (merge-doc @doc-remote @doc-local)
           (when *debug*
             (validate-struct struct)
             (validate-no-left-conflict page-name))
@@ -893,7 +890,7 @@ return [2 3]
     (let [ids (mapv (fn [node] (str (:block/uuid (:data node)))) nodes)
           struct (structarray page-name)]
       (indent-outdent-nodes-yjs struct ids indent?)
-      (merge-doc doc-remote doc-local)
+      (merge-doc @doc-remote @doc-local)
       (when *debug*
         (validate-struct struct)
         (validate-no-left-conflict page-name))
@@ -946,7 +943,7 @@ return [2 3]
       (let [page-block (or (:block/page target-block) target-block)
             block-tree (uuid-tree->node-tree uuids-to-insert :markdown page-block)]
         (insert-nodes-yjs target-struct block-tree target-id sibling?)
-        (merge-doc doc-remote doc-local)
+        (merge-doc @doc-remote @doc-local)
         (when *debug*
           (validate-struct root-struct)
           (validate-struct target-struct)
@@ -960,7 +957,7 @@ return [2 3]
           root-id (str (:block/uuid (:data root)))
           target-id (str (:block/uuid (:data target-node)))]
       (move-subtree-same-page-yjs struct root-id target-id sibling?)
-      (merge-doc doc-remote doc-local)
+      (merge-doc @doc-remote @doc-local)
       (when *debug*
         (validate-struct struct)
         (validate-no-left-conflict page-name))