diff --git a/.yarn/versions/ba4cea70.yml b/.yarn/versions/ba4cea70.yml new file mode 100644 index 000000000..50d060d51 --- /dev/null +++ b/.yarn/versions/ba4cea70.yml @@ -0,0 +1,5 @@ +releases: + "@radix-ui/react-avatar": patch + +declined: + - primitives diff --git a/packages/react/avatar/src/Avatar.tsx b/packages/react/avatar/src/Avatar.tsx index 53841b7f0..86ba61b72 100644 --- a/packages/react/avatar/src/Avatar.tsx +++ b/packages/react/avatar/src/Avatar.tsx @@ -62,7 +62,10 @@ const AvatarImage = React.forwardRef( (props: ScopedProps, forwardedRef) => { const { __scopeAvatar, src, onLoadingStatusChange = () => {}, ...imageProps } = props; const context = useAvatarContext(IMAGE_NAME, __scopeAvatar); - const imageLoadingStatus = useImageLoadingStatus(src, imageProps.referrerPolicy); + const imageLoadingStatus = useImageLoadingStatus(src, { + referrerPolicy: imageProps.referrerPolicy, + crossOrigin: imageProps.crossOrigin, + }); const handleLoadingStatusChange = useCallbackRef((status: ImageLoadingStatus) => { onLoadingStatusChange(status); context.onImageLoadingStatusChange(status); @@ -116,7 +119,12 @@ AvatarFallback.displayName = FALLBACK_NAME; /* -----------------------------------------------------------------------------------------------*/ -function useImageLoadingStatus(src?: string, referrerPolicy?: React.HTMLAttributeReferrerPolicy) { +interface UseImageLoadingStatusOptions { + referrerPolicy?: React.HTMLAttributeReferrerPolicy; + crossOrigin?: string | null; +} + +function useImageLoadingStatus(src?: string, options?: UseImageLoadingStatusOptions) { const [loadingStatus, setLoadingStatus] = React.useState('idle'); useLayoutEffect(() => { @@ -136,15 +144,18 @@ function useImageLoadingStatus(src?: string, referrerPolicy?: React.HTMLAttribut setLoadingStatus('loading'); image.onload = updateStatus('loaded'); image.onerror = updateStatus('error'); - image.src = src; - if (referrerPolicy) { - image.referrerPolicy = referrerPolicy; + if (options?.referrerPolicy) { + image.referrerPolicy = options.referrerPolicy; + } + if (options?.crossOrigin) { + image.crossOrigin = options.crossOrigin; } + image.src = src; return () => { isMounted = false; }; - }, [src, referrerPolicy]); + }, [src, options]); return loadingStatus; }