- Shipped
- August 5, 2026 at 1:43 AM UTC
- Author
- Kamo
- Commit
- a73117b
A participant whose photo is missing from storage showed a broken-image icon to everyone else in the call, forever — it never degraded to initials. Upstream can render _loadableAvatarUrl unconditionally because that value is only ever set after getFirstLoadableAvatarUrl() has successfully preloaded it. This fork removed that guarantee on both sides: the participants middleware sets it straight from the JWT when disableThirdPartyRequests is on (no preload), and _mapStateToProps falls back to the raw avatarURL. So an unvalidated URL now reaches the component. When the avatar comes from redux rather than an explicit `url` prop, `useReduxLoadableAvatarURL` is already true, so setting avatarFailed did not change `effectiveURL` — render produced the same failing <img> again, and StatelessAvatar only reaches its initials branch when the url is falsy. Remember which URL failed and skip it, so the fallback actually happens. Also reset the failure state when _loadableAvatarUrl changes, not just `url`. Found via a real meet: one participant's photo is recorded in the DB (avatars.file_hash, is_active) but the object does not exist in MinIO, so **************** returns 404. 4 of 25 active photo avatars are orphaned that way.