Skip to content

Commit da23516

Browse files
committed
Add Image.resolveAssetSource
1 parent eb9ea5f commit da23516

3 files changed

Lines changed: 33 additions & 8 deletions

File tree

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,20 @@ yarn react-native run-ios
8686
yarn react-native run-android
8787
```
8888

89+
### Optional: using source/drawable
90+
91+
If you need to use the underlying image source/drawable you can use the `VectorImage.resolveAssetSource` method, for example with Expo's native tabs:
92+
93+
```tsx
94+
const iconSource = VectorImage.resolveAssetSource(require('./icon.svg'));
95+
96+
return (
97+
<NativeTabs.Trigger name="index">
98+
<Icon src={iconSource} drawable={iconSource.uri} />
99+
</NativeTabs.Trigger>
100+
);
101+
```
102+
89103
## Troubleshooting
90104

91105
### `generate` command outputs "Error while parsing image.svg"

src/index.d.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ export interface VectorImageProps extends ImageProps {
88
source: ImageRequireSource;
99
}
1010

11-
declare const VectorImage: React.FunctionComponent<VectorImageProps>;
11+
export function resolveVectorAssetSource(source: ImageRequireSource): ImageRequireSource | null;
12+
13+
declare const VectorImage: React.FunctionComponent<VectorImageProps> & {
14+
resolveAssetSource: typeof resolveVectorAssetSource;
15+
};
1216

1317
export default VectorImage;

src/index.js

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,27 @@ import { Image } from 'react-native';
33
import { getAssetByID } from '@react-native/assets-registry/registry';
44
import getResourceName from './getResourceName';
55

6-
export default function VectorImage({ source, style, ...props }) {
6+
export function resolveVectorAssetSource(source) {
77
const asset = getAssetByID(source);
8+
if (!asset) {
9+
return null;
10+
}
11+
const resourceName = getResourceName(asset);
12+
return { uri: resourceName,width: asset.width, height: asset.height }
13+
}
14+
15+
export default function VectorImage({ source, ...props }) {
16+
const asset = resolveAssetSource(source);
817
if (!asset) {
918
console.warn(
1019
`No asset registered for source "${source}", you may have to generate assets and recompile`
1120
);
1221
return null;
1322
}
14-
const resourceName = getResourceName(asset);
23+
1524
return (
16-
<Image
17-
source={{ uri: resourceName }}
18-
style={[{ width: asset.width, height: asset.height }, style]}
19-
{...props}
20-
/>
25+
<Image source={asset} {...props} />
2126
);
2227
}
28+
29+
VectorImage.resolveAssetSource = resolveVectorAssetSource;

0 commit comments

Comments
 (0)