Skip to content

Commit 9fff03b

Browse files
committed
introduce file-read-as effect and refactor
1 parent 76e997c commit 9fff03b

File tree

11 files changed

+59
-69
lines changed

11 files changed

+59
-69
lines changed

src/renderer/app/effects.cljs

+15
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,21 @@
102102
(.catch #(when on-error (rf/dispatch (conj on-error %)))))
103103
(legacy-file-open! success-cb)))))
104104

105+
(rf/reg-fx
106+
::file-read-as
107+
(fn [[^js/File file method events]]
108+
(let [reader (js/FileReader.)]
109+
(doseq
110+
[[event {:keys [formatter on-fire]}] events]
111+
(.addEventListener reader event
112+
#(rf/dispatch (conj on-fire
113+
(cond-> (.-result reader)
114+
formatter
115+
formatter)))))
116+
(case method
117+
:data-url (.readAsDataURL reader file)
118+
:text (.readAsText reader file)))))
119+
105120
(rf/reg-fx
106121
::download
107122
(fn [{:keys [data title]}]

src/renderer/attribute/impl/href.cljs

+6-11
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
(:require
44
[clojure.string :as str]
55
[re-frame.core :as rf]
6+
[renderer.app.effects :as-alias app.fx]
67
[renderer.app.events :as app.e]
78
[renderer.attribute.hierarchy :as hierarchy]
89
[renderer.attribute.views :as v]
910
[renderer.element.events :as-alias element.e]
11+
[renderer.notification.events :as-alias notification.e]
1012
[renderer.tool.events :as-alias tool.e]
1113
[renderer.tool.handlers :as tool.h]
1214
[renderer.tool.subs :as-alias tool.s]
@@ -42,14 +44,7 @@
4244
::success
4345
(fn [{:keys [db]} [_ file]]
4446
{:db (tool.h/activate db :transform)
45-
::update-href file}))
46-
47-
(rf/reg-fx
48-
::update-href
49-
(fn [^js/File file]
50-
(let [reader (js/FileReader.)]
51-
(.addEventListener
52-
reader
53-
"load"
54-
#(rf/dispatch [::element.e/set-attr :href (.-result reader)]))
55-
(.readAsDataURL reader file))))
47+
::app.fx/file-read-as [file
48+
:data-url
49+
{"load" {:on-fire [::element.e/set-attr :href]}
50+
"error" {:on-fire [::notification.e/exception]}}]}))

src/renderer/core.cljs

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
[renderer.attribute.impl.core]
1414
[renderer.dialog.events]
1515
[renderer.dialog.subs]
16-
[renderer.document.effects]
1716
[renderer.document.events :as document.e]
1817
[renderer.document.subs]
1918
[renderer.element.effects]

src/renderer/document/effects.cljs

-19
This file was deleted.

src/renderer/document/events.cljs

+7-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
[renderer.dialog.handlers :as dialog.h]
1212
[renderer.dialog.views :as dialog.v]
1313
[renderer.document.db :as db]
14-
[renderer.document.effects :as-alias fx]
1514
[renderer.document.handlers :as h]
1615
[renderer.element.handlers :as element.h]
1716
[renderer.history.handlers :as history.h]
@@ -192,7 +191,13 @@
192191
(rf/reg-event-fx
193192
::file-read
194193
(fn [_ [_ file]]
195-
{::fx/read file}))
194+
{::app.fx/file-read-as [file
195+
:text
196+
{"load" {:formatter #(-> (edn/read-string %)
197+
(assoc :title (.-name file)
198+
:path (.-path file)))
199+
:on-fire [::load]}
200+
"error" {:on-fire [::notification.e/exception]}}]}))
196201

197202
(rf/reg-event-fx
198203
::open-directory

src/renderer/element/effects.cljs

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
:on-success [::e/traced]}])))))))
4949

5050
(rf/reg-fx
51-
::add-image
51+
::import-image
5252
(fn [[^js/File file [x y]]]
5353
(let [reader (js/FileReader.)]
5454
(.addEventListener

src/renderer/element/events.cljs

+22-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
[clojure.string :as str]
44
[re-frame.core :as rf]
55
[renderer.app.effects :as-alias app.fx]
6+
[renderer.document.events :as-alias document.e]
67
[renderer.element.effects :as-alias fx]
78
[renderer.element.handlers :as h]
89
[renderer.history.handlers :as history.h]
@@ -263,7 +264,7 @@
263264
(history.h/finalize (str "Create " (name (:tag el)))))))
264265

265266
(rf/reg-event-db
266-
::import
267+
::import-svg
267268
(fn [db [_ data]]
268269
(-> (h/import-svg db data)
269270
(history.h/finalize "Import svg"))))
@@ -331,6 +332,23 @@
331332
(history.h/finalize "Trace image"))))
332333

333334
(rf/reg-event-fx
334-
::add-image
335-
(fn [_ [_ file position]]
336-
{::fx/add-image [file position]}))
335+
::file-import-at
336+
(fn [_ [_ position file]]
337+
(when-let [file-type (.-type file)]
338+
(cond
339+
(= file-type "image/svg+xml")
340+
{::app.fx/file-read-as [file
341+
:text
342+
{"load" {:formatter #(hash-map :svg %
343+
:label (.-name file)
344+
:position position)
345+
:on-fire [::import-svg]}
346+
"error" {:on-fire [::notification.e/exception]}}]}
347+
348+
(contains? #{"image/jpeg" "image/png" "image/bmp" "image/gif"} file-type)
349+
{::fx/import-image [file position]}
350+
351+
:else
352+
(let [extension (last (str/split (.-name file) "."))]
353+
(when (= extension "rps")
354+
{:dispatch [::document.e/file-read file]}))))))

src/renderer/tool/effects.cljs

+3-25
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
(ns renderer.tool.effects
22
(:require
3-
[clojure.string :as str]
43
[re-frame.core :as rf]
5-
[renderer.document.events :as document.e]
64
[renderer.element.events :as-alias element.e]
75
[renderer.utils.dom :as dom]))
86

@@ -20,33 +18,13 @@
2018
::drop
2119
(fn [[position data-transfer]]
2220
(doseq [item (.-items data-transfer)]
23-
(case (.-kind item)
24-
"string"
21+
(when (= (.-kind item) "string")
2522
(let [[x y] position]
2623
(.getAsString item #(rf/dispatch [::element.e/add {:type :element
2724
:tag :text
2825
:content %
2926
:attrs {:x x
30-
:y y}}])))
31-
nil))
27+
:y y}}])))))
3228

3329
(doseq [file (.-files data-transfer)]
34-
(when-let [file-type (.-type file)]
35-
(cond
36-
(= file-type "image/svg+xml")
37-
(let [reader (js/FileReader.)]
38-
(.addEventListener
39-
reader
40-
"load"
41-
#(rf/dispatch [::element.e/import {:svg (.-result reader)
42-
:label (.-name file)
43-
:position position}]))
44-
(.readAsText reader file))
45-
46-
(contains? #{"image/jpeg" "image/png" "image/bmp" "image/gif"} file-type)
47-
(rf/dispatch [::element.e/add-image file position])
48-
49-
:else
50-
(let [extension (last (str/split (.-name file) "."))]
51-
(when (= extension "rps")
52-
(rf/dispatch [::document.e/file-read file]))))))))
30+
(rf/dispatch [::element.e/file-import-at position file]))))

src/renderer/tool/impl/element/image.cljs

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,5 @@
2929
::success
3030
(fn [{:keys [db]} [_ file]]
3131
{:db (tool.h/activate db :transform)
32-
::element.fx/add-image [file (or (:point (:nearest-neighbor db))
33-
(:adjusted-pointer-pos db))]}))
32+
::element.fx/import-image [file (or (:point (:nearest-neighbor db))
33+
(:adjusted-pointer-pos db))]}))

test/core_test.cljs

-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
[renderer.app.events :as app.e]
88
[renderer.app.subs]
99
[renderer.dialog.events]
10-
[renderer.document.effects]
1110
[renderer.document.events]
1211
[renderer.document.subs]
1312
[renderer.element.effects]

test/element_test.cljs

+3-3
Original file line numberDiff line numberDiff line change
@@ -352,9 +352,9 @@
352352
(rf/dispatch [::app.e/initialize-db])
353353
(rf/dispatch [::document.e/init])
354354
(let [selected (rf/subscribe [::s/selected])]
355-
(rf/dispatch [::e/import {:svg "<svg x=\"100\" y=\"100\" width=\"200\" height=\"200\"></svg>"
356-
:label "filename.svg"
357-
:position [500 500]}])
355+
(rf/dispatch [::e/import-svg {:svg "<svg x=\"100\" y=\"100\" width=\"200\" height=\"200\"></svg>"
356+
:label "filename.svg"
357+
:position [500 500]}])
358358
(is (= (-> @selected first :tag) :svg))
359359
(is (= (-> @selected first :label) "filename.svg"))
360360
(is (= (-> @selected first :attrs :x) "500"))

0 commit comments

Comments
 (0)