route.cljs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. (ns frontend.handler.route
  2. (:require [clojure.string :as string]
  3. [frontend.date :as date]
  4. [frontend.db :as db]
  5. [frontend.handler.ui :as ui-handler]
  6. [frontend.handler.recent :as recent-handler]
  7. [frontend.handler.search :as search-handler]
  8. [frontend.state :as state]
  9. [frontend.text :as text]
  10. [frontend.util :as util]
  11. [logseq.graph-parser.util :as gp-util]
  12. [medley.core :as medley]
  13. [reitit.frontend.easy :as rfe]))
  14. (defn redirect!
  15. "If `push` is truthy, previous page will be left in history."
  16. [{:keys [to path-params query-params push]
  17. :or {push true}}]
  18. (let [route-fn (if push rfe/push-state rfe/replace-state)]
  19. (state/save-scroll-position! (util/scroll-top))
  20. (route-fn to path-params query-params))
  21. ;; force return nil for usage in render phase of React
  22. nil)
  23. (defn redirect-to-home!
  24. ([]
  25. (redirect-to-home! true))
  26. ([pub-event?]
  27. (when pub-event? (state/pub-event! [:redirect-to-home]))
  28. (redirect! {:to :home})))
  29. (defn redirect-to-all-pages!
  30. []
  31. (redirect! {:to :all-pages}))
  32. (defn redirect-to-graph-view!
  33. []
  34. (redirect! {:to :graph}))
  35. (defn redirect-to-page!
  36. "Must ensure `page-name` is dereferenced (not an alias), or it will create a wrong new page with that name (#3511)."
  37. ([page-name]
  38. (recent-handler/add-page-to-recent! (state/get-current-repo) page-name)
  39. (redirect! {:to :page
  40. :path-params {:name (str page-name)}}))
  41. ([page-name anchor]
  42. (recent-handler/add-page-to-recent! (state/get-current-repo) page-name)
  43. (redirect! {:to :page
  44. :path-params {:name (str page-name)}
  45. :query-params {:anchor anchor}}))
  46. ([page-name anchor push]
  47. (recent-handler/add-page-to-recent! (state/get-current-repo) page-name)
  48. (redirect! {:to :page
  49. :path-params {:name (str page-name)}
  50. :query-params {:anchor anchor}
  51. :push push})))
  52. (defn get-title
  53. [name path-params]
  54. (case name
  55. :home
  56. "Logseq"
  57. :repos
  58. "Repos"
  59. :repo-add
  60. "Add another repo"
  61. :graph
  62. "Graph"
  63. :all-files
  64. "All files"
  65. :all-pages
  66. "All pages"
  67. :all-journals
  68. "All journals"
  69. :file
  70. (str "File " (:path path-params))
  71. :new-page
  72. "Create a new page"
  73. :page
  74. (let [name (:name path-params)
  75. block? (gp-util/uuid-string? name)]
  76. (if block?
  77. (if-let [block (db/entity [:block/uuid (medley/uuid name)])]
  78. (let [content (text/remove-level-spaces (:block/content block)
  79. (:block/format block))]
  80. (if (> (count content) 48)
  81. (str (subs content 0 48) "...")
  82. content))
  83. "Page no longer exists!!")
  84. (let [page (db/pull [:block/name (util/page-name-sanity-lc name)])]
  85. (or (util/get-page-original-name page)
  86. "Logseq"))))
  87. :tag
  88. (str "#" (:name path-params))
  89. :diff
  90. "Git diff"
  91. :draw
  92. "Draw"
  93. :settings
  94. "Settings"
  95. :import
  96. "Import data into Logseq"
  97. "Logseq"))
  98. (defn update-page-title!
  99. [route]
  100. (let [{:keys [data path-params]} route
  101. title (get-title (:name data) path-params)]
  102. (util/set-title! title)))
  103. (defn update-page-label!
  104. [route]
  105. (let [{:keys [data]} route]
  106. (when-let [data-name (:name data)]
  107. (set! (. js/document.body.dataset -page) (name data-name)))))
  108. (defn jump-to-anchor!
  109. [anchor-text]
  110. (when anchor-text
  111. (js/setTimeout #(ui-handler/highlight-element! anchor-text) 200)))
  112. (defn set-route-match!
  113. [route]
  114. (let [route route]
  115. (swap! state/state assoc :route-match route)
  116. (update-page-title! route)
  117. (update-page-label! route)
  118. (if-let [anchor (get-in route [:query-params :anchor])]
  119. (jump-to-anchor! anchor)
  120. (util/scroll-to (util/app-scroll-container-node)
  121. (state/get-saved-scroll-position)
  122. false))))
  123. (defn go-to-search!
  124. [search-mode]
  125. (search-handler/clear-search! false)
  126. (when search-mode
  127. (state/set-search-mode! search-mode))
  128. (state/pub-event! [:go/search]))
  129. (defn go-to-journals!
  130. []
  131. (state/set-journals-length! 3)
  132. (let [route (if (state/custom-home-page?)
  133. :all-journals
  134. :home)]
  135. (redirect! {:to route}))
  136. (util/scroll-to-top))
  137. (defn- redirect-to-file!
  138. [page]
  139. (when-let [path (-> (db/get-page-file (string/lower-case page))
  140. :db/id
  141. (db/entity)
  142. :file/path)]
  143. (redirect! {:to :file
  144. :path-params {:path path}})))
  145. (defn toggle-between-page-and-file!
  146. [_e]
  147. (let [current-route (state/get-current-route)]
  148. (case current-route
  149. :home
  150. (redirect-to-file! (date/today))
  151. :all-journals
  152. (redirect-to-file! (date/today))
  153. :page
  154. (when-let [page-name (get-in (state/get-route-match) [:path-params :name])]
  155. (redirect-to-file! page-name))
  156. :file
  157. (when-let [path (get-in (state/get-route-match) [:path-params :path])]
  158. (when-let [page (db/get-file-page path)]
  159. (redirect-to-page! page)))
  160. nil)))