From 5a8b314923a814fab9de28d08ae6ec2feb70360a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesus=20Manuel=20Pi=C3=B1eiro=20Cid?= Date: Tue, 11 Mar 2025 17:10:37 +0100 Subject: [PATCH 1/2] chore: initial commit From f89d032e18ceb5f913143354262aefb1bc3993eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesus=20Manuel=20Pi=C3=B1eiro=20Cid?= Date: Tue, 11 Mar 2025 18:14:53 +0100 Subject: [PATCH 2/2] chore: fix lint issues --- .../room-components/connected-users.tsx | 130 ++++++++++++++++-- .../overlay/multiuse-overlay.tsx | 2 +- .../overlay/room-information-overlay.tsx | 3 + .../overlay/room-status-overlay.tsx | 13 +- .../toolbar/toolbar-button.tsx | 24 +++- code/package-lock.json | 6 + code/package.json | 1 + 7 files changed, 155 insertions(+), 24 deletions(-) diff --git a/code/components/room-components/connected-users.tsx b/code/components/room-components/connected-users.tsx index ca0e660..6c76cf2 100644 --- a/code/components/room-components/connected-users.tsx +++ b/code/components/room-components/connected-users.tsx @@ -1,29 +1,135 @@ "use client"; import React from "react"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" +import Avatar from "boring-avatars"; +import { Avatar as AvatarUI, AvatarFallback } from "@/components/ui/avatar"; import { WeaveConnectedUsersChanged } from "@inditextech/weavejs-sdk"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { useCollaborationRoom } from "@/store/store"; +import { Users } from "lucide-react"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; type ConnectionStatusProps = { connectedUsers: WeaveConnectedUsersChanged; }; -export const ConnectedUsers = ({ connectedUsers }: Readonly) => { +export const ConnectedUsers = ({ + connectedUsers, +}: Readonly) => { + const user = useCollaborationRoom((state) => state.user); + + const connectedUserKey = React.useMemo(() => { + const filterOwnUser = Object.keys(connectedUsers).filter( + (actUser) => actUser === user?.name + ); + return filterOwnUser?.[0]; + }, [user, connectedUsers]); + + const { showUsers, restUsers } = React.useMemo(() => { + const filterOwnUser = Object.keys(connectedUsers).filter( + (actUser) => actUser !== user?.name + ); + return { + showUsers: filterOwnUser.slice(0, 6), + restUsers: filterOwnUser.slice(6), + }; + }, [user, connectedUsers]); + if (Object.keys(connectedUsers).length === 0) { return null; } return ( -
- {Object.keys(connectedUsers).map((user) => { - const userInfo = connectedUsers[user]; - return ( - - - {userInfo.name.slice(0, 2)} - - ); - })} +
+ + {connectedUserKey && ( + + + + + +

{user?.name}

+
+
+ )} + {/*
*/} + {showUsers.map((user) => { + const userInfo = connectedUsers[user]; + return ( + + + + + +

{userInfo.name}

+
+
+ ); + })} + {restUsers.length > 0 && ( + <> +
+ + + + + + + + {restUsers.map((user) => { + const userInfo = connectedUsers[user]; + return ( + + + + + + + {userInfo?.name} + + ); + })} + + + + +

More users

+
+
+ + )} +
); }; diff --git a/code/components/room-components/overlay/multiuse-overlay.tsx b/code/components/room-components/overlay/multiuse-overlay.tsx index d92dc7d..f613e0b 100644 --- a/code/components/room-components/overlay/multiuse-overlay.tsx +++ b/code/components/room-components/overlay/multiuse-overlay.tsx @@ -65,7 +65,7 @@ export function MultiuseOverlay() { return (
diff --git a/code/components/room-components/overlay/room-information-overlay.tsx b/code/components/room-components/overlay/room-information-overlay.tsx index d8e124f..27fecf1 100644 --- a/code/components/room-components/overlay/room-information-overlay.tsx +++ b/code/components/room-components/overlay/room-information-overlay.tsx @@ -15,11 +15,13 @@ import { import { Logo } from "@/components/utils/logo"; import { Image as ImageIcon, FileText, Ellipsis, LogOut } from "lucide-react"; import { WeaveExportStageActionParams } from "@inditextech/weavejs-sdk"; +import { ConnectionStatus } from "../connection-status"; export function RoomInformationOverlay() { const router = useRouter(); const instance = useWeave((state) => state.instance); + const weaveConnectionStatus = useWeave((state) => state.connection.status); const room = useCollaborationRoom((state) => state.room); @@ -54,6 +56,7 @@ export function RoomInformationOverlay() {
+
{room}
diff --git a/code/components/room-components/overlay/room-status-overlay.tsx b/code/components/room-components/overlay/room-status-overlay.tsx index e303942..9588be3 100644 --- a/code/components/room-components/overlay/room-status-overlay.tsx +++ b/code/components/room-components/overlay/room-status-overlay.tsx @@ -2,19 +2,22 @@ import React from "react"; import { ConnectedUsers } from "./../connected-users"; -import { ConnectionStatus } from "./../connection-status"; import { useWeave } from "@inditextech/weavejs-react"; export function RoomStatusOverlay() { - const weaveConnectionStatus = useWeave((state) => state.connection.status); const connectedUsers = useWeave((state) => state.users); return (
-
-
+
+
- +
+
+ {Object.keys(connectedUsers).length} +
+
user(s) connected
+
diff --git a/code/components/room-components/toolbar/toolbar-button.tsx b/code/components/room-components/toolbar/toolbar-button.tsx index 9f00cad..14bf63f 100644 --- a/code/components/room-components/toolbar/toolbar-button.tsx +++ b/code/components/room-components/toolbar/toolbar-button.tsx @@ -2,7 +2,12 @@ import React from "react"; import { cn } from "@/lib/utils"; -import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../../ui/tooltip"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; type ToolbarButtonProps = { icon: React.ReactNode; @@ -13,18 +18,25 @@ type ToolbarButtonProps = { tooltipSide?: "top" | "bottom" | "left" | "right"; }; -export function ToolbarButton({ icon, label = "tool", onClick, disabled = false, active = false, tooltipSide = "right" }: Readonly) { +export function ToolbarButton({ + icon, + label = "tool", + onClick, + disabled = false, + active = false, + tooltipSide = "right", +}: Readonly) { return ( -