Skip to content

Commit fdbf53c

Browse files
committed
move some side-effecting functions to effects
1 parent 41ca663 commit fdbf53c

File tree

7 files changed

+77
-104
lines changed

7 files changed

+77
-104
lines changed

src/renderer/app/effects.cljs

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
[renderer.app.events :as-alias e]
88
[renderer.history.handlers :as history.h]
99
[renderer.notification.events :as-alias notification.e]
10-
[renderer.utils.dom :as dom]
11-
[renderer.utils.file :as file]))
10+
[renderer.utils.dom :as dom]))
1211

1312
(rf.storage/reg-co-fx! config/app-key {:cofx :store})
1413

@@ -65,15 +64,54 @@
6564

6665
(rf/reg-fx
6766
::file-save
68-
file/save!)
67+
(fn [{:keys [options data on-success on-error formatter]}]
68+
(if (.-showSaveFilePicker js/window)
69+
(-> (.showSaveFilePicker js/window (clj->js options))
70+
(.then (fn [^js/FileSystemFileHandle file-handle]
71+
(.then (.createWritable file-handle)
72+
(fn [^js/FileSystemWritableFileStream writable-stream]
73+
(.then (.write writable-stream data)
74+
(fn []
75+
(.close writable-stream)
76+
(when on-success
77+
(rf/dispatch (conj on-success (cond-> file-handle
78+
formatter
79+
formatter))))))))))
80+
(.catch #(when on-error (rf/dispatch (conj on-error %)))))
81+
(rf/dispatch
82+
[::notification.e/unavailable-feature
83+
"Save File Picker"
84+
"https://developer.mozilla.org/en-US/docs/Web/API/Window/showSaveFilePicker#browser_compatibility"]))))
85+
86+
(defn legacy-file-open!
87+
[cb]
88+
(let [el (js/document.createElement "input")]
89+
(set! (.-type el) "file")
90+
(.addEventListener el "change" (fn [e] (.remove el)
91+
(cb (first (.. e -target -files)))))
92+
(.click el)))
6993

7094
(rf/reg-fx
7195
::file-open
72-
file/open!)
96+
(fn [{:keys [options on-error on-success]}]
97+
(let [success-cb #(rf/dispatch (conj on-success %))]
98+
(if (.-showOpenFilePicker js/window)
99+
(-> (.showOpenFilePicker js/window (clj->js options))
100+
(.then (fn [[^js/FileSystemFileHandle file-handle]]
101+
(.then (.getFile file-handle) success-cb)))
102+
(.catch #(when on-error (rf/dispatch (conj on-error %)))))
103+
(legacy-file-open! success-cb)))))
73104

74105
(rf/reg-fx
75106
::download
76-
file/download!)
107+
(fn [{:keys [data title]}]
108+
(let [blob (js/Blob. [data])
109+
url (js/URL.createObjectURL blob)
110+
a (js/document.createElement "a")]
111+
(.setAttribute a "href" url)
112+
(.setAttribute a "download" title)
113+
(.click a)
114+
(js/window.URL.revokeObjectURL url))))
77115

78116
(rf/reg-fx
79117
::set-document-attr
@@ -86,3 +124,13 @@
86124
(when (not (db/valid? db))
87125
(js/console.error (str "Event: " (first event)))
88126
(throw (js/Error. (str "Spec check failed: " (db/explain db)))))))
127+
128+
(rf/reg-fx
129+
::scroll-into-view
130+
(fn [el]
131+
(.scrollIntoView el #js {:block "nearest"})))
132+
133+
(rf/reg-fx
134+
::scroll-to-bottom
135+
(fn [el]
136+
(set! (.-scrollTop el) (.-scrollHeight el))))

src/renderer/app/events.cljs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,13 @@
122122
(cond-> context
123123
db
124124
(rf/assoc-effect :fx (conj (or fx []) [::fx/validate-db [db event]])))))))
125+
126+
(rf/reg-event-fx
127+
::scroll-into-view
128+
(fn [_ [_ el]]
129+
{::fx/scroll-into-view el}))
130+
131+
(rf/reg-event-fx
132+
::scroll-to-bottom
133+
(fn [_ [_ el]]
134+
{::fx/scroll-to-bottom el}))

src/renderer/core.cljs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@
7474

7575
(defn ^:dev/after-load mount-root! []
7676
(rf/clear-subscription-cache!)
77-
(let [root-el (dom/root-element!)]
77+
(let [root-el (.getElementById js/document "app")]
7878
(ra.dom/unmount-component-at-node root-el)
7979
(ra.dom/render [error/boundary [app.v/root]] root-el)))
8080

@@ -88,11 +88,14 @@
8888

8989
(defn add-listeners!
9090
[]
91-
(.addEventListener js/window "focus" (rf/dispatch [::window.e/set-focused true]))
92-
(.addEventListener js/window "blur" (rf/dispatch [::window.e/set-focused (dom/focused!?)]))
9391
(.addEventListener js/document "keydown" keyb/event-handler!)
9492
(.addEventListener js/document "keyup" keyb/event-handler!)
9593
(.addEventListener js/document "fullscreenchange" #(rf/dispatch [::window.e/set-fullscreen (boolean (.-fullscreenElement js/document))]))
94+
(.addEventListener js/window "focus" (rf/dispatch [::window.e/set-focused true]))
95+
(.addEventListener js/window "blur" (rf/dispatch [::window.e/set-focused
96+
(or (.hasFocus js/document)
97+
(and (dom/frame-document!)
98+
(.hasFocus (dom/frame-document!))))]))
9699

97100
(rf/dispatch [::document.e/center]))
98101

src/renderer/reepl/views.cljs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
[renderer.reepl.show-value :refer [show-value]]
1616
[renderer.reepl.subs :as s]
1717
[renderer.ui :as ui]
18-
[renderer.utils.dom :as dom]
1918
[replumb.core :as replumb.core])
2019
(:require-macros
2120
[reagent.ratom :refer [reaction]]))
@@ -89,12 +88,10 @@
8988
(ra/create-class
9089
{:component-did-mount
9190
(fn [_this]
92-
(let [el (.-current ref)]
93-
(dom/scroll-to-bottom! el)))
91+
(rf/dispatch [::app.e/scroll-to-bottom (.-current ref)]))
9492
:component-did-update
9593
(fn [_this]
96-
(let [el (.-current ref)]
97-
(dom/scroll-to-bottom! el)))
94+
(rf/dispatch [::app.e/scroll-to-bottom (.-current ref)]))
9895
:reagent-render
9996
(fn [items opts]
10097
[:div.flex-1.border-b.border-default.h-full.overflow-hidden.flex
@@ -126,7 +123,7 @@
126123
(let [[_ _ selected] (ra/argv this)]
127124
(when (and (not old-selected)
128125
selected)
129-
(dom/scroll-into-view! (.-current ref)))))
126+
(rf/dispatch [::app.e/scroll-into-view (.-current ref)]))))
130127
:reagent-render
131128
(fn [text selected active set-active]
132129
[:div.p-1.bg-secondary.text-nowrap

src/renderer/tree/views.cljs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
[clojure.string :as str]
55
[re-frame.core :as rf]
66
[reagent.core :as ra]
7+
[renderer.app.events :as-alias app.e]
78
[renderer.document.events :as-alias document.e]
89
[renderer.document.subs :as-alias document.s]
910
[renderer.element.events :as-alias element.e]
@@ -139,7 +140,7 @@
139140
:on-pointer-enter #(rf/dispatch [::document.e/set-hovered-id id])
140141
:ref (fn [this]
141142
(when (and this selected)
142-
(dom/scroll-into-view! this)
143+
(rf/dispatch [::app.e/scroll-into-view this])
143144
(set-last-focused-id! (.getAttribute this "data-id"))))
144145
:draggable true
145146
:on-key-down #(key-down-handler! % id)

src/renderer/utils/dom.cljs

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,11 @@
1111
[e]
1212
(.stopPropagation e))
1313

14-
(defn root-element!
15-
[]
16-
(.getElementById js/document "app"))
17-
18-
(defn frame-element!
19-
[]
20-
(.getElementById js/document "frame"))
21-
22-
(defn frame-window!
23-
[]
24-
(when-let [frame (frame-element!)]
25-
(.-contentWindow frame)))
26-
2714
(defn frame-document!
2815
[]
29-
(when-let [window (frame-window!)]
30-
(.-document window)))
31-
32-
(defn focused!?
33-
[]
34-
(or (.hasFocus js/document)
35-
(and (frame-document!)
36-
(.hasFocus (frame-document!)))))
16+
(when-let [frame (.getElementById js/document "frame")]
17+
(when-let [window (.-contentWindow frame)]
18+
(.-document window))))
3719

3820
(defn svg-elements!
3921
[]
@@ -44,11 +26,3 @@
4426
[]
4527
(when-let [document (frame-document!)]
4628
(.getElementById document "canvas")))
47-
48-
(defn scroll-into-view!
49-
[el]
50-
(.scrollIntoView el #js {:block "nearest"}))
51-
52-
(defn scroll-to-bottom!
53-
[el]
54-
(set! (.-scrollTop el) (.-scrollHeight el)))

src/renderer/utils/file.cljs

Lines changed: 0 additions & 60 deletions
This file was deleted.

0 commit comments

Comments
 (0)