handler.cljs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. (ns frontend.handler
  2. (:require [frontend.state :as state]
  3. [frontend.db :as db]
  4. [frontend.db-schema :as db-schema]
  5. [frontend.util :as util :refer-macros [profile]]
  6. [frontend.config :as config]
  7. [frontend.storage :as storage]
  8. [clojure.string :as string]
  9. [promesa.core :as p]
  10. [cljs-bean.core :as bean]
  11. [frontend.date :as date]
  12. [frontend.search :as search]
  13. [frontend.search.db :as search-db]
  14. [frontend.handler.notification :as notification]
  15. [frontend.handler.page :as page-handler]
  16. [frontend.handler.repo :as repo-handler]
  17. [frontend.handler.file :as file-handler]
  18. [frontend.handler.editor :as editor-handler]
  19. [frontend.handler.ui :as ui-handler]
  20. [frontend.handler.web.nfs :as nfs]
  21. [frontend.modules.shortcut.core :as shortcut]
  22. [frontend.handler.events :as events]
  23. [frontend.fs.watcher-handler :as fs-watcher-handler]
  24. [frontend.ui :as ui]
  25. [goog.object :as gobj]
  26. [frontend.idb :as idb]
  27. [lambdaisland.glogi :as log]
  28. [frontend.handler.common :as common-handler]
  29. [electron.listener :as el]
  30. [electron.ipc :as ipc]
  31. [frontend.version :as version]
  32. [frontend.components.page :as page]
  33. [frontend.components.editor :as editor]))
  34. (defn- watch-for-date!
  35. []
  36. (let [f (fn []
  37. (when-not (state/nfs-refreshing?)
  38. ;; Don't create the journal file until user writes something
  39. (repo-handler/create-today-journal! false))
  40. (when-let [repo (state/get-current-repo)]
  41. (when (and (search-db/empty? repo)
  42. (state/input-idle? repo))
  43. (search/rebuild-indices!))))]
  44. (f)
  45. (js/setInterval f 5000)))
  46. (defn store-schema!
  47. []
  48. (storage/set :db-schema db-schema/schema))
  49. (defn- get-me-and-repos
  50. []
  51. (let [me (and js/window.user (bean/->clj js/window.user))
  52. logged? (:name me)
  53. repos (if logged?
  54. (:repos me)
  55. [{:url config/local-repo}])]
  56. {:me me
  57. :logged? logged?
  58. :repos repos}))
  59. (defn restore-and-setup!
  60. [me repos logged?]
  61. (let [interval (atom nil)
  62. inner-fn (fn []
  63. (when (and @interval js/window.pfs)
  64. (js/clearInterval @interval)
  65. (reset! interval nil)
  66. (-> (p/all (db/restore! (assoc me :repos repos)
  67. (fn [repo]
  68. (file-handler/restore-config! repo false)
  69. (ui-handler/add-style-if-exists!))))
  70. (p/then
  71. (fn []
  72. (cond
  73. (and (not logged?)
  74. (not (seq (db/get-files config/local-repo)))
  75. ;; Not native local directory
  76. (not (some config/local-db? (map :url repos))))
  77. (repo-handler/setup-local-repo-if-not-exists!)
  78. :else
  79. (state/set-db-restoring! false))
  80. (if false ; FIXME: incompatible changes
  81. (notification/show!
  82. [:p "Database schema changed, please export your notes as a zip file, and re-index your repos."]
  83. :warning
  84. false)
  85. (store-schema!))
  86. (state/pub-event! [:modal/nfs-ask-permission])
  87. (page-handler/init-commands!)
  88. (when (seq (:repos me))
  89. ;; FIXME: handle error
  90. (common-handler/request-app-tokens!
  91. (fn []
  92. (repo-handler/clone-and-pull-repos me))
  93. (fn []
  94. (js/console.error "Failed to request GitHub app tokens."))))
  95. (watch-for-date!)
  96. (file-handler/watch-for-local-dirs!)))
  97. (p/catch (fn [error]
  98. (log/error :db/restore-failed error))))))]
  99. ;; clear this interval
  100. (let [interval-id (js/setInterval inner-fn 50)]
  101. (reset! interval interval-id))))
  102. (defn- handle-connection-change
  103. [e]
  104. (let [online? (= (gobj/get e "type") "online")]
  105. (state/set-online! online?)))
  106. (defn set-network-watcher!
  107. []
  108. (js/window.addEventListener "online" handle-connection-change)
  109. (js/window.addEventListener "offline" handle-connection-change))
  110. (defn- get-repos
  111. []
  112. (let [logged? (state/logged?)
  113. me (state/get-me)]
  114. (p/let [nfs-dbs (idb/get-nfs-dbs)
  115. nfs-dbs (map (fn [db]
  116. {:url db :nfs? true}) nfs-dbs)]
  117. (cond
  118. logged?
  119. (concat
  120. nfs-dbs
  121. (:repos me))
  122. (seq nfs-dbs)
  123. nfs-dbs
  124. :else
  125. [{:url config/local-repo
  126. :example? true}]))))
  127. (defn init-sentry
  128. []
  129. (when-not (state/sentry-disabled?)
  130. (let [cfg
  131. {:dsn "https://[email protected]/5311485"
  132. :release (util/format "logseq@%s" version/version)}]
  133. (.init js/window.Sentry (clj->js cfg)))))
  134. (defn on-load-events
  135. []
  136. (let [f (fn []
  137. (when-not config/dev? (init-sentry)))]
  138. (set! js/window.onload f)))
  139. (defn clear-cache!
  140. []
  141. (p/let [_ (idb/clear-local-storage-and-idb!)
  142. _ (when (util/electron?)
  143. (ipc/ipc "clearCache"))]
  144. (js/window.location.reload)))
  145. (defn- register-components-fns!
  146. []
  147. (state/set-page-blocks-cp! page/page-blocks-cp)
  148. (state/set-editor-cp! editor/box))
  149. (defn start!
  150. [render]
  151. (let [{:keys [me logged? repos]} (get-me-and-repos)]
  152. (when me (state/set-state! :me me))
  153. (register-components-fns!)
  154. (state/set-db-restoring! true)
  155. (render)
  156. (on-load-events)
  157. (set-network-watcher!)
  158. (util/indexeddb-check?
  159. (fn [_error]
  160. (notification/show! "Sorry, it seems that your browser doesn't support IndexedDB, we recommend to use latest Chrome(Chromium) or Firefox(Non-private mode)." :error false)
  161. (state/set-indexedb-support! false)))
  162. (events/run!)
  163. (p/let [repos (get-repos)]
  164. (state/set-repos! repos)
  165. (restore-and-setup! me repos logged?))
  166. (reset! db/*sync-search-indice-f search/sync-search-indice!)
  167. (db/run-batch-txs!)
  168. (file-handler/run-writes-chan!)
  169. (shortcut/install-shortcuts!)
  170. (when (util/electron?)
  171. (el/listen!))))
  172. (defn stop! []
  173. (prn "stop!"))