fix(members): guard nullable display_name/email in the members list (M6)
Typing into the members search box called .toLowerCase() on display_name/email, both of which are nullable (e.g. imported members) — a single null row threw a TypeError and blanked the entire members page. Optional-chain the search match, and handle nullable values when seeding the edit form and optimistic update. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
2ee929658e
commit
da11127ca4
@@ -106,10 +106,14 @@ export function MembersClient({ members: initialMembers, currentRole, areaLeadRo
|
|||||||
activeTab === 'unverified' ? m.status === 'unverified' :
|
activeTab === 'unverified' ? m.status === 'unverified' :
|
||||||
m.status === 'inactive'
|
m.status === 'inactive'
|
||||||
|
|
||||||
|
// display_name and email are both nullable (e.g. imported members), so
|
||||||
|
// guard before .toLowerCase() — an unguarded access crashed the whole list
|
||||||
|
// the moment an admin typed into the search box.
|
||||||
|
const q = search.toLowerCase()
|
||||||
const matchesSearch = !search ||
|
const matchesSearch = !search ||
|
||||||
m.display_name.toLowerCase().includes(search.toLowerCase()) ||
|
(m.display_name?.toLowerCase().includes(q) ?? false) ||
|
||||||
m.email.toLowerCase().includes(search.toLowerCase()) ||
|
(m.email?.toLowerCase().includes(q) ?? false) ||
|
||||||
(m.handle?.toLowerCase().includes(search.toLowerCase()) ?? false)
|
(m.handle?.toLowerCase().includes(q) ?? false)
|
||||||
|
|
||||||
const matchesTier = !tierFilter || m.tier === tierFilter
|
const matchesTier = !tierFilter || m.tier === tierFilter
|
||||||
|
|
||||||
@@ -161,7 +165,7 @@ export function MembersClient({ members: initialMembers, currentRole, areaLeadRo
|
|||||||
setError('')
|
setError('')
|
||||||
const result = await updateMember(editMember.id, form)
|
const result = await updateMember(editMember.id, form)
|
||||||
if (result.error) { setError(result.error); setLoading(false); return }
|
if (result.error) { setError(result.error); setLoading(false); return }
|
||||||
setMembers(prev => prev.map(m => m.id === editMember.id ? { ...m, ...form } : m))
|
setMembers(prev => prev.map(m => m.id === editMember.id ? { ...m, ...form } as Member : m))
|
||||||
setEditMember(null)
|
setEditMember(null)
|
||||||
setLoading(false)
|
setLoading(false)
|
||||||
}
|
}
|
||||||
@@ -182,8 +186,8 @@ export function MembersClient({ members: initialMembers, currentRole, areaLeadRo
|
|||||||
function openEdit(m: Member) {
|
function openEdit(m: Member) {
|
||||||
setEditMember(m)
|
setEditMember(m)
|
||||||
setForm({
|
setForm({
|
||||||
display_name: m.display_name,
|
display_name: m.display_name ?? '',
|
||||||
email: m.email,
|
email: m.email ?? '',
|
||||||
phone: m.phone ?? '',
|
phone: m.phone ?? '',
|
||||||
handle: m.handle ?? '',
|
handle: m.handle ?? '',
|
||||||
tier: m.tier,
|
tier: m.tier,
|
||||||
|
|||||||
Reference in New Issue
Block a user