101 lines
4.0 KiB
JavaScript
101 lines
4.0 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.convertIconColorPropToObject = convertIconColorPropToObject;
|
|
exports.useAwaitedScreensIcon = useAwaitedScreensIcon;
|
|
exports.convertOptionsIconToRNScreensPropsIcon = convertOptionsIconToRNScreensPropsIcon;
|
|
exports.convertOptionsIconToIOSPropsIcon = convertOptionsIconToIOSPropsIcon;
|
|
exports.convertOptionsIconToAndroidPropsIcon = convertOptionsIconToAndroidPropsIcon;
|
|
exports.convertComponentSrcToImageSource = convertComponentSrcToImageSource;
|
|
const react_1 = require("react");
|
|
const children_1 = require("../../utils/children");
|
|
const elements_1 = require("../common/elements");
|
|
function convertIconColorPropToObject(iconColor) {
|
|
if (iconColor) {
|
|
if (typeof iconColor === 'object' && ('default' in iconColor || 'selected' in iconColor)) {
|
|
return iconColor;
|
|
}
|
|
return {
|
|
default: iconColor,
|
|
};
|
|
}
|
|
return {};
|
|
}
|
|
function useAwaitedScreensIcon(icon) {
|
|
const src = icon && typeof icon === 'object' && 'src' in icon ? icon.src : undefined;
|
|
const [awaitedIcon, setAwaitedIcon] = (0, react_1.useState)(undefined);
|
|
(0, react_1.useEffect)(() => {
|
|
const loadIcon = async () => {
|
|
if (src && src instanceof Promise) {
|
|
const awaitedSrc = await src;
|
|
if (awaitedSrc) {
|
|
const currentAwaitedIcon = { src: awaitedSrc };
|
|
setAwaitedIcon(currentAwaitedIcon);
|
|
}
|
|
}
|
|
};
|
|
loadIcon();
|
|
// Checking `src` rather then icon here, to avoid unnecessary re-renders
|
|
// The icon object can be recreated, while src should stay the same
|
|
// In this case as we control `VectorIcon`, it will only change if `family` or `name` props change
|
|
// So we should be safe with promise resolving
|
|
}, [src]);
|
|
return (0, react_1.useMemo)(() => (isAwaitedIcon(icon) ? icon : awaitedIcon), [awaitedIcon, icon]);
|
|
}
|
|
function isAwaitedIcon(icon) {
|
|
return !icon || !('src' in icon && icon.src instanceof Promise);
|
|
}
|
|
function convertOptionsIconToRNScreensPropsIcon(icon, iconColor) {
|
|
if (!icon) {
|
|
return undefined;
|
|
}
|
|
return {
|
|
ios: convertOptionsIconToIOSPropsIcon(icon, iconColor),
|
|
android: convertOptionsIconToAndroidPropsIcon(icon),
|
|
};
|
|
}
|
|
function convertOptionsIconToIOSPropsIcon(icon, iconColor) {
|
|
if (icon && 'sf' in icon && icon.sf) {
|
|
return {
|
|
type: 'sfSymbol',
|
|
name: icon.sf,
|
|
};
|
|
}
|
|
if (icon && (('xcasset' in icon && icon.xcasset) || ('src' in icon && icon.src))) {
|
|
const imageSource = 'xcasset' in icon && icon.xcasset
|
|
? { uri: icon.xcasset }
|
|
: icon.src;
|
|
const renderingMode = 'renderingMode' in icon ? icon.renderingMode : undefined;
|
|
const effectiveRenderingMode = renderingMode ?? (iconColor !== undefined ? 'template' : 'original');
|
|
if (effectiveRenderingMode === 'original') {
|
|
return { type: 'imageSource', imageSource };
|
|
}
|
|
return { type: 'templateSource', templateSource: imageSource };
|
|
}
|
|
return undefined;
|
|
}
|
|
function convertOptionsIconToAndroidPropsIcon(icon) {
|
|
if (icon && 'drawable' in icon && icon.drawable) {
|
|
return {
|
|
type: 'drawableResource',
|
|
name: icon.drawable,
|
|
};
|
|
}
|
|
if (icon && 'src' in icon && icon.src) {
|
|
return { type: 'imageSource', imageSource: icon.src };
|
|
}
|
|
return undefined;
|
|
}
|
|
function convertComponentSrcToImageSource(src) {
|
|
if ((0, children_1.isChildOfType)(src, elements_1.NativeTabsTriggerVectorIcon)) {
|
|
const props = src.props;
|
|
return { src: props.family.getImageSource(props.name, 24, 'white') };
|
|
}
|
|
else if ((0, children_1.isChildOfType)(src, elements_1.NativeTabsTriggerPromiseIcon)) {
|
|
return { src: src.props.loader() };
|
|
}
|
|
else {
|
|
console.warn('Only VectorIcon is supported as a React element in Icon.src');
|
|
}
|
|
return undefined;
|
|
}
|
|
//# sourceMappingURL=icon.js.map
|