81 lines
2.4 KiB
JavaScript
81 lines
2.4 KiB
JavaScript
|
/**
|
||
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||
|
*
|
||
|
* This source code is licensed under the MIT license found in the
|
||
|
* LICENSE file in the root directory of this source tree.
|
||
|
*
|
||
|
* @flow strict-local
|
||
|
* @format
|
||
|
*/
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
import type {ResolvedAssetSource} from './AssetSourceResolver';
|
||
|
import type {ImageProps} from './ImageProps';
|
||
|
|
||
|
import resolveAssetSource from './resolveAssetSource';
|
||
|
|
||
|
/**
|
||
|
* A function which returns the appropriate value for image source
|
||
|
* by resolving the `source`, `src` and `srcSet` props.
|
||
|
*/
|
||
|
export function getImageSourcesFromImageProps(
|
||
|
imageProps: ImageProps,
|
||
|
): ?ResolvedAssetSource | $ReadOnlyArray<{uri: string, ...}> {
|
||
|
let source = resolveAssetSource(imageProps.source);
|
||
|
|
||
|
let sources;
|
||
|
|
||
|
const {crossOrigin, referrerPolicy, src, srcSet, width, height} = imageProps;
|
||
|
|
||
|
const headers: {[string]: string} = {};
|
||
|
if (crossOrigin === 'use-credentials') {
|
||
|
headers['Access-Control-Allow-Credentials'] = 'true';
|
||
|
}
|
||
|
if (referrerPolicy != null) {
|
||
|
headers['Referrer-Policy'] = referrerPolicy;
|
||
|
}
|
||
|
if (srcSet != null) {
|
||
|
const sourceList = [];
|
||
|
const srcSetList = srcSet.split(', ');
|
||
|
// `src` prop should be used with default scale if `srcSet` does not have 1x scale.
|
||
|
let shouldUseSrcForDefaultScale = true;
|
||
|
srcSetList.forEach(imageSrc => {
|
||
|
const [uri, xScale = '1x'] = imageSrc.split(' ');
|
||
|
if (!xScale.endsWith('x')) {
|
||
|
console.warn(
|
||
|
'The provided format for scale is not supported yet. Please use scales like 1x, 2x, etc.',
|
||
|
);
|
||
|
} else {
|
||
|
const scale = parseInt(xScale.split('x')[0], 10);
|
||
|
if (!isNaN(scale)) {
|
||
|
// 1x scale is provided in `srcSet` prop so ignore the `src` prop if provided.
|
||
|
shouldUseSrcForDefaultScale =
|
||
|
scale === 1 ? false : shouldUseSrcForDefaultScale;
|
||
|
sourceList.push({headers: headers, scale, uri, width, height});
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if (shouldUseSrcForDefaultScale && src != null) {
|
||
|
sourceList.push({
|
||
|
headers: headers,
|
||
|
scale: 1,
|
||
|
uri: src,
|
||
|
width,
|
||
|
height,
|
||
|
});
|
||
|
}
|
||
|
if (sourceList.length === 0) {
|
||
|
console.warn('The provided value for srcSet is not valid.');
|
||
|
}
|
||
|
|
||
|
sources = sourceList;
|
||
|
} else if (src != null) {
|
||
|
sources = [{uri: src, headers: headers, width, height}];
|
||
|
} else {
|
||
|
sources = source;
|
||
|
}
|
||
|
return sources;
|
||
|
}
|