fix: WS upgrade via metrics middleware (realtime), DM names, tap reactions
This commit is contained in:
@@ -46,6 +46,16 @@ export default function ChatApp({ user }: ChatAppProps) {
|
||||
const selectedIdRef = useRef(selectedId)
|
||||
const conversationsRef = useRef(conversations)
|
||||
const typingTimers = useRef(new Map<number, number>())
|
||||
const membersLoadedRef = useRef(new Set<number>())
|
||||
const membersInFlightRef = useRef(new Set<number>())
|
||||
const mountedRef = useRef(true)
|
||||
|
||||
useEffect(() => {
|
||||
mountedRef.current = true
|
||||
return () => {
|
||||
mountedRef.current = false
|
||||
}
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
selectedIdRef.current = selectedId
|
||||
@@ -81,6 +91,35 @@ export default function ChatApp({ user }: ChatAppProps) {
|
||||
void loadContacts()
|
||||
}, [loadContacts])
|
||||
|
||||
useEffect(() => {
|
||||
for (const conversation of conversations) {
|
||||
if (membersLoadedRef.current.has(conversation.id) || membersInFlightRef.current.has(conversation.id)) {
|
||||
continue
|
||||
}
|
||||
membersInFlightRef.current.add(conversation.id)
|
||||
api
|
||||
.listMembers(conversation.id)
|
||||
.then((members) => {
|
||||
membersLoadedRef.current.add(conversation.id)
|
||||
if (!mountedRef.current) return
|
||||
members.forEach((member) => rememberUser(member.user))
|
||||
if (conversation.type !== 'group') {
|
||||
const others = members.filter((member) => member.user.id !== user.id)
|
||||
if (others.length === 1) {
|
||||
const peerId = others[0].user.id
|
||||
setLearnedPeers((prev) =>
|
||||
prev[conversation.id] === peerId ? prev : { ...prev, [conversation.id]: peerId },
|
||||
)
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(() => {})
|
||||
.finally(() => {
|
||||
membersInFlightRef.current.delete(conversation.id)
|
||||
})
|
||||
}
|
||||
}, [conversations, rememberUser, user.id])
|
||||
|
||||
useEffect(() => {
|
||||
void ensurePushSubscription()
|
||||
}, [])
|
||||
@@ -323,10 +362,21 @@ export default function ChatApp({ user }: ChatAppProps) {
|
||||
)
|
||||
|
||||
const handleMembersLoaded = useCallback(
|
||||
(members: Member[]) => {
|
||||
(conversationId: number, members: Member[]) => {
|
||||
membersLoadedRef.current.add(conversationId)
|
||||
members.forEach((member) => rememberUser(member.user))
|
||||
const conversation = conversationsRef.current.find((item) => item.id === conversationId)
|
||||
if (conversation && conversation.type !== 'group') {
|
||||
const others = members.filter((member) => member.user.id !== user.id)
|
||||
if (others.length === 1) {
|
||||
const peerId = others[0].user.id
|
||||
setLearnedPeers((prev) =>
|
||||
prev[conversationId] === peerId ? prev : { ...prev, [conversationId]: peerId },
|
||||
)
|
||||
}
|
||||
}
|
||||
},
|
||||
[rememberUser],
|
||||
[rememberUser, user.id],
|
||||
)
|
||||
|
||||
const lastMessage = messages.length > 0 ? messages[messages.length - 1] : null
|
||||
|
||||
Reference in New Issue
Block a user