Skip to content

Commit 6cd82f0

Browse files
authored
fix(presence): remove presence for a solo user (#1779)
1 parent 4a3c6d1 commit 6cd82f0

File tree

3 files changed

+15
-20
lines changed

3 files changed

+15
-20
lines changed

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/user-avatar-stack/components/user-avatar/user-avatar.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ export function UserAvatar({
2626
}: AvatarProps) {
2727
const { gradient } = useMemo(() => getPresenceColors(connectionId, color), [connectionId, color])
2828

29-
// Determine avatar size
3029
const sizeClass = {
3130
sm: 'h-5 w-5 text-[10px]',
3231
md: 'h-7 w-7 text-xs',
@@ -49,7 +48,7 @@ export function UserAvatar({
4948
style={
5049
{
5150
background: hasAvatar ? undefined : gradient,
52-
zIndex: 10 - index, // Higher index = lower z-index for stacking effect
51+
zIndex: 10 - index,
5352
} as CSSProperties
5453
}
5554
>
@@ -69,7 +68,6 @@ export function UserAvatar({
6968
</div>
7069
)
7170

72-
// If tooltip content is provided, wrap in tooltip
7371
if (tooltipContent) {
7472
return (
7573
<Tooltip>

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-presence.ts

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
'use client'
22

33
import { useMemo } from 'react'
4+
import { useSession } from '@/lib/auth-client'
45
import { useSocket } from '@/contexts/socket-context'
56

6-
// Socket presence user from server
77
interface SocketPresenceUser {
88
socketId: string
99
userId: string
@@ -13,7 +13,6 @@ interface SocketPresenceUser {
1313
selection?: { type: 'block' | 'edge' | 'none'; id?: string }
1414
}
1515

16-
// UI presence user for components
1716
type PresenceUser = {
1817
connectionId: string | number
1918
name?: string
@@ -31,28 +30,30 @@ interface UsePresenceReturn {
3130
/**
3231
* Hook for managing user presence in collaborative workflows using Socket.IO
3332
* Uses the existing Socket context to get real presence data
33+
* Filters out the current user so only other collaborators are shown
3434
*/
3535
export function usePresence(): UsePresenceReturn {
3636
const { presenceUsers, isConnected } = useSocket()
37+
const { data: session } = useSession()
38+
const currentUserId = session?.user?.id
3739

3840
const users = useMemo(() => {
39-
// Deduplicate by userId - only show one presence per unique user
4041
const uniqueUsers = new Map<string, SocketPresenceUser>()
4142

4243
presenceUsers.forEach((user) => {
43-
// Keep the most recent presence for each user (last one wins)
4444
uniqueUsers.set(user.userId, user)
4545
})
4646

47-
return Array.from(uniqueUsers.values()).map((user) => ({
48-
// Use userId as connectionId since we've deduplicated
49-
connectionId: user.userId,
50-
name: user.userName,
51-
color: undefined, // Let the avatar component generate colors
52-
info: user.selection?.type ? `Editing ${user.selection.type}` : undefined,
53-
avatarUrl: user.avatarUrl,
54-
}))
55-
}, [presenceUsers])
47+
return Array.from(uniqueUsers.values())
48+
.filter((user) => user.userId !== currentUserId)
49+
.map((user) => ({
50+
connectionId: user.userId,
51+
name: user.userName,
52+
color: undefined,
53+
info: user.selection?.type ? `Editing ${user.selection.type}` : undefined,
54+
avatarUrl: user.avatarUrl,
55+
}))
56+
}, [presenceUsers, currentUserId])
5657

5758
return {
5859
users,

apps/sim/socket-server/handlers/workflow.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,11 @@ export function setupWorkflowHandlers(
6363
return
6464
}
6565

66-
// Ensure user only joins one workflow at a time
6766
const currentWorkflowId = roomManager.getWorkflowIdForSocket(socket.id)
6867
if (currentWorkflowId) {
6968
socket.leave(currentWorkflowId)
7069
roomManager.cleanupUserFromRoom(socket.id, currentWorkflowId)
7170

72-
// Broadcast updated presence list to all remaining users
7371
roomManager.broadcastPresenceUpdate(currentWorkflowId)
7472
}
7573

@@ -119,7 +117,6 @@ export function setupWorkflowHandlers(
119117
const workflowState = await getWorkflowState(workflowId)
120118
socket.emit('workflow-state', workflowState)
121119

122-
// Broadcast updated presence list to all users in the room
123120
roomManager.broadcastPresenceUpdate(workflowId)
124121

125122
const uniqueUserCount = roomManager.getUniqueUserCount(workflowId)
@@ -166,7 +163,6 @@ export function setupWorkflowHandlers(
166163
socket.leave(workflowId)
167164
roomManager.cleanupUserFromRoom(socket.id, workflowId)
168165

169-
// Broadcast updated presence list to all remaining users
170166
roomManager.broadcastPresenceUpdate(workflowId)
171167

172168
logger.info(`User ${session.userId} (${session.userName}) left workflow ${workflowId}`)

0 commit comments

Comments
 (0)