소스 검색

wip: create rtc graph && invite

Tienson Qin 1 년 전
부모
커밋
a6cda7e959

+ 41 - 12
src/main/frontend/components/repo.cljs

@@ -19,7 +19,10 @@
             [frontend.handler.file-sync :as file-sync]
             [reitit.frontend.easy :as rfe]
             [frontend.handler.notification :as notification]
-            [frontend.util.fs :as fs-util]))
+            [frontend.util.fs :as fs-util]
+            [frontend.handler.user :as user-handler]
+            [logseq.shui.ui :as shui]
+            [frontend.persist-db.browser :as db-browser]))
 
 (rum/defc normalized-graph-label
   [{:keys [url remote? GraphName GraphUUID] :as graph} on-click]
@@ -289,25 +292,51 @@
   (or (fs-util/include-reserved-chars? graph-name)
       (string/includes? graph-name "+")))
 
+(defn- rtc-create-graph!
+  [repo]
+  (let [token (state/get-auth-id-token)
+        ^js worker @db-browser/*worker]
+    (.rtc-upload-graph worker repo token)))
+
+(defn- rtc-start!
+  [repo]
+  (let [token (state/get-auth-id-token)
+        ^object worker @db-browser/*worker]
+    (.rtc-start worker repo token
+                (and config/dev?
+                     (state/sub [:ui/developer-mode?])))))
+
 (rum/defcs new-db-graph <
   (rum/local "" ::graph-name)
+  (rum/local false ::cloud?)
   [state]
   (let [*graph-name (::graph-name state)
+        *cloud? (::cloud? state)
         new-db-f (fn []
                    (when-not (string/blank? @*graph-name)
                      (if (invalid-graph-name? @*graph-name)
                        (invalid-graph-name-warning)
-                       (do
-                         (repo-handler/new-db! @*graph-name)
-                         (state/close-modal!)))))]
-    [:div.new-graph.p-4
-     [:h1.title "Create new graph: "]
-     [:input.form-input.mb-4 {:value @*graph-name
-                              :auto-focus true
-                              :on-change #(reset! *graph-name (util/evalue %))
-                              :on-key-down (fn [^js e]
-                                             (when (= (gobj/get e "key") "Enter")
-                                               (new-db-f)))}]
+                       (p/let [repo (repo-handler/new-db! @*graph-name)]
+                         (when @*cloud?
+                           (p/let [create-result (rtc-create-graph! repo)
+                                   start-result (rtc-start! repo)]
+                             ;; TODO: can't pr-str result
+                             (state/close-modal!)))))))]
+    [:div.new-graph.flex.flex-col.p-4.gap-4
+     [:h1.title.mb-4 "Create new graph: "]
+     [:input.form-input {:value @*graph-name
+                         :auto-focus true
+                         :on-change #(reset! *graph-name (util/evalue %))
+                         :on-key-down (fn [^js e]
+                                        (when (= (gobj/get e "key") "Enter")
+                                          (new-db-f)))}]
+     [:div.flex.flex-row.items-center.gap-1
+      (when (user-handler/logged-in?)
+        (shui/checkbox
+         {:value @*cloud?
+          :on-checked-change #(swap! *cloud? not)}))
+      [:div.opacity-70.text-sm "Use Logseq Sync?"]]
+
      (ui/button "Submit"
                 :on-click new-db-f
                 :on-key-down   (fn [^js e]

+ 4 - 3
src/main/frontend/db/rtc/debug_ui.cljs

@@ -11,7 +11,8 @@
             [frontend.util :as util]
             [promesa.core :as p]
             [rum.core :as rum]
-            [logseq.shui.ui :as shui]))
+            [logseq.shui.ui :as shui]
+            [logseq.db :as ldb]))
 
 (defonce debug-state (atom nil))
 
@@ -104,8 +105,8 @@
                                   (when-let [graph-uuid (:graph-uuid state)]
                                     (let [^object worker @db-browser/*worker]
                                       (.rtc-grant-graph-access worker graph-uuid
-                                                               (some-> user-uuid vector)
-                                                               (some-> user-email vector))))))})
+                                                               (some-> user-uuid vector ldb/write-transit-str)
+                                                               (some-> user-email vector ldb/write-transit-str))))))})
 
         [:input.form-input.my-2
          {:on-change (fn [e] (swap! debug-state assoc :grant-access-to-user (util/evalue e)))

+ 50 - 48
src/main/frontend/db_worker.cljs

@@ -9,7 +9,7 @@
             [cognitect.transit :as transit]
             [datascript.core :as d]
             [datascript.storage :refer [IStorage]]
-            [frontend.worker.async-util :include-macros true :refer [<?]]
+            [frontend.worker.async-util :include-macros true :refer [<?] :as async-util]
             [frontend.worker.export :as worker-export]
             [frontend.worker.file :as file]
             [frontend.worker.handler.page :as worker-page]
@@ -545,72 +545,74 @@
   ;; RTC
   (rtc-start
    [this repo token dev-mode?]
-   (when-let [conn (worker-state/get-datascript-conn repo)]
-     (rtc-core/<start-rtc repo conn token dev-mode?)
-     nil))
+   (async-util/c->p
+    (when-let [conn (worker-state/get-datascript-conn repo)]
+      (rtc-core/<start-rtc repo conn token dev-mode?))))
 
   (rtc-stop
    [this]
-   (rtc-core/<stop-rtc)
-   nil)
+   (async-util/c->p (rtc-core/<stop-rtc)))
 
   (rtc-toggle-sync
    [this repo]
-   (let [d (p/deferred)]
-     (async/go
-       (let [result (<! (rtc-core/<toggle-sync))]
-         (p/resolve! d result)))
-     d))
+   (async-util/c->p (rtc-core/<toggle-sync)))
 
   (rtc-grant-graph-access
-   [this graph-uuid target-user-uuids target-user-emails]
-   (when-let [state @rtc-core/*state]
-     (rtc-core/<grant-graph-access-to-others
-      state graph-uuid
-      :target-user-uuids target-user-uuids
-      :target-user-emails target-user-emails))
-   nil)
+   [this graph-uuid target-user-uuids-str target-user-emails-str]
+   (async-util/c->p
+    (when-let [state @rtc-core/*state]
+      (let [target-user-uuids (ldb/read-transit-str target-user-uuids-str)
+            target-user-emails (ldb/read-transit-str target-user-emails-str)]
+
+        (rtc-core/<grant-graph-access-to-others
+         state graph-uuid
+         :target-user-uuids target-user-uuids
+         :target-user-emails target-user-emails)
+        nil))))
 
   (rtc-upload-graph
    [this repo token]
-   (when-let [conn (worker-state/get-datascript-conn repo)]
-     (async/go
-       (try
-         (let [state (<! (rtc-core/<init-state repo token false))]
-           (<! (rtc-updown/<upload-graph state repo conn))
-           (rtc-db-listener/listen-db-to-generate-ops repo conn))
-         (worker-util/post-message :notification
-                                   [[:div
-                                     [:p "Upload graph successfully"]]])
-         (catch :default e
+   (let [d (p/deferred)]
+     (when-let [conn (worker-state/get-datascript-conn repo)]
+       (async/go
+         (try
+           (let [state (<? (rtc-core/<init-state repo token false))]
+             (<? (rtc-updown/<upload-graph state repo conn))
+             (rtc-db-listener/listen-db-to-generate-ops repo conn)
+             (p/resolve! d :success))
            (worker-util/post-message :notification
                                      [[:div
-                                       [:p "upload graph failed"]]
-                                      :error])
-           (prn ::download-graph-failed e))))
-     nil))
+                                       [:p "Upload graph successfully"]]])
+           (catch :default e
+             (worker-util/post-message :notification
+                                       [[:div
+                                         [:p "upload graph failed"]]
+                                        :error])
+             (prn ::download-graph-failed e)
+             (p/reject! d e)))))
+     d))
 
   (rtc-download-graph
    [this repo token graph-uuid]
-   (async/go
-     (let [state (<! (rtc-core/<init-state repo token false))]
-       (try
-         (<? (rtc-updown/<download-graph state repo graph-uuid))
-         (worker-util/post-message :notification
-                                   [[:div
-                                     [:p "download graph successfully"]]])
-         (catch :default e
-           (worker-util/post-message :notification
-                                     [[:div
-                                       [:p "download graph failed"]]
-                                      :error])
-           (prn ::download-graph-failed e)))))
-   nil)
+   (async-util/c->p
+    (async/go
+      (let [state (<! (rtc-core/<init-state repo token false))]
+        (try
+          (<? (rtc-updown/<download-graph state repo graph-uuid))
+          (worker-util/post-message :notification
+                                    [[:div
+                                      [:p "download graph successfully"]]])
+          (catch :default e
+            (worker-util/post-message :notification
+                                      [[:div
+                                        [:p "download graph failed"]]
+                                       :error])
+            (prn ::download-graph-failed e)))))))
 
   (rtc-push-pending-ops
    [_this]
-   (async/put! (:force-push-client-ops-chan @rtc-core/*state) true)
-   nil)
+   (async-util/c->p
+    (async/put! (:force-push-client-ops-chan @rtc-core/*state) true)))
 
   (rtc-get-graphs
    [_this repo token]

+ 2 - 1
src/main/frontend/handler/repo.cljs

@@ -195,7 +195,8 @@
            _ (state/pub-event! [:init/commands])
            _ (when-not file-graph-import? (state/pub-event! [:page/create (date/today) {:redirect? false}]))]
      (js/setTimeout ui-handler/re-render-root! 100)
-     (prn "New db created: " full-graph-name))
+     (prn "New db created: " full-graph-name)
+     full-graph-name)
    (p/catch (fn [error]
               (notification/show! "Create graph failed." :error)
               (js/console.error error)))))

+ 15 - 1
src/main/frontend/worker/async_util.cljc

@@ -1,6 +1,8 @@
 (ns frontend.worker.async-util
   "Some cljs.core.async relate macros and fns.
-  see also: https://gist.github.com/vvvvalvalval/f1250cec76d3719a8343")
+  see also: https://gist.github.com/vvvvalvalval/f1250cec76d3719a8343"
+  #?(:cljs (:require [promesa.core :as p]
+                     [clojure.core.async :as async])))
 
 (defmacro go-try
   [& body]
@@ -19,3 +21,15 @@
 (defmacro <?
   [port]
   `(throw-err (cljs.core.async/<! ~port)))
+
+#?(:cljs
+   (defn c->p
+     "Converts a Core.async channel to a Promise"
+     [chan]
+     (let [d (p/deferred)]
+       (if chan
+         (async/go
+           (let [result (async/<! chan)]
+             (p/resolve! d result)))
+         (p/resolve! d nil))
+       d)))