From 3e2ccbc85f8e322af1030f1a1579ad08661b3035 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Tue, 4 Jun 2024 16:18:55 +0200 Subject: [PATCH] :sparkles: Add infor for users --- frontend/src/app/main/data/workspace.cljs | 22 ++++++----- frontend/src/app/plugins/api.cljs | 15 +++++++ frontend/src/app/plugins/page.cljs | 25 ++++++++++-- frontend/src/app/plugins/user.cljs | 48 +++++++++++++++++++++++ frontend/src/app/plugins/utils.cljs | 9 +++++ 5 files changed, 105 insertions(+), 14 deletions(-) create mode 100644 frontend/src/app/plugins/user.cljs diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 677511018..c2ce35228 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -2016,16 +2016,18 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defn change-canvas-color - [color] - (ptk/reify ::change-canvas-color - ptk/WatchEvent - (watch [it state _] - (let [page (wsh/lookup-page state) - changes (-> (pcb/empty-changes it) - (pcb/with-page page) - (pcb/set-page-option :background (:color color)))] - - (rx/of (dch/commit-changes changes)))))) + ([color] + (change-canvas-color nil color)) + ([page-id color] + (ptk/reify ::change-canvas-color + ptk/WatchEvent + (watch [it state _] + (let [page-id (or page-id (:current-page-id state)) + page (wsh/lookup-page state page-id) + changes (-> (pcb/empty-changes it) + (pcb/with-page page) + (pcb/set-page-option :background (:color color)))] + (rx/of (dch/commit-changes changes))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Read only diff --git a/frontend/src/app/plugins/api.cljs b/frontend/src/app/plugins/api.cljs index cffc8d5cd..66bd6ee75 100644 --- a/frontend/src/app/plugins/api.cljs +++ b/frontend/src/app/plugins/api.cljs @@ -24,6 +24,7 @@ [app.plugins.library :as library] [app.plugins.page :as page] [app.plugins.shape :as shape] + [app.plugins.user :as user] [app.plugins.utils :as utils] [app.plugins.viewport :as viewport] [app.util.object :as obj] @@ -92,6 +93,18 @@ "dark" (get-in @st/state [:profile :theme])))) + (getCurrentUser + [_] + (user/current-user-proxy (:session-id @st/state))) + + (getActiveUsers + [_] + (apply array + (->> (:workspace-presence @st/state) + (vals) + (remove #(= (:id %) (:session-id @st/state))) + (map #(user/active-user-proxy (:id %)))))) + (uploadMediaUrl [_ name url] (let [file-id (:current-file-id @st/state)] @@ -190,4 +203,6 @@ {:name "currentPage" :get #(.getPage ^js %)} {:name "selection" :get #(.getSelectedShapes ^js %)} {:name "viewport" :get #(.getViewport ^js %)} + {:name "currentUser" :get #(.getCurrentUser ^js %)} + {:name "activeUsers" :get #(.getActiveUsers ^js %)} {:name "library" :get (fn [_] (library/library-subcontext))})) diff --git a/frontend/src/app/plugins/page.cljs b/frontend/src/app/plugins/page.cljs index 68f26ed8e..4e3140264 100644 --- a/frontend/src/app/plugins/page.cljs +++ b/frontend/src/app/plugins/page.cljs @@ -7,11 +7,14 @@ (ns app.plugins.page "RPC for plugins runtime." (:require + [app.common.colors :as cc] [app.common.data.macros :as dm] [app.common.record :as crc] [app.common.uuid :as uuid] + [app.main.data.workspace :as dw] + [app.main.store :as st] [app.plugins.shape :as shape] - [app.plugins.utils :refer [locate-page proxy->page]] + [app.plugins.utils :as u] [app.util.object :as obj])) (deftype PageProxy [$file $id] @@ -29,7 +32,7 @@ [_] ;; Returns a lazy (iterable) of all available shapes (when (and (some? $file) (some? $id)) - (let [page (locate-page $file $id)] + (let [page (u/locate-page $file $id)] (apply array (sequence (map shape/shape-proxy) (keys (:objects page)))))))) (crc/define-properties! @@ -48,8 +51,22 @@ :get #(dm/str (obj/get % "$id"))} {:name "name" - :get #(-> % proxy->page :name)} + :get #(-> % u/proxy->page :name) + :set + (fn [_ value] + (if (string? value) + (st/emit! (dw/rename-page id value)) + (u/display-not-valid :page-name value)))} {:name "root" :enumerable false - :get #(.getRoot ^js %)})) + :get #(.getRoot ^js %)} + + {:name "background" + :enumerable false + :get #(or (-> % u/proxy->page :options :background) cc/canvas) + :set + (fn [_ value] + (if (and (some? value) (string? value) (cc/valid-hex-color? value)) + (st/emit! (dw/change-canvas-color id {:color value})) + (u/display-not-valid :page-background-color value)))})) diff --git a/frontend/src/app/plugins/user.cljs b/frontend/src/app/plugins/user.cljs new file mode 100644 index 000000000..b7556ecbf --- /dev/null +++ b/frontend/src/app/plugins/user.cljs @@ -0,0 +1,48 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) KALEIDOS INC + +(ns app.plugins.user + (:require + [app.common.record :as crc] + [app.config :as cfg] + [app.plugins.utils :as u] + [app.util.object :as obj])) + +(deftype CurrentUserProxy [$session]) +(deftype ActiveUserProxy [$session]) + +(defn add-user-properties + [user-proxy] + (let [session-id (obj/get user-proxy "$session")] + (crc/add-properties! + user-proxy + {:name "id" + :get (fn [_] (-> (u/locate-profile session-id) :id str))} + + {:name "name" + :get (fn [_] (-> (u/locate-profile session-id) :fullname))} + + {:name "avatarUrl" + :get (fn [_] (cfg/resolve-profile-photo-url (u/locate-profile session-id)))} + + {:name "color" + :get (fn [_] (-> (u/locate-presence session-id) :color))} + + {:name "sessionId" + :get (fn [_] (str session-id))}))) + +(defn current-user-proxy + [session-id] + (-> (CurrentUserProxy. session-id) + (add-user-properties))) + +(defn active-user-proxy + [session-id] + (-> (ActiveUserProxy. session-id) + (add-user-properties) + (crc/add-properties! + {:name "position" :get (fn [_] (-> (u/locate-presence session-id) :point u/to-js))} + {:name "zoom" :get (fn [_] (-> (u/locate-presence session-id) :zoom))}))) diff --git a/frontend/src/app/plugins/utils.cljs b/frontend/src/app/plugins/utils.cljs index 6611bba72..c057aa0b6 100644 --- a/frontend/src/app/plugins/utils.cljs +++ b/frontend/src/app/plugins/utils.cljs @@ -53,6 +53,15 @@ (assert (uuid? id) "Component not valid uuid") (dm/get-in (locate-file file-id) [:data :components id])) +(defn locate-presence + [session-id] + (dm/get-in @st/state [:workspace-presence session-id])) + +(defn locate-profile + [session-id] + (let [{:keys [profile-id]} (locate-presence session-id)] + (dm/get-in @st/state [:users profile-id]))) + (defn proxy->file [proxy] (let [id (obj/get proxy "$id")]