indicator.cljs 1.4 KB

12345678910111213141516171819202122232425262728293031323334
  1. (ns frontend.components.rtc.indicator
  2. "RTC state indicator"
  3. (:require [rum.core :as rum]
  4. [frontend.ui :as ui]
  5. [logseq.shui.ui :as shui]
  6. [frontend.state :as state]
  7. [frontend.util :as util]))
  8. (rum/defc details
  9. [{:keys [unpushed-block-update-count]}]
  10. [:div.cp__rtc-sync-details.text-sm
  11. (cond
  12. (zero? unpushed-block-update-count)
  13. "All local changes have been synced."
  14. (pos? unpushed-block-update-count)
  15. (str "Unsaved local changes: " unpushed-block-update-count))])
  16. (rum/defc indicator < rum/reactive
  17. []
  18. (let [_ (state/sub :auth/id-token)
  19. online? (state/sub :network/online?)
  20. {:keys [rtc-state unpushed-block-update-count] :as state}
  21. (state/sub :rtc/state)]
  22. [:div.cp__rtc-sync
  23. [:div.cp__rtc-sync-indicator
  24. [:a.button.cloud
  25. {:on-click #(shui/popup-show! (.-target %)
  26. (details state)
  27. {:align "end"})
  28. :class (util/classnames [{:on (and online? (= :open rtc-state))
  29. :idle (and online? (= :open rtc-state) (zero? unpushed-block-update-count))
  30. :queuing (pos? unpushed-block-update-count)}])}
  31. [:span.flex.items-center
  32. (ui/icon "cloud" {:size ui/icon-size})]]]]))