22import { onBeforeUnmount , onMounted , ref , computed , watch } from ' vue'
33import { useRoute , useRouter } from ' vue-router'
44import { useBoardStore } from ' ../store/boardStore'
5+ import { useSessionStore } from ' ../store/sessionStore'
56import { useKeyboardShortcuts } from ' ../composables/useKeyboardShortcuts'
67import { createBoardRealtimeController } from ' ../composables/useBoardRealtime'
78import { useBoardDragDrop } from ' ../composables/useBoardDragDrop'
@@ -20,6 +21,7 @@ import { isClientOnboardingDemoBoardName } from '../utils/boardDemo'
2021const route = useRoute ()
2122const router = useRouter ()
2223const boardStore = useBoardStore ()
24+ const sessionStore = useSessionStore ()
2325
2426const newColumnName = ref (' ' )
2527const showColumnForm = ref (false )
@@ -33,6 +35,17 @@ const presenceMembers = ref<BoardPresenceMember[]>([])
3335
3436const boardLoadPerf = usePerformanceMark (' board-load' )
3537
38+ /**
39+ * Build a presence entry for the current authenticated user so the panel
40+ * shows immediately on mount, without waiting for the async SignalR
41+ * BoardJoined push event. This eliminates the empty-state flicker.
42+ */
43+ function currentUserPresenceSeed(): BoardPresenceMember [] {
44+ const uid = sessionStore .userId
45+ if (! uid ) return []
46+ return [{ userId: uid , displayName: sessionStore .username ?? null , editingCardId: null }]
47+ }
48+
3649
3750const boardId = ref (route .params .id as string )
3851const realtime = createBoardRealtimeController ({
@@ -81,11 +94,19 @@ const {
8194 resetSelection,
8295} = useBoardKeyboardNav (sortedColumns )
8396
97+ function applyPresenceSeed() {
98+ const seed = currentUserPresenceSeed ()
99+ presenceMembers .value = seed
100+ boardStore .setBoardPresenceMembers (seed )
101+ }
102+
84103onMounted (async () => {
85104 boardLoadPerf .start ()
86105 try {
87- presenceMembers .value = []
88- boardStore .setBoardPresenceMembers ([])
106+ // Seed presence with the current user immediately so the panel never
107+ // shows "No active collaborators" while waiting for the SignalR
108+ // BoardJoined push event (fixes #523 flicker).
109+ applyPresenceSeed ()
89110 boardStore .setEditingCard (null )
90111 await boardStore .fetchBoard (boardId .value )
91112 await realtime .start (boardId .value )
@@ -106,8 +127,8 @@ watch(
106127
107128 boardId .value = nextBoardId
108129 resetSelection ()
109- presenceMembers . value = []
110- boardStore . setBoardPresenceMembers ([] )
130+ // Seed with current user on board switch for the same reason as onMounted.
131+ applyPresenceSeed ( )
111132 boardStore .setEditingCard (null )
112133
113134 try {
0 commit comments