File tree 7 files changed +92
-5
lines changed
clj/athens/self_hosted/web
7 files changed +92
-5
lines changed Original file line number Diff line number Diff line change 18
18
(def supported-event-types
19
19
#{:presence/hello
20
20
:presence/editing
21
+ :presence/rename
21
22
:presence/goodbye })
22
23
23
24
58
59
(common-events/build-event-accepted id max-tx)))))
59
60
60
61
62
+ (defn rename-handler
63
+ [datahike channel {:event/keys [id args]}]
64
+ (let [{:keys
65
+ [current-username
66
+ new-username]} args
67
+ max-tx (:max-tx @datahike)
68
+ broadcast-rename-event (common-events/build-presence-broadcast-rename-event max-tx
69
+ current-username
70
+ new-username)]
71
+
72
+ (clients/add-client! channel new-username)
73
+ (clients/broadcast! broadcast-rename-event)
74
+ (common-events/build-event-accepted id max-tx)))
75
+
76
+
61
77
(defn goodbye-handler
62
78
[channel _event]
63
79
(let [_username (clients/get-client-username channel)]
69
85
(condp = type
70
86
:presence/hello (hello-handler datahike channel event)
71
87
:presence/editing (editing-handler datahike channel event)
88
+ :presence/rename (rename-handler datahike channel event)
72
89
#_#_:presence/goodbye (goodbye-handler channel event)))
Original file line number Diff line number Diff line change 661
661
:event/type :presence/broadcast-editing
662
662
:event/args {:username username
663
663
:block-uid block-uid}}))
664
+
665
+
666
+ (defn build-presence-rename-event
667
+ " Sent by client when username is updated"
668
+ [last-tx current-username new-username]
669
+ (let [event-id (gen-event-id )]
670
+ {:event/id event-id
671
+ :event/last-tx last-tx
672
+ :event/type :presence/rename
673
+ :event/args {:current-username current-username
674
+ :new-username new-username}}))
675
+
676
+
677
+ (defn build-presence-broadcast-rename-event
678
+ " Sent by server when the updated username is broadcasted"
679
+ [last-tx current-username new-username]
680
+ (let [event-id (gen-event-id )]
681
+ {:event/id event-id
682
+ :event/last-tx last-tx
683
+ :event/type :presence/broadcast-rename
684
+ :event/args {:current-username current-username
685
+ :new-username new-username}}))
Original file line number Diff line number Diff line change 10
10
(def event-type-presence
11
11
[:enum
12
12
:presence/hello
13
- :presence/editing ])
13
+ :presence/editing
14
+ :presence/rename ])
14
15
15
16
16
17
(def event-type-presence-server
17
18
[:enum
18
19
:presence/online
19
20
:presence/all-online
20
21
:presence/offline
21
- :presence/broadcast-editing ])
22
+ :presence/broadcast-editing
23
+ :presence/broadcast-rename ])
22
24
23
25
24
26
(def event-type-graph
114
116
[:block-uid string?]]]])
115
117
116
118
119
+ (def presence-rename
120
+ [:map
121
+ [:event/args
122
+ [:map
123
+ [:current-username string?]
124
+ [:new-username string?]]]])
125
+
126
+
117
127
(def datascript-create-page
118
128
[:map
119
129
[:event/args
448
458
[:multi {:dispatch :event/type }
449
459
(dispatch :presence/hello presence-hello-args)
450
460
(dispatch :presence/editing presence-editing)
461
+ (dispatch :presence/rename presence-rename)
451
462
(dispatch :datascript/create-page datascript-create-page)
452
463
(dispatch :datascript/rename-page datascript-rename-page)
453
464
; ; Same args as `datascript-rename-page`
605
616
[:block-uid string?]]]])
606
617
607
618
619
+ (def presence-broadcast-rename
620
+ [:map
621
+ [:event/args
622
+ [:map
623
+ [:current-username string?]
624
+ [:new-username string?]]]])
625
+
626
+
608
627
(def server-event
609
628
[:multi {:dispatch :event/type }
610
629
; ; client forwardable events
657
676
(dispatch :presence/online presence-online true )
658
677
(dispatch :presence/all-online presence-all-online true )
659
678
(dispatch :presence/offline presence-offline true )
660
- (dispatch :presence/broadcast-editing presence-broadcast-editing true )])
679
+ (dispatch :presence/broadcast-editing presence-broadcast-editing true )
680
+ (dispatch :presence/broadcast-rename presence-broadcast-rename true )])
661
681
662
682
663
683
(def valid-server-event?
Original file line number Diff line number Diff line change 316
316
(rf/dispatch [:presence/update-editing args]))
317
317
318
318
319
+ (defn- presence-receive-rename
320
+ [args]
321
+ (js/console.log " User rename:" (pr-str args))
322
+ (rf/dispatch [:presence/update-rename args]))
323
+
324
+
319
325
(defn- forwarded-event-handler
320
326
[args]
321
327
(js/console.log " Forwarded event:" (pr-str args))
334
340
#{:presence/all-online } (presence-all-online-handler args)
335
341
#{:presence/offline } (presence-offline-handler args)
336
342
#{:presence/broadcast-editing } (presence-receive-editing args)
343
+ #{:presence/broadcast-rename } (presence-receive-rename args)
337
344
#{:datascript/create-page
338
345
:datascript/rename-page
339
346
:datascript/merge-page
Original file line number Diff line number Diff line change 1
1
(ns athens.self-hosted.presence.events
2
2
(:require
3
3
[athens.self-hosted.presence.utils :as utils]
4
+ [clojure.set :as set]
4
5
[re-frame.core :as rf]))
5
6
6
7
33
34
(fn [db [_ {:keys [username block-uid]}]]
34
35
(update-in db [:presence :users username] assoc :block/uid block-uid)))
35
36
37
+
38
+ (rf/reg-event-db
39
+ :presence/update-rename
40
+ (fn [db [_ {:keys [current-username new-username]}]]
41
+ (-> db
42
+ (update-in [:presence :users ] set/rename-keys {current-username new-username})
43
+ (update-in [:presence :users new-username] assoc :username new-username))))
44
+
45
+
46
+ (rf/reg-event-fx
47
+ :presence/send-rename
48
+ (fn [_ [_ current-username new-username]]
49
+ {:fx [[:presence/send-rename! [current-username new-username]]]}))
Original file line number Diff line number Diff line change 10
10
(fn [uid]
11
11
(client/send! (common-events/build-presence-editing-event 42 @(rf/subscribe [:username ]) uid))))
12
12
13
+
14
+ (rf/reg-fx
15
+ :presence/send-rename!
16
+ (fn [[current-username new-username]]
17
+ (client/send! (common-events/build-presence-rename-event 42 current-username new-username))))
Original file line number Diff line number Diff line change 226
226
[:main
227
227
[textinput/textinput {:type " text"
228
228
:placeholder " Username"
229
- :on-blur #(update-fn (js-event->val %))
229
+ :on-blur #(update-fn username (js-event->val %))
230
230
:defaultValue username}]
231
231
[:aside
232
232
[:p " For now, a username is only needed if you are connected to a server." ]]]]])
272
272
(dispatch [:settings/update :backup-time x])
273
273
(dispatch [:fs/update-write-db ]))]
274
274
[remote-backups-comp]
275
- [remote-username-comp username #(dispatch [:settings/update :username %])]
275
+ [remote-username-comp username (fn [current-username new-username]
276
+ (dispatch [:presence/send-rename current-username new-username])
277
+ (dispatch [:settings/update :username new-username]))]
276
278
[reset-settings-comp #(dispatch [:settings/reset ])]]]))
You can’t perform that action at this time.
0 commit comments