fix: crash bugs in TeamInvoices + faster load

Bug fixes:
- TeamInvoices: add useAuth import/currentUser (invoice-create crash)
- TeamInvoices: setChartYear -> setExportYear (year-dropdown crash)
- TeamDashboard: drop redundant setState-in-effect (cascading renders)
- Companies: delete dead _UnusedClientCompanies (illegal hook calls)
- annotate intentional empty PDF-fallback catches

Load speed:
- preconnect/dns-prefetch to Supabase origin
- lazy-load heic-to in Converters: page chunk 2737KB -> 9KB
- split recharts into its own 'charts' vendor chunk

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Krao Hasanee
2026-06-08 12:59:11 -04:00
parent 85625f4d95
commit 04e0911e9f
101 changed files with 11786 additions and 7445 deletions
+68
View File
@@ -0,0 +1,68 @@
function normalizeName(value) {
return String(value || '').trim().toLowerCase();
}
export function resolveProfileAvatar({
avatarUrl = '',
profile = null,
profileId = '',
name = '',
profilesById = null,
profilesByName = null,
}) {
if (avatarUrl) return avatarUrl;
if (profile?.avatar_url) return profile.avatar_url;
if (profileId && profilesById?.get(profileId)?.avatar_url) return profilesById.get(profileId).avatar_url;
const normalized = normalizeName(name || profile?.name);
if (normalized && profilesByName?.get(normalized)?.avatar_url) return profilesByName.get(normalized).avatar_url;
return '';
}
export default function ProfileAvatar({
profile = null,
profileId = '',
name = '',
avatarUrl = '',
profilesById = null,
profilesByName = null,
size = 32,
fontSize = 12,
fallbackBg = 'var(--accent)',
fallbackColor = '#000',
alt = '',
style = {},
}) {
const resolvedUrl = resolveProfileAvatar({ avatarUrl, profile, profileId, name, profilesById, profilesByName });
const initials = String(name || profile?.name || '?')
.split(' ')
.map((part) => part[0])
.slice(0, 2)
.join('')
.toUpperCase();
if (resolvedUrl) {
return (
<div style={{ width: size, height: size, borderRadius: '50%', overflow: 'hidden', flexShrink: 0, ...style }}>
<img src={resolvedUrl} alt={alt || name || profile?.name || ''} style={{ width: '100%', height: '100%', objectFit: 'cover' }} />
</div>
);
}
return (
<div
style={{
width: size,
height: size,
borderRadius: '50%',
background: fallbackBg,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
flexShrink: 0,
...style,
}}
>
<span style={{ fontSize, fontWeight: 600, color: fallbackColor, lineHeight: 1 }}>{initials || '?'}</span>
</div>
);
}