diff --git a/packages/react-native/Libraries/Image/AssetSourceResolver.js b/packages/react-native/Libraries/Image/AssetSourceResolver.js index 5e0d967f34942f..e279212b49e5e5 100644 --- a/packages/react-native/Libraries/Image/AssetSourceResolver.js +++ b/packages/react-native/Libraries/Image/AssetSourceResolver.js @@ -18,7 +18,10 @@ export type ResolvedAssetSource = {| +scale: number, |}; -import type {PackagerAsset} from '@react-native/assets-registry/registry'; +import type { + AssetDestPathResolver, + PackagerAsset, +} from '@react-native/assets-registry/registry'; const PixelRatio = require('../Utilities/PixelRatio').default; const Platform = require('../Utilities/Platform'); @@ -76,6 +79,10 @@ class AssetSourceResolver { return this.assetServerURL(); } + if (this.asset.resolver != null) { + return this.getAssetUsingResolver(this.asset.resolver); + } + if (Platform.OS === 'android') { return this.isLoadedFromFileSystem() ? this.drawableFolderInBundle() @@ -85,6 +92,26 @@ class AssetSourceResolver { } } + getAssetUsingResolver(resolver: AssetDestPathResolver): ResolvedAssetSource { + switch (resolver) { + case 'android': + return this.isLoadedFromFileSystem() + ? this.drawableFolderInBundle() + : this.resourceIdentifierWithoutScale(); + case 'generic': + return this.scaledAssetURLNearBundle(); + default: + throw new Error( + "Don't know how to get asset via provided resolver: " + + resolver + + '\nAsset: ' + + JSON.stringify(this.asset, null, '\t') + + '\nPossible resolvers are:' + + JSON.stringify(['android', 'generic'], null, '\t'), + ); + } + } + /** * Returns an absolute URL which can be used to fetch the asset * from the devserver diff --git a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap index febd1d01ed23cb..2251419816e263 100644 --- a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap +++ b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap @@ -4679,6 +4679,7 @@ declare class AssetSourceResolver { isLoadedFromServer(): boolean; isLoadedFromFileSystem(): boolean; defaultAsset(): ResolvedAssetSource; + getAssetUsingResolver(resolver: AssetDestPathResolver): ResolvedAssetSource; assetServerURL(): ResolvedAssetSource; scaledAssetPath(): ResolvedAssetSource; scaledAssetURLNearBundle(): ResolvedAssetSource;