/
tasks.cljs
101 lines (76 loc) · 2.4 KB
/
tasks.cljs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
(ns jtk-dvlp.re-frame.tasks
(:require
[re-frame.core :as rf]
[re-frame.interceptor :as interceptor]))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Functions
(defn ->task
[data]
(assoc data ::id (random-uuid)))
(defn register
[db {:keys [::id] :as task}]
(assoc-in db [::db :tasks id] task))
(defn unregister
[db id-or-task]
(let [id (or (::id id-or-task) id-or-task)]
(update-in db [::db :tasks] dissoc id)))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Interceptors
(defn as-task
([effect-key]
(as-task effect-key :on-completed))
([effect-key & on-completion-keys]
(rf/->interceptor
:id
:as-task
:after
(fn [context]
(let [effect
(rf/get-effect context effect-key)
task-id
(::id effect (random-uuid))
task
(assoc effect ::id task-id, ::effect effect-key)
effect'
(->> on-completion-keys
(map #(->> (get effect %)
(vector ::unregister-and-dispatch-original task-id)))
(zipmap on-completion-keys)
(merge effect))
db'
(-> (rf/get-effect context :db)
(or (rf/get-coeffect context :db))
(register task))]
(if effect
(-> context
(interceptor/assoc-effect :db db')
(interceptor/assoc-effect effect-key effect'))
context))))))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Events
(rf/reg-event-db ::register
(fn [db [_ task]]
(register db task)))
(rf/reg-event-db ::unregister
(fn [db [_ id-or-task]]
(unregister db id-or-task)))
(rf/reg-event-fx ::unregister-and-dispatch-original
(fn [{:keys [db]} [_ id-or-task original-event-vec & original-event-args]]
(cond-> {:db (unregister db id-or-task)}
original-event-vec
(assoc :dispatch (into original-event-vec original-event-args)))))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Subscriptions
(rf/reg-sub ::db
(fn [{:keys [::db]}]
db))
(rf/reg-sub ::tasks
:<- [::db]
(fn [{:keys [tasks]}]
tasks))
(rf/reg-sub ::running?
:<- [::tasks]
(fn [tasks [_ ids]]
(if ids
(->> tasks (keys) (filter ids) (seq) (some?))
(->> tasks (seq) (some?)))))