Skip to content

Commit b3ceb34

Browse files
committed
fix(webapp): detect avatar images that failed before hydration
1 parent e40b070 commit b3ceb34

1 file changed

Lines changed: 9 additions & 1 deletion

File tree

apps/webapp/app/components/primitives/Avatar.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
StarIcon,
1010
} from "@heroicons/react/20/solid";
1111
import type { Prisma } from "@trigger.dev/database";
12-
import { useState } from "react";
12+
import { useCallback, useState } from "react";
1313
import { z } from "zod";
1414
import { cn } from "~/utils/cn";
1515

@@ -193,6 +193,13 @@ function AvatarIcon({
193193
function AvatarImage({ avatar, size }: { avatar: ImageAvatar; size: number }) {
194194
const [failed, setFailed] = useState(false);
195195

196+
// A server-rendered image can finish failing before hydration, so onError never fires.
197+
const detectFailedLoad = useCallback((node: HTMLImageElement | null) => {
198+
if (node && node.complete && node.naturalWidth === 0) {
199+
setFailed(true);
200+
}
201+
}, []);
202+
196203
if (!avatar.url || failed) {
197204
return (
198205
<span
@@ -207,6 +214,7 @@ function AvatarImage({ avatar, size }: { avatar: ImageAvatar; size: number }) {
207214
return (
208215
<span className="grid shrink-0 place-items-center overflow-hidden" style={styleFromSize(size)}>
209216
<img
217+
ref={detectFailedLoad}
210218
src={avatar.url}
211219
alt="Organization avatar"
212220
className="size-full rounded-[10%] object-contain"

0 commit comments

Comments
 (0)