import { loadAsync, type FontSource } from 'expo-font';
import { useState, useEffect, useMemo, type JSX } from 'react';
import { Platform, PlatformColor, Text, View } from 'react-native';
import type { SymbolViewProps } from './SymbolModule.types';
import { androidSymbolToString } from './android';
import { getFont } from './utils';
// trying to mirror iOS implementation
const DEFAULT_SYMBOL_COLOR =
Platform.OS === 'android' ? PlatformColor('@android:color/system_primary_dark') : '#7d9bd4';
export function SymbolView(props: SymbolViewProps): JSX.Element {
const font = useMemo(() => getFont(props.weight), [props.weight]);
const name =
typeof props.name === 'object'
? props.name[Platform.OS === 'android' ? 'android' : 'web']
: null;
const [loaded, setLoaded] = useState(false);
useEffect(() => {
loadAsync({
[font.name]: {
uri: font.font,
testString: name ? androidSymbolToString(name) : undefined,
} as FontSource,
})
.then(() => setLoaded(true))
.catch(() => {
/* noop */
});
}, []);
if (!name) {
return <>{props.fallback}>;
}
const size = props.size ?? 24;
const style = [{ width: size, height: size }, props.style];
if (!loaded) {
return ;
}
return (
{androidSymbolToString(name)}
);
}