fix: 搜索时不污染原对象

This commit is contained in:
H3CoF6
2026-03-16 08:35:24 +08:00
parent 6beefb9fc0
commit 7bcdecaceb

View File

@@ -3338,24 +3338,32 @@ function ChatPage(props: ChatPageProps) {
return return
} }
const lower = searchKeyword.toLowerCase() const lower = searchKeyword.toLowerCase()
setFilteredSessions(visible.filter(s => { setFilteredSessions(visible
.filter(s => {
const matchedByName = s.displayName?.toLowerCase().includes(lower)
const matchedByUsername = s.username.toLowerCase().includes(lower)
const matchedByAlias = s.alias?.toLowerCase().includes(lower)
return matchedByName || matchedByUsername || matchedByAlias
})
.map(s => {
const matchedByName = s.displayName?.toLowerCase().includes(lower) const matchedByName = s.displayName?.toLowerCase().includes(lower)
const matchedByUsername = s.username.toLowerCase().includes(lower) const matchedByUsername = s.username.toLowerCase().includes(lower)
const matchedByAlias = s.alias?.toLowerCase().includes(lower) const matchedByAlias = s.alias?.toLowerCase().includes(lower)
let matchedField: 'wxid' | 'alias' | 'name' | undefined = undefined
if (matchedByUsername && !matchedByName && !matchedByAlias) { if (matchedByUsername && !matchedByName && !matchedByAlias) {
s.matchedField = 'wxid' matchedField = 'wxid'
} else if (matchedByAlias && !matchedByName && !matchedByUsername) { } else if (matchedByAlias && !matchedByName && !matchedByUsername) {
s.matchedField = 'alias' matchedField = 'alias'
} else if (matchedByName && !matchedByUsername && !matchedByAlias) { } else if (matchedByName && !matchedByUsername && !matchedByAlias) {
(s as any).matchedField = 'name' matchedField = 'name'
console.log('设置 matchedField=name:', s.displayName)
} else {
s.matchedField = undefined
} }
return matchedByName || matchedByUsername || matchedByAlias // ✅ 关键点:返回一个新对象,解耦全局状态
})) return { ...s, matchedField }
})
)
}, [sessions, searchKeyword, setFilteredSessions]) }, [sessions, searchKeyword, setFilteredSessions])
// 折叠群列表(独立计算,供折叠 panel 使用) // 折叠群列表(独立计算,供折叠 panel 使用)
@@ -3364,22 +3372,34 @@ function ChatPage(props: ChatPageProps) {
const folded = sessions.filter(s => s.isFolded) const folded = sessions.filter(s => s.isFolded)
if (!searchKeyword.trim() || !foldedView) return folded if (!searchKeyword.trim() || !foldedView) return folded
const lower = searchKeyword.toLowerCase() const lower = searchKeyword.toLowerCase()
return folded.filter(s => { return folded
// 1. 先过滤
.filter(s => {
const matchedByName = s.displayName?.toLowerCase().includes(lower) const matchedByName = s.displayName?.toLowerCase().includes(lower)
const matchedByUsername = s.username.toLowerCase().includes(lower) const matchedByUsername = s.username.toLowerCase().includes(lower)
const matchedByAlias = s.alias?.toLowerCase().includes(lower) const matchedByAlias = s.alias?.toLowerCase().includes(lower)
const matchedBySummary = s.summary.toLowerCase().includes(lower) const matchedBySummary = s.summary?.toLowerCase().includes(lower) // 注意:这里有个 summary
if (matchedByUsername && !matchedByName && !matchedBySummary && !matchedByAlias) {
s.matchedField = 'wxid'
} else if (matchedByAlias && !matchedByName && !matchedBySummary && !matchedByUsername) {
s.matchedField = 'alias'
} else {
s.matchedField = undefined
}
return matchedByName || matchedByUsername || matchedByAlias || matchedBySummary return matchedByName || matchedByUsername || matchedByAlias || matchedBySummary
}) })
// 2. 后映射
.map(s => {
const matchedByName = s.displayName?.toLowerCase().includes(lower)
const matchedByUsername = s.username.toLowerCase().includes(lower)
const matchedByAlias = s.alias?.toLowerCase().includes(lower)
const matchedBySummary = s.summary?.toLowerCase().includes(lower)
let matchedField: 'wxid' | 'alias' | 'name' | undefined = undefined
if (matchedByUsername && !matchedByName && !matchedBySummary && !matchedByAlias) {
matchedField = 'wxid'
} else if (matchedByAlias && !matchedByName && !matchedBySummary && !matchedByUsername) {
matchedField = 'alias'
}
// ✅ 同样返回新对象
return { ...s, matchedField }
})
}, [sessions, searchKeyword, foldedView]) }, [sessions, searchKeyword, foldedView])
const hasSessionRecords = Array.isArray(sessions) && sessions.length > 0 const hasSessionRecords = Array.isArray(sessions) && sessions.length > 0