import React, { useState, useEffect, Component } from 'react';
import { NativeModules, Platform } from 'react-native';
// @ts-ignore
import resolveAssetSource from 'react-native/Libraries/Image/resolveAssetSource';
import { fetchText } from './xml';
import { SvgCss, SvgWithCss } from './css';
const { getRawResource } = NativeModules.RNSVGRenderableManager || {};
export function getUriFromSource(source?: string | number) {
const resolvedAssetSource = resolveAssetSource(source);
return resolvedAssetSource.uri;
}
export function loadLocalRawResourceDefault(source?: string | number) {
const uri = getUriFromSource(source);
return fetchText(uri);
}
export function isUriAnAndroidResourceIdentifier(uri?: string | number) {
return typeof uri === 'string' && uri.indexOf('/') <= -1;
}
export async function loadAndroidRawResource(uri?: string | number) {
try {
return await getRawResource(uri);
} catch (e) {
console.error(
'Error in RawResourceUtils while trying to natively load an Android raw resource: ',
e,
);
return null;
}
}
export function loadLocalRawResourceAndroid(source?: string | number) {
const uri = getUriFromSource(source);
if (isUriAnAndroidResourceIdentifier(uri)) {
return loadAndroidRawResource(uri);
} else {
return fetchText(uri);
}
}
export const loadLocalRawResource =
Platform.OS !== 'android'
? loadLocalRawResourceDefault
: loadLocalRawResourceAndroid;
export type LocalProps = { asset?: string | number; override?: Object };
export type LocalState = { xml: string | null };
export function LocalSvg(props: LocalProps) {
const { asset, ...rest } = props;
const [xml, setXml] = useState(null);
useEffect(() => {
loadLocalRawResource(asset).then(setXml);
}, [asset]);
return ;
}
export class WithLocalSvg extends Component {
state = { xml: null };
componentDidMount() {
this.load(this.props.asset);
}
componentDidUpdate(prevProps: { asset?: string | number }) {
const { asset } = this.props;
if (asset !== prevProps.asset) {
this.load(asset);
}
}
async load(asset?: string | number) {
try {
this.setState({ xml: asset ? await loadLocalRawResource(asset) : null });
} catch (e) {
console.error(e);
}
}
render() {
const {
props,
state: { xml },
} = this;
return ;
}
}
export default LocalSvg;