Skip to content

Commit 9d70953

Browse files
authored
feat: add fetchPriority prop to S2 Image (#7706)
1 parent 4322a3e commit 9d70953

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

packages/@react-spectrum/s2/src/Image.tsx

+18-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {ContextValue, SlotProps} from 'react-aria-components';
2-
import {createContext, ForwardedRef, forwardRef, HTMLAttributeReferrerPolicy, ReactNode, useCallback, useContext, useMemo, useReducer, useRef} from 'react';
2+
import {createContext, ForwardedRef, forwardRef, HTMLAttributeReferrerPolicy, ReactNode, useCallback, useContext, useMemo, useReducer, useRef, version} from 'react';
33
import {DefaultImageGroup, ImageGroup} from './ImageCoordinator';
44
import {loadingStyle, useIsSkeleton, useLoadingAnimation} from './Skeleton';
55
import {mergeStyles} from '../style/runtime';
@@ -27,8 +27,11 @@ export interface ImageProps extends UnsafeStyles, SlotProps {
2727
* [See MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#decoding).
2828
*/
2929
decoding?: 'async' | 'auto' | 'sync',
30-
// Only supported in React 19...
31-
// fetchPriority?: 'high' | 'low' | 'auto',
30+
/**
31+
* Provides a hint of the relative priority to use when fetching the image.
32+
* [See MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#fetchpriority).
33+
*/
34+
fetchPriority?: 'high' | 'low' | 'auto',
3235
/**
3336
* Whether the image should be loaded immediately or lazily when scrolled into view.
3437
* [See MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#loading).
@@ -146,6 +149,7 @@ export const Image = forwardRef(function Image(props: ImageProps, domRef: Forwar
146149
alt,
147150
crossOrigin,
148151
decoding,
152+
fetchPriority,
149153
loading,
150154
referrerPolicy,
151155
slot
@@ -223,6 +227,7 @@ export const Image = forwardRef(function Image(props: ImageProps, domRef: Forwar
223227
{errorState}
224228
{!errorState && (
225229
<img
230+
{...getFetchPriorityProp(fetchPriority)}
226231
src={src}
227232
alt={alt}
228233
crossOrigin={crossOrigin}
@@ -235,5 +240,14 @@ export const Image = forwardRef(function Image(props: ImageProps, domRef: Forwar
235240
className={imgStyles({isRevealed, isTransitioning})} />
236241
)}
237242
</div>
238-
), [slot, hidden, domRef, UNSAFE_style, UNSAFE_className, styles, isAnimating, errorState, src, alt, crossOrigin, decoding, loading, referrerPolicy, onLoad, onError, isRevealed, isTransitioning]);
243+
), [slot, hidden, domRef, UNSAFE_style, UNSAFE_className, styles, isAnimating, errorState, src, alt, crossOrigin, decoding, fetchPriority, loading, referrerPolicy, onLoad, onError, isRevealed, isTransitioning]);
239244
});
245+
246+
function getFetchPriorityProp(fetchPriority?: 'high' | 'low' | 'auto'): Record<string, string | undefined> {
247+
const pieces = version.split('.');
248+
const major = parseInt(pieces[0], 10);
249+
if (major >= 19) {
250+
return {fetchPriority};
251+
}
252+
return {fetchpriority: fetchPriority};
253+
}

0 commit comments

Comments
 (0)