Browse Source

enhance(rtc): add document-visible&rtc-not-running-flow

emit events when document is visible and rtc not running,
trigger by flows/document-visibility-state-flow
rcmerci 7 months ago
parent
commit
328f7ca301

+ 1 - 1
src/main/frontend/components/rtc/indicator.cljs

@@ -51,7 +51,7 @@
                                         :local-tx (:local-tx state)
                                         :remote-tx (:remote-tx state)
                                         :rtc-state (if (:rtc-lock state) :open :close)))
-                               rtc-flows/rtc-state-flow))
+                               rtc-flows/rtc-state-stream-flow))
                     ::update-detail-info)]
       (reset! *update-detail-info-canceler canceler))))
 (run-task--update-detail-info)

+ 3 - 2
src/main/frontend/flows.cljs

@@ -36,8 +36,9 @@
 (def document-visibility-state-flow
   (->> (m/observe
         (fn ctor [emit!]
-          (let [callback-fn (fn [] (emit! js/document.visibilityState))]
+          (let [callback-fn #(emit! js/document.visibilityState)]
             (.addEventListener ^js js/document "visibilitychange" callback-fn)
             (callback-fn)
             (fn dtor [] (.removeEventListener ^js js/document "visibilitychange" callback-fn)))))
-       (m/eduction (dedupe))))
+       (m/eduction (dedupe))
+       (m/relieve)))

+ 23 - 6
src/main/frontend/handler/db_based/rtc_flows.cljs

@@ -4,7 +4,8 @@
             [frontend.flows :as flows]
             [frontend.state :as state]
             [logseq.common.util :as common-util]
-            [missionary.core :as m]))
+            [missionary.core :as m])
+  (:import [missionary Cancelled]))
 
 (def rtc-log-flow
   (m/watch (:rtc/log @state/state)))
@@ -25,7 +26,10 @@
    rtc-log-flow))
 
 (def rtc-state-flow
-  (m/stream (m/watch (:rtc/state @state/state))))
+  (m/watch (:rtc/state @state/state)))
+
+(def rtc-state-stream-flow
+  (m/stream rtc-state-flow))
 
 (def rtc-online-users-flow
   (c.m/throttle
@@ -36,7 +40,7 @@
                       (:rtc-lock m))
              (:online-users m))))
     (dedupe)
-    rtc-state-flow)))
+    rtc-state-stream-flow)))
 
 (def ^:private network-online-change-flow
   (m/stream
@@ -60,7 +64,7 @@ conditions:
   (->> (m/latest
         (fn [rtc-state _ login-user]
           (assoc rtc-state :login-user login-user))
-        (c.m/continue-flow rtc-state-flow)
+        (c.m/continue-flow rtc-state-stream-flow)
         (c.m/continue-flow network-online-change-flow)
         flows/current-login-user-flow)
        (m/eduction
@@ -89,6 +93,19 @@ conditions:
   (assert (some? repo))
   (reset! *rtc-start-trigger repo))
 
+(def ^:private document-visible&rtc-not-running-flow
+  (m/ap
+    (let [visibility (m/?< flows/document-visibility-state-flow)]
+      (try
+        (if (= "visible" visibility)
+          (let [rtc-lock (:rtc-lock (m/? (m/reduce {} nil (m/eduction (take 1) rtc-state-flow))))]
+            (if (not rtc-lock)
+              :document-visible&rtc-not-running
+              (m/amb)))
+          (m/amb))
+        (catch Cancelled _
+          (m/amb))))))
+
 (def trigger-start-rtc-flow
   (->>
    [(m/eduction
@@ -101,8 +118,8 @@ conditions:
      (keep (fn [repo] (when repo [:trigger-rtc repo])))
      (m/watch *rtc-start-trigger))
     (m/eduction
-     (keep (fn [visibility] (when (= "visible" visibility) [:document-visible])))
-     flows/document-visibility-state-flow)]
+     (map vector)
+     document-visible&rtc-not-running-flow)]
    (apply c.m/mix)
    (m/eduction (filter (fn [_] (some? (state/get-auth-id-token)))))
    (c.m/debounce 200)))