Skip to content

Commit 7817d2a

Browse files
authored
Merge pull request #1617 from juniusfree/issue/1514
fix: broadcast username on update
2 parents b852c25 + 9c4f3e2 commit 7817d2a

File tree

7 files changed

+92
-5
lines changed

7 files changed

+92
-5
lines changed

src/clj/athens/self_hosted/web/presence.clj

+17
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
(def supported-event-types
1919
#{:presence/hello
2020
:presence/editing
21+
:presence/rename
2122
:presence/goodbye})
2223

2324

@@ -58,6 +59,21 @@
5859
(common-events/build-event-accepted id max-tx)))))
5960

6061

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+
6177
(defn goodbye-handler
6278
[channel _event]
6379
(let [_username (clients/get-client-username channel)]
@@ -69,4 +85,5 @@
6985
(condp = type
7086
:presence/hello (hello-handler datahike channel event)
7187
:presence/editing (editing-handler datahike channel event)
88+
:presence/rename (rename-handler datahike channel event)
7289
#_#_:presence/goodbye (goodbye-handler channel event)))

src/cljc/athens/common_events.cljc

+22
Original file line numberDiff line numberDiff line change
@@ -661,3 +661,25 @@
661661
:event/type :presence/broadcast-editing
662662
:event/args {:username username
663663
: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}}))

src/cljc/athens/common_events/schema.cljc

+23-3
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,17 @@
1010
(def event-type-presence
1111
[:enum
1212
:presence/hello
13-
:presence/editing])
13+
:presence/editing
14+
:presence/rename])
1415

1516

1617
(def event-type-presence-server
1718
[:enum
1819
:presence/online
1920
:presence/all-online
2021
:presence/offline
21-
:presence/broadcast-editing])
22+
:presence/broadcast-editing
23+
:presence/broadcast-rename])
2224

2325

2426
(def event-type-graph
@@ -114,6 +116,14 @@
114116
[:block-uid string?]]]])
115117

116118

119+
(def presence-rename
120+
[:map
121+
[:event/args
122+
[:map
123+
[:current-username string?]
124+
[:new-username string?]]]])
125+
126+
117127
(def datascript-create-page
118128
[:map
119129
[:event/args
@@ -448,6 +458,7 @@
448458
[:multi {:dispatch :event/type}
449459
(dispatch :presence/hello presence-hello-args)
450460
(dispatch :presence/editing presence-editing)
461+
(dispatch :presence/rename presence-rename)
451462
(dispatch :datascript/create-page datascript-create-page)
452463
(dispatch :datascript/rename-page datascript-rename-page)
453464
;; Same args as `datascript-rename-page`
@@ -605,6 +616,14 @@
605616
[:block-uid string?]]]])
606617

607618

619+
(def presence-broadcast-rename
620+
[:map
621+
[:event/args
622+
[:map
623+
[:current-username string?]
624+
[:new-username string?]]]])
625+
626+
608627
(def server-event
609628
[:multi {:dispatch :event/type}
610629
;; client forwardable events
@@ -657,7 +676,8 @@
657676
(dispatch :presence/online presence-online true)
658677
(dispatch :presence/all-online presence-all-online true)
659678
(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)])
661681

662682

663683
(def valid-server-event?

src/cljs/athens/self_hosted/client.cljs

+7
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,12 @@
316316
(rf/dispatch [:presence/update-editing args]))
317317

318318

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+
319325
(defn- forwarded-event-handler
320326
[args]
321327
(js/console.log "Forwarded event:" (pr-str args))
@@ -334,6 +340,7 @@
334340
#{:presence/all-online} (presence-all-online-handler args)
335341
#{:presence/offline} (presence-offline-handler args)
336342
#{:presence/broadcast-editing} (presence-receive-editing args)
343+
#{:presence/broadcast-rename} (presence-receive-rename args)
337344
#{:datascript/create-page
338345
:datascript/rename-page
339346
:datascript/merge-page

src/cljs/athens/self_hosted/presence/events.cljs

+14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
(ns athens.self-hosted.presence.events
22
(:require
33
[athens.self-hosted.presence.utils :as utils]
4+
[clojure.set :as set]
45
[re-frame.core :as rf]))
56

67

@@ -33,3 +34,16 @@
3334
(fn [db [_ {:keys [username block-uid]}]]
3435
(update-in db [:presence :users username] assoc :block/uid block-uid)))
3536

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]]]}))

src/cljs/athens/self_hosted/presence/fx.cljs

+5
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,8 @@
1010
(fn [uid]
1111
(client/send! (common-events/build-presence-editing-event 42 @(rf/subscribe [:username]) uid))))
1212

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))))

src/cljs/athens/views/pages/settings.cljs

+4-2
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@
226226
[:main
227227
[textinput/textinput {:type "text"
228228
:placeholder "Username"
229-
:on-blur #(update-fn (js-event->val %))
229+
:on-blur #(update-fn username (js-event->val %))
230230
:defaultValue username}]
231231
[:aside
232232
[:p "For now, a username is only needed if you are connected to a server."]]]]])
@@ -272,5 +272,7 @@
272272
(dispatch [:settings/update :backup-time x])
273273
(dispatch [:fs/update-write-db]))]
274274
[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]))]
276278
[reset-settings-comp #(dispatch [:settings/reset])]]]))

0 commit comments

Comments
 (0)