debug_ui.cljs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. (ns frontend.db.rtc.debug-ui
  2. "Debug UI for rtc module"
  3. (:require [fipp.edn :as fipp]
  4. [frontend.db :as db]
  5. [frontend.handler.user :as user]
  6. [frontend.state :as state]
  7. [frontend.ui :as ui]
  8. [frontend.util :as util]
  9. [rum.core :as rum]
  10. [frontend.persist-db.browser :as db-browser]
  11. [promesa.core :as p]
  12. [cljs-bean.core :as bean]))
  13. (defonce debug-state (atom nil))
  14. (defn- stop
  15. []
  16. (let [^object worker @db-browser/*worker]
  17. (.rtc-stop worker))
  18. (reset! debug-state nil))
  19. (defn- push-pending-ops
  20. []
  21. (let [^object worker @db-browser/*worker]
  22. (.rtc-push-pending-ops worker)))
  23. (rum/defc ^:large-vars/cleanup-todo rtc-debug-ui <
  24. rum/reactive
  25. []
  26. (let [state (rum/react debug-state)
  27. rtc-state (:rtc-state state)]
  28. [:div
  29. [:div.flex
  30. (ui/button "local-state"
  31. :class "mr-2"
  32. :icon "refresh"
  33. :on-click (fn [_]
  34. (let [repo (state/get-current-repo)
  35. ^object worker @db-browser/*worker]
  36. (p/let [result (.rtc-get-debug-state worker repo)
  37. debug-state (bean/->clj result)]
  38. (swap! debug-state (fn [old] (merge old debug-state)))))))
  39. (ui/button "graph-list"
  40. :icon "refresh"
  41. :on-click (fn [_]
  42. (let [token (state/get-auth-id-token)
  43. ^object worker @db-browser/*worker]
  44. (p/let [result (.rtc-get-graphs worker token)
  45. graph-list (bean/->clj result)]
  46. (swap! debug-state assoc :remote-graphs (map :graph-uuid graph-list))))))]
  47. [:pre.select-text
  48. (-> {:user-uuid (user/user-uuid)
  49. :graph (:graph-uuid state)
  50. :rtc-state rtc-state
  51. :ws (:ws-state state)
  52. :local-tx (:local-tx state)
  53. :pending-block-update-count (:unpushed-block-update-count state)
  54. :remote-graphs (:remote-graphs state)
  55. :auto-push-updates? (:auto-push-updates? state)
  56. :current-page (state/get-current-page)
  57. :blocks-count (when-let [page (state/get-current-page)]
  58. (count (:block/_page (db/entity [:block/name (util/page-name-sanity-lc page)]))))}
  59. (fipp/pprint {:width 20})
  60. with-out-str)]
  61. (if (or (nil? state)
  62. (= :closed rtc-state))
  63. (ui/button "start" {:class "my-2"
  64. :on-click (fn []
  65. (prn :start-rtc)
  66. (let [token (state/get-auth-id-token)
  67. ^object worker @db-browser/*worker]
  68. (.rtc-start worker (state/get-current-repo) token)))})
  69. [:div.my-2.flex
  70. [:div.mr-2 (ui/button (str "send pending ops")
  71. {:on-click (fn [] (push-pending-ops))})]
  72. [:div.mr-2 (ui/button (str "Toggle auto push updates("
  73. (if (:auto-push-client-ops? state)
  74. "ON" "OFF")
  75. ")")
  76. {:on-click
  77. (fn []
  78. (let [^object worker @db-browser/*worker]
  79. (p/let [result (.rtc-toggle-sync worker (state/get-current-repo))]
  80. (swap! debug-state assoc :auto-push-updates? result))))})]
  81. [:div (ui/button "stop" {:on-click (fn [] (stop))})]])
  82. (when (some? state)
  83. [:hr]
  84. [:div.flex.flex-row
  85. (ui/button "grant graph access to"
  86. {:class "mr-2"
  87. :on-click (fn []
  88. (let [user-uuid (some-> (:grant-access-to-user state) parse-uuid)
  89. user-email (when-not user-uuid (:grant-access-to-user state))]
  90. (when-let [graph-uuid (:graph-uuid state)]
  91. (let [^object worker @db-browser/*worker]
  92. (.rtc-grant-graph-access worker graph-uuid
  93. (some-> user-uuid vector)
  94. (some-> user-email vector))))))})
  95. [:input.form-input.my-2
  96. {:on-change (fn [e] (swap! debug-state assoc :grant-access-to-user (util/evalue e)))
  97. :on-focus (fn [e] (let [v (.-value (.-target e))]
  98. (when (= v "input email or user-uuid here")
  99. (set! (.-value (.-target e)) ""))))
  100. :default-value "input email or user-uuid here"}]])
  101. [:hr]
  102. [:div.flex.flex-row
  103. (ui/button (str "download graph to")
  104. {:class "mr-2"
  105. :on-click (fn []
  106. (when-let [repo (:download-graph-to-repo state)]
  107. (when-let [graph-uuid (:graph-uuid-to-download state)]
  108. (prn :download-graph graph-uuid :to repo)
  109. (let [token (state/get-auth-id-token)
  110. ^object worker @db-browser/*worker]
  111. (.rtc-download-graph worker repo token graph-uuid)))))})
  112. [:div.flex.flex-col
  113. [:select
  114. {:on-change (fn [e]
  115. (let [value (util/evalue e)]
  116. (swap! debug-state assoc :graph-uuid-to-download value)))}
  117. (if (seq (:remote-graphs state))
  118. (cons [:option {:key "select a remote graph" :value nil} "select a remote graph"]
  119. (for [graph-uuid (:remote-graphs state)]
  120. [:option {:key graph-uuid :value graph-uuid} (str (subs graph-uuid 0 14) "...")]))
  121. (list [:option {:key "refresh-first" :value nil} "refresh remote-graphs first"]))]
  122. [:input.form-input.my-2
  123. {:on-change (fn [e] (swap! debug-state assoc :download-graph-to-repo (util/evalue e)))
  124. :on-focus (fn [e] (let [v (.-value (.-target e))]
  125. (when (= v "repo name here")
  126. (set! (.-value (.-target e)) ""))))
  127. :default-value "repo name here"}]]]
  128. [:div.flex.my-2
  129. (ui/button (str "upload current repo")
  130. {:on-click (fn []
  131. (let [repo (state/get-current-repo)
  132. token (state/get-auth-id-token)
  133. ^js worker @db-browser/*worker]
  134. (.rtc-upload-graph worker repo token)))})]]))