|
|
@@ -910,6 +910,7 @@
|
|
|
(rum/defc settings-rtc-members
|
|
|
[]
|
|
|
(let [[invite-email set-invite-email!] (hooks/use-state "")
|
|
|
+ [loading? set-loading!] (hooks/use-state true)
|
|
|
current-repo (state/get-current-repo)
|
|
|
manager? (user-handler/manager? current-repo)
|
|
|
[users-info] (hooks/use-atom (:rtc/users-info @state/state))
|
|
|
@@ -920,7 +921,10 @@
|
|
|
(when graph-uuid
|
|
|
(rtc-handler/<rtc-invite-email graph-uuid invite-email)))))]
|
|
|
(hooks/use-effect!
|
|
|
- #(c.m/run-task* (m/sp (c.m/<? (rtc-handler/<rtc-get-users-info))))
|
|
|
+ #(c.m/run-task*
|
|
|
+ (m/sp
|
|
|
+ (c.m/<? (rtc-handler/<rtc-get-users-info))
|
|
|
+ (set-loading! false)))
|
|
|
[])
|
|
|
[:div.flex.flex-col.gap-2.mt-4
|
|
|
{:on-key-press (fn [e]
|
|
|
@@ -928,43 +932,48 @@
|
|
|
(invite-user!)))}
|
|
|
[:h2.opacity-50.font-medium "Members:"]
|
|
|
[:div.users.flex.flex-col.gap-1
|
|
|
- (for [{user-name :user/name
|
|
|
- user-email :user/email
|
|
|
- user-uuid :user/uuid
|
|
|
- graph<->user-user-type :graph<->user/user-type} users]
|
|
|
- (let [member? (= :member graph<->user-user-type)
|
|
|
- can-remove? (and manager? member?)]
|
|
|
- [:div.flex.flex-row.items-center.gap-2
|
|
|
- {:key (str "user-" (or user-uuid user-name))}
|
|
|
- [:div user-name]
|
|
|
- (when user-email [:div.opacity-50.text-sm user-email])
|
|
|
- (when graph<->user-user-type [:div.opacity-50.text-sm (name graph<->user-user-type)])
|
|
|
- (when can-remove?
|
|
|
- (shui/dropdown-menu
|
|
|
- (shui/dropdown-menu-trigger
|
|
|
- {:asChild true}
|
|
|
- (shui/button
|
|
|
- {:variant "ghost"
|
|
|
- :size :sm
|
|
|
- :class "px-1 h-7"}
|
|
|
- (ui/icon "dots" {:size 14})))
|
|
|
- (shui/dropdown-menu-content
|
|
|
- {:align "end"}
|
|
|
- (shui/dropdown-menu-item
|
|
|
- {:class "remove-member-menu-item"
|
|
|
- :on-click (fn []
|
|
|
- (let [graph-uuid (ldb/get-graph-rtc-uuid (db/get-db))
|
|
|
- member-id user-uuid]
|
|
|
- (when (and graph-uuid member-id)
|
|
|
- (-> (rtc-handler/<rtc-remove-member! graph-uuid member-id)
|
|
|
- (p/then (fn []
|
|
|
- (rtc-handler/<rtc-get-users-info)))
|
|
|
- (p/catch (fn [e]
|
|
|
- (notification/show! "Failed to remove member." :error)
|
|
|
- (log/error :db-sync/remove-member-failed {:error e
|
|
|
- :graph-uuid graph-uuid
|
|
|
- :member-id member-id})))))))}
|
|
|
- "Remove access"))))]))]
|
|
|
+ (if loading?
|
|
|
+ (for [i (range 2)]
|
|
|
+ [:div.flex.flex-row.items-center.gap-2.pr-4 {:key (str "skeleton-" i)}
|
|
|
+ (shui/skeleton {:class "h-4 w-32"})
|
|
|
+ (shui/skeleton {:class "h-4 w-full"})])
|
|
|
+ (for [{user-name :user/name
|
|
|
+ user-email :user/email
|
|
|
+ user-uuid :user/uuid
|
|
|
+ graph<->user-user-type :graph<->user/user-type} users]
|
|
|
+ (let [member? (= :member graph<->user-user-type)
|
|
|
+ can-remove? (and manager? member?)]
|
|
|
+ [:div.flex.flex-row.items-center.gap-2
|
|
|
+ {:key (str "user-" (or user-uuid user-name))}
|
|
|
+ [:div user-name]
|
|
|
+ (when user-email [:div.opacity-50.text-sm user-email])
|
|
|
+ (when graph<->user-user-type [:div.opacity-50.text-sm (name graph<->user-user-type)])
|
|
|
+ (when can-remove?
|
|
|
+ (shui/dropdown-menu
|
|
|
+ (shui/dropdown-menu-trigger
|
|
|
+ {:asChild true}
|
|
|
+ (shui/button
|
|
|
+ {:variant "ghost"
|
|
|
+ :size :sm
|
|
|
+ :class "px-1 h-7"}
|
|
|
+ (ui/icon "dots" {:size 14})))
|
|
|
+ (shui/dropdown-menu-content
|
|
|
+ {:align "end"}
|
|
|
+ (shui/dropdown-menu-item
|
|
|
+ {:class "remove-member-menu-item"
|
|
|
+ :on-click (fn []
|
|
|
+ (let [graph-uuid (ldb/get-graph-rtc-uuid (db/get-db))
|
|
|
+ member-id user-uuid]
|
|
|
+ (when (and graph-uuid member-id)
|
|
|
+ (-> (rtc-handler/<rtc-remove-member! graph-uuid member-id)
|
|
|
+ (p/then (fn []
|
|
|
+ (rtc-handler/<rtc-get-users-info)))
|
|
|
+ (p/catch (fn [e]
|
|
|
+ (notification/show! "Failed to remove member." :error)
|
|
|
+ (log/error :db-sync/remove-member-failed {:error e
|
|
|
+ :graph-uuid graph-uuid
|
|
|
+ :member-id member-id})))))))}
|
|
|
+ "Remove access"))))])))]
|
|
|
[:div.flex.flex-col.gap-4.mt-4
|
|
|
(shui/input
|
|
|
{:placeholder "Email address"
|