draw.cljs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. (ns frontend.handler.draw
  2. (:refer-clojure :exclude [load-file])
  3. (:require [frontend.util :as util :refer-macros [profile]]
  4. [frontend.fs :as fs]
  5. [promesa.core :as p]
  6. [frontend.state :as state]
  7. [frontend.db :as db]
  8. [frontend.handler.file :as file-handler]
  9. [frontend.handler.git :as git-handler]
  10. [frontend.date :as date]
  11. [frontend.config :as config]
  12. [frontend.storage :as storage]
  13. [clojure.string :as string]
  14. [cljs-time.core :as t]
  15. [cljs-time.coerce :as tc]))
  16. ;; state
  17. (defonce *files (atom nil))
  18. (defonce *current-file (atom nil))
  19. (defonce *current-title (atom ""))
  20. (defonce *file-loading? (atom nil))
  21. (defonce *elements (atom nil))
  22. (defonce *unsaved? (atom false))
  23. (defonce *search-files (atom []))
  24. (defonce *saving-title (atom nil))
  25. (defonce *excalidraw (atom nil))
  26. ;; TODO: refactor
  27. (defonce draw-state :draw-state)
  28. (defn get-draw-state []
  29. (storage/get draw-state))
  30. (defn set-draw-state! [value]
  31. (storage/set draw-state value))
  32. (defn set-k
  33. [k v]
  34. (when-let [repo (state/get-current-repo)]
  35. (let [state (get-draw-state)]
  36. (let [new-state (assoc-in state [repo k] v)]
  37. (set-draw-state! new-state)))))
  38. (defn set-last-file!
  39. [value]
  40. (set-k :last-file value))
  41. ;; excalidraw
  42. (defn create-draws-directory!
  43. [repo]
  44. (when repo
  45. (let [repo-dir (util/get-repo-dir repo)]
  46. (util/p-handle
  47. (fs/mkdir! (str repo-dir (str "/" config/default-draw-directory)))
  48. (fn [_result] nil)
  49. (fn [_error] nil)))))
  50. (defn save-excalidraw!
  51. [file data ok-handler]
  52. (let [path (str config/default-draw-directory "/" file)
  53. repo (state/get-current-repo)]
  54. (when repo
  55. (let [repo-dir (util/get-repo-dir repo)]
  56. (->
  57. (p/do!
  58. (create-draws-directory! repo)
  59. (fs/write-file! repo repo-dir path data nil)
  60. (git-handler/git-add repo path)
  61. (ok-handler file)
  62. (let [modified-at (tc/to-long (t/now))]
  63. (db/transact! repo
  64. [{:file/path path
  65. :file/last-modified-at modified-at}
  66. {:page/name file
  67. :page/file path
  68. :page/last-modified-at (tc/to-long (t/now))
  69. :page/journal? false}])))
  70. (p/catch (fn [error]
  71. (prn "Write file failed, path: " path ", data: " data)
  72. (js/console.dir error))))))))
  73. (defn get-all-excalidraw-files
  74. [ok-handler]
  75. (when-let [repo (state/get-current-repo)]
  76. (p/let [_ (create-draws-directory! repo)]
  77. (let [dir (str (util/get-repo-dir repo)
  78. "/"
  79. config/default-draw-directory)]
  80. (util/p-handle
  81. (fs/readdir dir)
  82. (fn [files]
  83. (let [files (-> (filter #(string/ends-with? % ".excalidraw") files)
  84. (distinct)
  85. (sort)
  86. (reverse))]
  87. (ok-handler files)))
  88. (fn [error]
  89. (js/console.dir error)))))))
  90. (defn load-excalidraw-file
  91. [file ok-handler]
  92. (when-let [repo (state/get-current-repo)]
  93. (util/p-handle
  94. (file-handler/load-file repo (str config/default-draw-directory "/" file))
  95. (fn [content]
  96. (ok-handler content))
  97. (fn [error]
  98. (prn "Error loading " file ": "
  99. error)))))
  100. (defonce default-content
  101. (util/format
  102. "{\n \"type\": \"excalidraw\",\n \"version\": 2,\n \"source\": \"%s\",\n \"elements\": [],\n \"appState\": {\n \"viewBackgroundColor\": \"#FFF\",\n \"gridSize\": null\n }\n}"
  103. config/website))
  104. (defn title->file-name
  105. [title]
  106. (when (not (string/blank? title))
  107. (let [title (string/lower-case (string/replace title " " "-"))]
  108. (str (date/get-date-time-string-2) "-" title ".excalidraw"))))
  109. (defn create-draw-with-default-content
  110. [current-file ok-handler]
  111. (when-let [repo (state/get-current-repo)]
  112. (p/let [exists? (fs/file-exists? (util/get-repo-dir repo)
  113. (str config/default-draw-directory current-file))]
  114. (when-not exists?
  115. (save-excalidraw! current-file default-content
  116. (fn [file]
  117. (reset! *files
  118. (distinct (conj @*files file)))
  119. (reset! *current-file file)
  120. (reset! *unsaved? false)
  121. (set-last-file! file)
  122. (reset! *saving-title nil)
  123. (ok-handler)))))))