UNPKG

react-native-svg

Version:
129 lines (122 loc) 3.88 kB
import { GestureResponderEvent, type ImageProps as RNImageProps, } from 'react-native'; import { BaseProps } from '../types'; import { WebShape } from '../WebShape'; import { hasTouchableProperty, parseTransformProp } from '.'; import { resolve } from '../../lib/resolve'; import { NumberProp } from '../../lib/extract/types'; import { resolveAssetUri } from '../../lib/resolveAssetUri'; /** * `react-native-svg` supports additional props that aren't defined in the spec. * This function replaces them in a spec conforming manner. * * @param {WebShape} self Instance given to us. * @param {Object?} props Optional overridden props given to us. * @returns {Object} Cleaned props object. * @private */ export const prepare = <T extends BaseProps>( self: WebShape<T>, props = self.props ) => { const { transform, origin, originX, originY, fontFamily, fontSize, fontWeight, fontStyle, style, forwardedRef, gradientTransform, patternTransform, onPress, ...rest } = props; const clean: { onStartShouldSetResponder?: (e: GestureResponderEvent) => boolean; onResponderMove?: (e: GestureResponderEvent) => void; onResponderGrant?: (e: GestureResponderEvent) => void; onResponderRelease?: (e: GestureResponderEvent) => void; onResponderTerminate?: (e: GestureResponderEvent) => void; onResponderTerminationRequest?: (e: GestureResponderEvent) => boolean; onClick?: (e: GestureResponderEvent) => void; transform?: string; gradientTransform?: string; patternTransform?: string; 'transform-origin'?: string; href?: RNImageProps['source'] | string | null; style?: object; ref?: unknown; } = { ...(hasTouchableProperty(props) ? { onStartShouldSetResponder: self.touchableHandleStartShouldSetResponder, onResponderTerminationRequest: self.touchableHandleResponderTerminationRequest, onResponderGrant: self.touchableHandleResponderGrant, onResponderMove: self.touchableHandleResponderMove, onResponderRelease: self.touchableHandleResponderRelease, onResponderTerminate: self.touchableHandleResponderTerminate, } : null), ...rest, }; if (origin != null) { clean['transform-origin'] = origin.toString().replace(',', ' '); } else if (originX != null || originY != null) { clean['transform-origin'] = `${originX || 0} ${originY || 0}`; } // we do it like this because setting transform as undefined causes error in web const parsedTransform = parseTransformProp(transform, props); if (parsedTransform) { clean.transform = parsedTransform; } const parsedGradientTransform = parseTransformProp(gradientTransform); if (parsedGradientTransform) { clean.gradientTransform = parsedGradientTransform; } const parsedPatternTransform = parseTransformProp(patternTransform); if (parsedPatternTransform) { clean.patternTransform = parsedPatternTransform; } clean.ref = (el: SVGElement | null) => { self.elementRef.current = el; if (typeof forwardedRef === 'function') { forwardedRef(el); } else if (forwardedRef) { forwardedRef.current = el; } }; const styles: { fontStyle?: string; fontFamily?: string; fontSize?: NumberProp; fontWeight?: NumberProp; } = {}; if (fontFamily != null) { styles.fontFamily = fontFamily; } if (fontSize != null) { styles.fontSize = fontSize; } if (fontWeight != null) { styles.fontWeight = fontWeight; } if (fontStyle != null) { styles.fontStyle = fontStyle; } clean.style = resolve(style, styles); if (onPress !== null) { clean.onClick = props.onPress; } if (props.href !== null && props.href !== undefined) { clean.href = resolveAssetUri(props.href)?.uri; } return clean; };