fix: WS upgrade via metrics middleware (realtime), DM names, tap reactions
CI / Go (build + vet + test) (push) Canceled after 0s
CI / Web (build + lint) (push) Canceled after 0s

This commit is contained in:
vantablackTea
2026-09-28 14:07:59 +03:00
parent e709ae11f8
commit a0b17d25bf
5 changed files with 170 additions and 34 deletions
+52 -2
View File
@@ -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