theme.cljs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. (ns frontend.components.theme
  2. (:require [frontend.extensions.pdf.core :as pdf]
  3. [frontend.config :as config]
  4. [frontend.handler.plugin :as plugin-handler]
  5. [frontend.handler.plugin-config :as plugin-config-handler]
  6. [frontend.handler.route :as route-handler]
  7. [frontend.handler.ui :as ui-handler]
  8. [frontend.ui :as ui]
  9. [frontend.util :as util]
  10. [frontend.state :as state]
  11. [frontend.components.settings :as settings]
  12. [frontend.rum :refer [use-mounted]]
  13. [frontend.storage :as storage]
  14. [rum.core :as rum]
  15. [frontend.context.i18n :refer [t]]))
  16. (rum/defc container
  17. [{:keys [route theme on-click current-repo nfs-granted? db-restoring?
  18. settings-open? sidebar-open? system-theme? sidebar-blocks-len onboarding-state preferred-language]} child]
  19. (let [mounted-fn (use-mounted)
  20. [restored-sidebar? set-restored-sidebar?] (rum/use-state false)]
  21. (rum/use-effect!
  22. #(let [doc js/document.documentElement
  23. cls (.-classList doc)]
  24. (.setAttribute doc "data-theme" theme)
  25. (if (= theme "dark") ;; for tailwind dark mode
  26. (.add cls "dark")
  27. (.remove cls "dark"))
  28. (ui/apply-custom-theme-effect! theme)
  29. (plugin-handler/hook-plugin-app :theme-mode-changed {:mode theme}))
  30. [theme])
  31. (rum/use-effect!
  32. #(let [doc js/document.documentElement]
  33. (.setAttribute doc "lang" preferred-language)))
  34. (rum/use-effect!
  35. #(when (and restored-sidebar?
  36. (mounted-fn))
  37. (plugin-handler/hook-plugin-app :sidebar-visible-changed {:visible sidebar-open?})
  38. (ui-handler/persist-right-sidebar-state!))
  39. [sidebar-open? restored-sidebar? sidebar-blocks-len])
  40. (rum/use-effect!
  41. #(when config/lsp-enabled?
  42. (plugin-handler/setup-install-listener!)
  43. (plugin-config-handler/setup-install-listener!)
  44. (plugin-handler/load-plugin-preferences)
  45. (fn []
  46. (js/window.apis.removeAllListeners (name :lsp-updates))))
  47. [])
  48. (rum/use-effect!
  49. (fn []
  50. (ui-handler/reset-custom-css!)
  51. (pdf/reset-current-pdf!)
  52. (plugin-handler/hook-plugin-app :current-graph-changed {}))
  53. [current-repo])
  54. (rum/use-effect!
  55. #(let [db-restored? (false? db-restoring?)]
  56. (if db-restoring?
  57. (util/set-title! (t :loading))
  58. (when (or nfs-granted? db-restored?)
  59. (route-handler/update-page-title! route))))
  60. [nfs-granted? db-restoring? route])
  61. (rum/use-effect!
  62. (fn []
  63. (when-not db-restoring?
  64. (let [repos (state/get-repos)]
  65. (if-not (or
  66. ;; demo graph only
  67. (and (= 1 (count repos)) (:example? (first repos))
  68. (not (util/mobile?)))
  69. ;; not in publishing mode
  70. config/publishing?
  71. ;; other graphs exists
  72. (seq repos))
  73. (route-handler/redirect! {:to :repo-add})
  74. (do
  75. (ui-handler/restore-right-sidebar-state!)
  76. (set-restored-sidebar? true))))))
  77. [db-restoring?])
  78. (rum/use-effect!
  79. #(when system-theme?
  80. (ui/setup-system-theme-effect!))
  81. [system-theme?])
  82. (rum/use-effect!
  83. #(state/set-modal!
  84. (when settings-open?
  85. (fn [] [:div.settings-modal (settings/settings)])))
  86. [settings-open?])
  87. (rum/use-effect!
  88. #(storage/set :file-sync/onboarding-state onboarding-state)
  89. [onboarding-state])
  90. [:div
  91. {:class (util/classnames
  92. [(str theme "-theme")
  93. {:white-theme (= "light" theme)}]) ; The white-theme is for backward compatibility. See: https://github.com/logseq/logseq/pull/4652.
  94. :on-click on-click}
  95. child
  96. (pdf/default-embed-playground)]))