handler.cljs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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.fs.watcher-handler :as fs-watcher-handler]
  23. [frontend.ui :as ui]
  24. [goog.object :as gobj]
  25. [frontend.idb :as idb]
  26. [lambdaisland.glogi :as log]
  27. [frontend.handler.common :as common-handler]
  28. [electron.listener :as el]
  29. [frontend.version :as version]))
  30. (defn- watch-for-date!
  31. []
  32. (let [f (fn []
  33. (when-not (state/nfs-refreshing?)
  34. ;; Don't create the journal file until user writes something
  35. (repo-handler/create-today-journal! false))
  36. (when-let [repo (state/get-current-repo)]
  37. (when (and (search-db/empty? repo)
  38. (state/input-idle? repo))
  39. (search/rebuild-indices!))))]
  40. (f)
  41. (js/setInterval f 5000)))
  42. (defn store-schema!
  43. []
  44. (storage/set :db-schema db-schema/schema))
  45. (defn schema-changed?
  46. []
  47. (when-let [schema (storage/get :db-schema)]
  48. (not= 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. (declare restore-and-setup!)
  60. (defn clear-stores-and-refresh!
  61. []
  62. (p/let [_ (idb/clear-local-storage-and-idb!)]
  63. (let [{:keys [me logged? repos]} (get-me-and-repos)]
  64. (js/window.location.reload))))
  65. (defn restore-and-setup!
  66. [me repos logged?]
  67. (let [interval (atom nil)
  68. inner-fn (fn []
  69. (when (and @interval js/window.pfs)
  70. (js/clearInterval @interval)
  71. (reset! interval nil)
  72. (-> (p/all (db/restore! (assoc me :repos repos)
  73. (fn [repo]
  74. (file-handler/restore-config! repo false)
  75. (ui-handler/add-style-if-exists!))))
  76. (p/then
  77. (fn []
  78. (cond
  79. (and (not logged?)
  80. (not (seq (db/get-files config/local-repo)))
  81. ;; Not native local directory
  82. (not (some config/local-db? (map :url repos))))
  83. (repo-handler/setup-local-repo-if-not-exists!)
  84. :else
  85. (state/set-db-restoring! false))
  86. (if false ; FIXME: incompatible changes
  87. (notification/show!
  88. [:p "Database schema changed, please export your notes as a zip file, and re-index your repos."]
  89. :warning
  90. false)
  91. (store-schema!))
  92. (nfs/ask-permission-if-local?)
  93. (page-handler/init-commands!)
  94. (when (seq (:repos me))
  95. ;; FIXME: handle error
  96. (common-handler/request-app-tokens!
  97. (fn []
  98. (repo-handler/clone-and-pull-repos me))
  99. (fn []
  100. (js/console.error "Failed to request GitHub app tokens."))))
  101. (watch-for-date!)
  102. (file-handler/watch-for-local-dirs!)))
  103. (p/catch (fn [error]
  104. (log/error :db/restore-failed error))))))]
  105. ;; clear this interval
  106. (let [interval-id (js/setInterval inner-fn 50)]
  107. (reset! interval interval-id))))
  108. (defn- handle-connection-change
  109. [e]
  110. (let [online? (= (gobj/get e "type") "online")]
  111. (state/set-online! online?)))
  112. (defn set-network-watcher!
  113. []
  114. (js/window.addEventListener "online" handle-connection-change)
  115. (js/window.addEventListener "offline" handle-connection-change))
  116. (defn- get-repos
  117. []
  118. (let [logged? (state/logged?)
  119. me (state/get-me)]
  120. (p/let [nfs-dbs (idb/get-nfs-dbs)
  121. nfs-dbs (map (fn [db]
  122. {:url db :nfs? true}) nfs-dbs)]
  123. (cond
  124. logged?
  125. (concat
  126. nfs-dbs
  127. (:repos me))
  128. (seq nfs-dbs)
  129. nfs-dbs
  130. :else
  131. [{:url config/local-repo
  132. :example? true}]))))
  133. (defn init-sentry
  134. []
  135. (let [cfg
  136. {:dsn "https://[email protected]/5311485"
  137. :release (util/format "logseq@%s" version/version)}]
  138. (.init js/window.Sentry (clj->js cfg))))
  139. (defn on-load-events
  140. []
  141. (let [f (fn []
  142. (when-not config/dev? (init-sentry)))]
  143. (set! js/window.onload f)))
  144. (defn start!
  145. [render]
  146. (let [{:keys [me logged? repos]} (get-me-and-repos)]
  147. (when me (state/set-state! :me me))
  148. (state/set-db-restoring! true)
  149. (render)
  150. (on-load-events)
  151. (set-network-watcher!)
  152. (util/indexeddb-check?
  153. (fn [_error]
  154. (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)
  155. (state/set-indexedb-support! false)))
  156. (p/let [repos (get-repos)]
  157. (state/set-repos! repos)
  158. (restore-and-setup! me repos logged?))
  159. (reset! db/*sync-search-indice-f search/sync-search-indice!)
  160. (db/run-batch-txs!)
  161. (file-handler/run-writes-chan!)
  162. (shortcut/install-shortcuts!)
  163. (when (util/electron?)
  164. (el/listen!))))
  165. (defn stop! []
  166. (prn "stop!"))