import React from 'react'; import { StyleProp, TextStyle, Animated, ViewStyle, Text } from 'react-native'; import styles from './wheel-picker.style'; import { isEqual } from 'lodash'; import { PickerOption } from 'src/types'; interface ItemProps { textStyle: StyleProp; textClassName: string; style: StyleProp; option: PickerOption | null; height: number; index: number; currentScrollIndex: Animated.AnimatedAddition; visibleRest: number; rotationFunction: (x: number) => number; opacityFunction: (x: number) => number; scaleFunction: (x: number) => number; } const WheelPickerItem: React.FC = ({ textStyle, textClassName, style, height, option, index, visibleRest, currentScrollIndex, opacityFunction, rotationFunction, scaleFunction, }) => { const relativeScrollIndex = Animated.subtract(index, currentScrollIndex); const translateY = relativeScrollIndex.interpolate({ inputRange: (() => { const range = [0]; for (let i = 1; i <= visibleRest + 1; i++) { range.unshift(-i); range.push(i); } return range; })(), outputRange: (() => { const range = [0]; for (let i = 1; i <= visibleRest + 1; i++) { let y = (height / 2) * (1 - Math.sin(Math.PI / 2 - rotationFunction(i))); for (let j = 1; j < i; j++) { y += height * (1 - Math.sin(Math.PI / 2 - rotationFunction(j))); } range.unshift(y); range.push(-y); } return range; })(), }); const opacity = relativeScrollIndex.interpolate({ inputRange: (() => { const range = [0]; for (let i = 1; i <= visibleRest + 1; i++) { range.unshift(-i); range.push(i); } return range; })(), outputRange: (() => { const range = [1]; for (let x = 1; x <= visibleRest + 1; x++) { const y = opacityFunction(x); range.unshift(y); range.push(y); } return range; })(), }); const scale = relativeScrollIndex.interpolate({ inputRange: (() => { const range = [0]; for (let i = 1; i <= visibleRest + 1; i++) { range.unshift(-i); range.push(i); } return range; })(), outputRange: (() => { const range = [1.0]; for (let x = 1; x <= visibleRest + 1; x++) { const y = scaleFunction(x); range.unshift(y); range.push(y); } return range; })(), }); const rotateX = relativeScrollIndex.interpolate({ inputRange: (() => { const range = [0]; for (let i = 1; i <= visibleRest + 1; i++) { range.unshift(-i); range.push(i); } return range; })(), outputRange: (() => { const range = ['0deg']; for (let x = 1; x <= visibleRest + 1; x++) { const y = rotationFunction(x); range.unshift(`${y}deg`); range.push(`${y}deg`); } return range; })(), }); return ( {option?.text} ); }; const customComparator = ( prevProps: Readonly, nextProps: Readonly ) => { return ( prevProps.textClassName === nextProps.textClassName && isEqual(prevProps.textStyle, nextProps.textStyle) ); }; export default React.memo(WheelPickerItem, customComparator);