Skip to content

Commit d243a9e

Browse files
committed
refactor effects and improve error handling
1 parent 2aba696 commit d243a9e

File tree

20 files changed

+208
-142
lines changed

20 files changed

+208
-142
lines changed

src/electron/file.cljs

+13-12
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,17 @@
9090

9191
(defn print!
9292
[content]
93-
(let [window (BrowserWindow.
94-
#js {:show false
95-
:frame false})]
96-
(.on (.-webContents window) "did-finish-load"
97-
#(.print
98-
(.-webContents window)
99-
#js {}
100-
(fn [success, error]
101-
(if success
102-
(js/Promise.resolve nil)
103-
(js/Promise.reject error)))))
93+
(let [window (BrowserWindow. #js {:show false
94+
:frame false})]
95+
(js/Promise.
96+
(fn [res rej]
97+
(.on (.-webContents window) "did-finish-load"
98+
#(.print
99+
(.-webContents window)
100+
#js {}
101+
(fn [success error]
102+
(if success
103+
(res)
104+
(rej error)))))
104105

105-
(.loadURL window (str "data:text/html;charset=utf-8," content))))
106+
(.loadURL window (str "data:text/html;charset=utf-8," content))))))

src/renderer/app/effects.cljs

+5-11
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
[renderer.history.handlers :as history.h]
99
[renderer.notification.events :as-alias notification.e]
1010
[renderer.utils.dom :as dom]
11-
[renderer.utils.drop :as drop]
1211
[renderer.utils.file :as file]))
1312

1413
(rf.storage/reg-co-fx! config/app-key {:cofx :store})
@@ -39,12 +38,6 @@
3938
(fn [coeffects _]
4039
(assoc coeffects :now (.now js/Date))))
4140

42-
(rf/reg-fx
43-
::data-transfer
44-
(fn [[position data-transfer]]
45-
(drop/items! position (.-items data-transfer))
46-
(drop/files! position (.-files data-transfer))))
47-
4841
(rf/reg-fx
4942
::persist
5043
(fn [db]
@@ -79,17 +72,18 @@
7972

8073
(rf/reg-fx
8174
::query-local-fonts
82-
(fn [{:keys [on-resolution formatter]}]
75+
(fn [{:keys [on-success on-error formatter]}]
8376
(when-not (undefined? js/window.queryLocalFonts)
8477
(-> (.queryLocalFonts js/window)
85-
(.then #(rf/dispatch [on-resolution (cond-> % formatter formatter)]))))))
78+
(.then #(when on-success (rf/dispatch (conj on-success (cond-> % formatter formatter)))))
79+
(.catch #(when on-error (rf/dispatch (conj on-error %))))))))
8680

8781
(rf/reg-fx
88-
::save
82+
::file-save
8983
file/save!)
9084

9185
(rf/reg-fx
92-
::open
86+
::file-open
9387
file/open!)
9488

9589
(rf/reg-fx

src/renderer/app/events.cljs

+17-8
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
[renderer.notification.handlers :as notification.h]
1010
[renderer.notification.views :as notification.v]
1111
[renderer.utils.i18n :as i18n]
12-
[renderer.utils.system :as system]
1312
[renderer.window.effects :as-alias window.fx]))
1413

1514
(rf/reg-event-db
@@ -86,10 +85,20 @@
8685
(rf/reg-event-fx
8786
::load-system-fonts
8887
(fn [_ [_ file-path]]
89-
(if system/electron?
90-
{::window.fx/ipc-invoke {:channel "load-system-fonts"
91-
:data file-path
92-
:on-resolution ::set-system-fonts
93-
:formatter #(js->clj % :keywordize-keys true)}}
94-
{::fx/query-local-fonts {:on-resolution ::set-system-fonts
95-
:formatter #(mapv ->font-map %)}})))
88+
{::window.fx/ipc-invoke {:channel "load-system-fonts"
89+
:data file-path
90+
:on-success [::set-system-fonts]
91+
:on-error [::notification.e/exception]
92+
:formatter #(js->clj % :keywordize-keys true)}}))
93+
94+
(rf/reg-event-fx
95+
::query-local-fonts
96+
(fn [_ _]
97+
{::fx/query-local-fonts {:on-success [::set-system-fonts]
98+
:on-error [::notification.e/exception]
99+
:formatter #(mapv ->font-map %)}}))
100+
101+
(rf/reg-event-fx
102+
::file-open
103+
(fn [_ [_ options]]
104+
{::fx/file-open options}))

src/renderer/attribute/impl/font_family.cljs

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
{:modal true
4949
:onOpenChange (fn [state]
5050
(when (and state (empty? suggestions))
51-
(rf/dispatch [::app.e/load-system-fonts])))}
51+
(rf/dispatch [::app.e/query-local-fonts])))}
5252
[:> Popover/Trigger
5353
{:class "form-control-button"
5454
:disabled (:disabled attrs)}

src/renderer/attribute/impl/href.cljs

+25-19
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,20 @@
33
(:require
44
[clojure.string :as str]
55
[re-frame.core :as rf]
6+
[renderer.app.events :as app.e]
67
[renderer.attribute.hierarchy :as hierarchy]
78
[renderer.attribute.views :as v]
89
[renderer.element.events :as-alias element.e]
910
[renderer.tool.events :as-alias tool.e]
11+
[renderer.tool.handlers :as tool.h]
1012
[renderer.tool.subs :as-alias tool.s]
11-
[renderer.ui :as ui]
12-
[renderer.utils.file :as file]))
13+
[renderer.ui :as ui]))
1314

1415
(defmethod hierarchy/description [:default :href]
1516
[]
1617
"The href attribute defines a link to a resource as a reference URL.
1718
The exact meaning of that link depends on the context of each element using it.")
1819

19-
(defn update-href!
20-
[^js/File file]
21-
(let [reader (js/FileReader.)]
22-
(.addEventListener
23-
reader
24-
"load"
25-
#(rf/dispatch [::element.e/set-attr :href (.-result reader)]))
26-
(.readAsDataURL reader file)))
27-
2820
(defmethod hierarchy/form-element [:default :href]
2921
[_ k v {:keys [disabled]}]
3022
(let [state-default? (= @(rf/subscribe [::tool.s/state]) :idle)
@@ -38,12 +30,26 @@
3830
[:button.form-control-button
3931
{:title "Select file"
4032
:disabled disabled
41-
:on-click #(file/open!
42-
{:options {:startIn "pictures"
43-
:types [{:accept {"image/png" [".png"]
44-
"image/jpeg" [".jpeg" ".jpg"]
45-
"image/bmp" [".fmp"]}}]}
46-
:callback (fn [file]
47-
(rf/dispatch [::tool.e/activate :transform])
48-
(update-href! file))})}
33+
:on-click #(rf/dispatch
34+
[::app.e/file-open {:options {:startIn "pictures"
35+
:types [{:accept {"image/png" [".png"]
36+
"image/jpeg" [".jpeg" ".jpg"]
37+
"image/bmp" [".fmp"]}}]}
38+
:on-success [::success]}])}
4939
[ui/icon "folder"]]]))
40+
41+
(rf/reg-event-fx
42+
::success
43+
(fn [{:keys [db]} [_ file]]
44+
{: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))))

src/renderer/color/effects.cljs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
(fn [{:keys [on-success on-error]}]
1010
(-> (js/EyeDropper.)
1111
(.open)
12-
(.then (fn [color] (when on-success (rf/dispatch [on-success color]))))
13-
(.catch (fn [error] (when on-error (rf/dispatch [on-error error])))))))
12+
(.then (fn [color] (when on-success (rf/dispatch (conj on-success color)))))
13+
(.catch (fn [error] (when on-error (rf/dispatch (conj on-error error))))))))

src/renderer/core.cljs

+3-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
[renderer.color.events]
1616
[renderer.dialog.events]
1717
[renderer.dialog.subs]
18+
[renderer.document.effects]
1819
[renderer.document.events :as document.e]
1920
[renderer.document.subs]
2021
[renderer.element.effects]
@@ -124,14 +125,14 @@
124125
(rf/dispatch-sync [::theme.e/set-native-mode (theme.fx/native-mode! theme.fx/native-query!)])
125126
(rf/dispatch-sync [::theme.e/add-native-listener])
126127
(rf/dispatch-sync [::theme.e/set-document-attr])
127-
(rf/dispatch-sync [::app.e/load-system-fonts])
128128
(rf/dispatch-sync [::rp/add-keyboard-event-listener "keydown"])
129129
(rf/dispatch-sync [::rp/set-keydown-rules keyb/keydown-rules])
130130

131131
(.setup paper)
132132

133133
(if system/electron?
134-
(register-ipc-on-events!)
134+
(do (register-ipc-on-events!)
135+
(rf/dispatch [::app.e/load-system-fonts]))
135136
(add-listeners!))
136137

137138
(mount-root!))

src/renderer/document/effects.cljs

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
(ns renderer.document.effects
2+
(:require
3+
[clojure.edn :as edn]
4+
[re-frame.core :as rf]
5+
[renderer.document.events :as-alias document.e]))
6+
7+
(rf/reg-fx
8+
::read
9+
(fn [^js/File file]
10+
(let [reader (js/FileReader.)]
11+
(.addEventListener
12+
reader
13+
"load"
14+
#(let [document (-> (.. % -target -result)
15+
(edn/read-string)
16+
(assoc :title (.-name file)
17+
:path (.-path file)))]
18+
(rf/dispatch [::document.e/load document])))
19+
(.readAsText reader file))))

src/renderer/document/events.cljs

+44-24
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
[renderer.dialog.handlers :as dialog.h]
1010
[renderer.dialog.views :as dialog.v]
1111
[renderer.document.db :as db]
12+
[renderer.document.effects :as-alias fx]
1213
[renderer.document.handlers :as h]
1314
[renderer.element.handlers :as element.h]
1415
[renderer.history.handlers :as history.h]
16+
[renderer.notification.events :as notification.e]
1517
[renderer.notification.handlers :as notification.h]
1618
[renderer.notification.views :as notification.v]
1719
[renderer.snap.handlers :as snap.h]
@@ -169,13 +171,24 @@
169171
(if system/electron?
170172
{::window.fx/ipc-invoke {:channel "open-documents"
171173
:data file-path
172-
:on-resolution ::load-multiple
174+
:on-success [::load-multiple]
175+
:on-error [::notification.e/exception]
173176
:formatter #(mapv edn/read-string %)}}
174-
{::app.fx/open {:options file-picker-options
175-
:on-resolution ::load
176-
:formatter #(-> (edn/read-string %)
177-
(assoc :title (.-name %)
178-
:path (.-path %)))}})))
177+
{::app.fx/file-open {:options file-picker-options
178+
:on-success [::file-read]
179+
:on-error [::file-error]}})))
180+
181+
(rf/reg-event-fx
182+
::file-read
183+
(fn [_ [_ file]]
184+
{::fx/read file}))
185+
186+
(rf/reg-event-fx
187+
::file-error
188+
(fn [{:keys [db]} [_ ^js/Error error]]
189+
(cond-> db
190+
(not= (.-name error) "AbortError")
191+
(notification.h/add (notification.v/exception error)))))
179192

180193
(rf/reg-event-fx
181194
::open-directory
@@ -212,13 +225,15 @@
212225
(if system/electron?
213226
{::window.fx/ipc-invoke {:channel "save-document"
214227
:data (pr-str document)
215-
:on-resolution ::saved
228+
:on-success [::saved]
229+
:on-error [::notification.e/exception]
216230
:formatter edn/read-string}}
217-
{::app.fx/save {:data (h/save-format document)
218-
:options file-picker-options
219-
:formatter (fn [file] {:id (:id document)
220-
:title (.-name file)})
221-
:on-resolution ::saved}}))))
231+
{::app.fx/file-save {:data (h/save-format document)
232+
:options file-picker-options
233+
:formatter (fn [file] {:id (:id document)
234+
:title (.-name file)})
235+
:on-success [::saved]
236+
:on-error [::file-error]}}))))
222237

223238
(rf/reg-event-fx
224239
::download
@@ -234,13 +249,15 @@
234249
(if system/electron?
235250
{::window.fx/ipc-invoke {:channel "save-document"
236251
:data (pr-str document)
237-
:on-resolution ::close-saved
252+
:on-success [::close-saved]
253+
:on-error [::notification.e/exception]
238254
:formatter edn/read-string}}
239-
{::app.fx/save {:data (h/save-format document)
240-
:options file-picker-options
241-
:formatter (fn [file] {:id id
242-
:title (.-name file)})
243-
:on-resolution ::close-saved}}))))
255+
{::app.fx/file-save {:data (h/save-format document)
256+
:options file-picker-options
257+
:formatter (fn [file] {:id id
258+
:title (.-name file)})
259+
:on-success [::close-saved]
260+
:on-error [::file-error]}}))))
244261

245262
(rf/reg-event-fx
246263
::save-as
@@ -249,13 +266,15 @@
249266
(if system/electron?
250267
{::window.fx/ipc-invoke {:channel "save-document-as"
251268
:data (pr-str document)
252-
:on-resolution ::saved
269+
:on-success [::saved]
270+
:on-error [::notification.e/exception]
253271
:formatter edn/read-string}}
254-
{::app.fx/save {:data (h/save-format document)
255-
:options file-picker-options
256-
:formatter (fn [file] {:id (:id document)
257-
:title (.-name file)})
258-
:on-resolution ::saved}}))))
272+
{::app.fx/file-save {:data (h/save-format document)
273+
:options file-picker-options
274+
:formatter (fn [file] {:id (:id document)
275+
:title (.-name file)})
276+
:on-success [::saved]
277+
:on-error [::file-error]}}))))
259278

260279
(rf/reg-event-db
261280
::saved
@@ -291,3 +310,4 @@
291310
(-> db
292311
(h/set-active id)
293312
(h/center))))
313+

src/renderer/element/effects.cljs

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,5 @@
4545
:data {:label (:label image)
4646
:image (.getImageData context 0 0 width height)
4747
:position [x y]}
48-
:on-resolution ::element.e/traced}])))))))
48+
:on-success [::element.e/traced]}])))))))
4949

src/renderer/element/events.cljs

+8-5
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,12 @@
150150
svg (element/->svg els)]
151151
(if system/electron?
152152
{::window.fx/ipc-invoke {:channel "export"
153-
:data svg}}
154-
{::app.fx/save [:data svg
155-
:options {:startIn "pictures"
156-
:types [{:accept {"image/svg+xml" [".svg"]}}]}]}))))
153+
:data svg
154+
:on-error [::notification.e/exception]}}
155+
{::app.fx/file-save [:data svg
156+
:on-error [::notification.e/exception]
157+
:options {:startIn "pictures"
158+
:types [{:accept {"image/svg+xml" [".svg"]}}]}]}))))
157159

158160
(rf/reg-event-fx
159161
::print
@@ -163,7 +165,8 @@
163165
(if system/electron?
164166
{::window.fx/ipc-invoke {:channel "print"
165167
:data svg
166-
:on-resolution ::notification.e/add}}
168+
:on-success [::notification.e/add]
169+
:on-error [::notification.e/exception]}}
167170
{::fx/print svg}))))
168171

169172
(rf/reg-event-db

0 commit comments

Comments
 (0)