Skip to content

Commit

Permalink
Merge pull request athensresearch#1617 from juniusfree/issue/1514
Browse files Browse the repository at this point in the history
fix: broadcast username on update
  • Loading branch information
neotyk committed Sep 10, 2021
2 parents b852c25 + 9c4f3e2 commit 7817d2a
Show file tree
Hide file tree
Showing 7 changed files with 92 additions and 5 deletions.
17 changes: 17 additions & 0 deletions src/clj/athens/self_hosted/web/presence.clj
Expand Up @@ -18,6 +18,7 @@
(def supported-event-types
#{:presence/hello
:presence/editing
:presence/rename
:presence/goodbye})


Expand Down Expand Up @@ -58,6 +59,21 @@
(common-events/build-event-accepted id max-tx)))))


(defn rename-handler
[datahike channel {:event/keys [id args]}]
(let [{:keys
[current-username
new-username]} args
max-tx (:max-tx @datahike)
broadcast-rename-event (common-events/build-presence-broadcast-rename-event max-tx
current-username
new-username)]

(clients/add-client! channel new-username)
(clients/broadcast! broadcast-rename-event)
(common-events/build-event-accepted id max-tx)))


(defn goodbye-handler
[channel _event]
(let [_username (clients/get-client-username channel)]
Expand All @@ -69,4 +85,5 @@
(condp = type
:presence/hello (hello-handler datahike channel event)
:presence/editing (editing-handler datahike channel event)
:presence/rename (rename-handler datahike channel event)
#_#_:presence/goodbye (goodbye-handler channel event)))
22 changes: 22 additions & 0 deletions src/cljc/athens/common_events.cljc
Expand Up @@ -661,3 +661,25 @@
:event/type :presence/broadcast-editing
:event/args {:username username
:block-uid block-uid}}))


(defn build-presence-rename-event
"Sent by client when username is updated"
[last-tx current-username new-username]
(let [event-id (gen-event-id)]
{:event/id event-id
:event/last-tx last-tx
:event/type :presence/rename
:event/args {:current-username current-username
:new-username new-username}}))


(defn build-presence-broadcast-rename-event
"Sent by server when the updated username is broadcasted"
[last-tx current-username new-username]
(let [event-id (gen-event-id)]
{:event/id event-id
:event/last-tx last-tx
:event/type :presence/broadcast-rename
:event/args {:current-username current-username
:new-username new-username}}))
26 changes: 23 additions & 3 deletions src/cljc/athens/common_events/schema.cljc
Expand Up @@ -10,15 +10,17 @@
(def event-type-presence
[:enum
:presence/hello
:presence/editing])
:presence/editing
:presence/rename])


(def event-type-presence-server
[:enum
:presence/online
:presence/all-online
:presence/offline
:presence/broadcast-editing])
:presence/broadcast-editing
:presence/broadcast-rename])


(def event-type-graph
Expand Down Expand Up @@ -114,6 +116,14 @@
[:block-uid string?]]]])


(def presence-rename
[:map
[:event/args
[:map
[:current-username string?]
[:new-username string?]]]])


(def datascript-create-page
[:map
[:event/args
Expand Down Expand Up @@ -448,6 +458,7 @@
[:multi {:dispatch :event/type}
(dispatch :presence/hello presence-hello-args)
(dispatch :presence/editing presence-editing)
(dispatch :presence/rename presence-rename)
(dispatch :datascript/create-page datascript-create-page)
(dispatch :datascript/rename-page datascript-rename-page)
;; Same args as `datascript-rename-page`
Expand Down Expand Up @@ -605,6 +616,14 @@
[:block-uid string?]]]])


(def presence-broadcast-rename
[:map
[:event/args
[:map
[:current-username string?]
[:new-username string?]]]])


(def server-event
[:multi {:dispatch :event/type}
;; client forwardable events
Expand Down Expand Up @@ -657,7 +676,8 @@
(dispatch :presence/online presence-online true)
(dispatch :presence/all-online presence-all-online true)
(dispatch :presence/offline presence-offline true)
(dispatch :presence/broadcast-editing presence-broadcast-editing true)])
(dispatch :presence/broadcast-editing presence-broadcast-editing true)
(dispatch :presence/broadcast-rename presence-broadcast-rename true)])


(def valid-server-event?
Expand Down
7 changes: 7 additions & 0 deletions src/cljs/athens/self_hosted/client.cljs
Expand Up @@ -316,6 +316,12 @@
(rf/dispatch [:presence/update-editing args]))


(defn- presence-receive-rename
[args]
(js/console.log "User rename:" (pr-str args))
(rf/dispatch [:presence/update-rename args]))


(defn- forwarded-event-handler
[args]
(js/console.log "Forwarded event:" (pr-str args))
Expand All @@ -334,6 +340,7 @@
#{:presence/all-online} (presence-all-online-handler args)
#{:presence/offline} (presence-offline-handler args)
#{:presence/broadcast-editing} (presence-receive-editing args)
#{:presence/broadcast-rename} (presence-receive-rename args)
#{:datascript/create-page
:datascript/rename-page
:datascript/merge-page
Expand Down
14 changes: 14 additions & 0 deletions src/cljs/athens/self_hosted/presence/events.cljs
@@ -1,6 +1,7 @@
(ns athens.self-hosted.presence.events
(:require
[athens.self-hosted.presence.utils :as utils]
[clojure.set :as set]
[re-frame.core :as rf]))


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


(rf/reg-event-db
:presence/update-rename
(fn [db [_ {:keys [current-username new-username]}]]
(-> db
(update-in [:presence :users] set/rename-keys {current-username new-username})
(update-in [:presence :users new-username] assoc :username new-username))))


(rf/reg-event-fx
:presence/send-rename
(fn [_ [_ current-username new-username]]
{:fx [[:presence/send-rename! [current-username new-username]]]}))
5 changes: 5 additions & 0 deletions src/cljs/athens/self_hosted/presence/fx.cljs
Expand Up @@ -10,3 +10,8 @@
(fn [uid]
(client/send! (common-events/build-presence-editing-event 42 @(rf/subscribe [:username]) uid))))


(rf/reg-fx
:presence/send-rename!
(fn [[current-username new-username]]
(client/send! (common-events/build-presence-rename-event 42 current-username new-username))))
6 changes: 4 additions & 2 deletions src/cljs/athens/views/pages/settings.cljs
Expand Up @@ -226,7 +226,7 @@
[:main
[textinput/textinput {:type "text"
:placeholder "Username"
:on-blur #(update-fn (js-event->val %))
:on-blur #(update-fn username (js-event->val %))
:defaultValue username}]
[:aside
[:p "For now, a username is only needed if you are connected to a server."]]]]])
Expand Down Expand Up @@ -272,5 +272,7 @@
(dispatch [:settings/update :backup-time x])
(dispatch [:fs/update-write-db]))]
[remote-backups-comp]
[remote-username-comp username #(dispatch [:settings/update :username %])]
[remote-username-comp username (fn [current-username new-username]
(dispatch [:presence/send-rename current-username new-username])
(dispatch [:settings/update :username new-username]))]
[reset-settings-comp #(dispatch [:settings/reset])]]]))

0 comments on commit 7817d2a

Please sign in to comment.