import React, { useCallback } from 'react'; import type { MutableRefObject, RefObject } from 'react'; import { Animated, PanResponder, type ImageSourcePropType } from 'react-native'; import type { Color, ILuckyWheelOptionalProps, IWheelText, TextAngleType, } from '../../types'; import type { WheelSlicePayload } from './buildSlicePayload'; import { luckyWheelStyles as styles } from './styles'; import { WheelSvg } from './WheelSvg'; type PanHandlers = ReturnType['panHandlers']; type WheelFaceProps = { source?: ImageSourcePropType; size: number; rotateInterpolated: Animated.AnimatedInterpolation; backgroundColor: Color; containerRef: RefObject; panHandlers: PanHandlers; slicePayload: WheelSlicePayload[]; sliceCount: number; sliceAngle: number; sliceAngleCenter: number; outerRadius: number; innerRadius: number; textAngle: TextAngleType; textStyle: ILuckyWheelOptionalProps['textStyle']; customText?: (params: IWheelText) => React.ReactNode; enableOuterDots: boolean; dotColor: ILuckyWheelOptionalProps['dotColor']; enableInnerShadow: boolean; px: MutableRefObject; py: MutableRefObject; }; function WheelInnerShadowRing({ size, outerRadius, }: { size: number; outerRadius: number; }) { return ( ); } export function WheelFace({ source, size, rotateInterpolated, backgroundColor, containerRef, panHandlers, slicePayload, sliceCount, sliceAngle, sliceAngleCenter, outerRadius, innerRadius, textAngle, textStyle, customText, enableOuterDots, dotColor, enableInnerShadow, px, py, }: WheelFaceProps) { const measureLayout = useCallback(() => { const node = containerRef.current; if (node && typeof node.measureInWindow === 'function') { node.measureInWindow((x: number, y: number) => { px.current = x; py.current = y; }); } }, [containerRef, px, py]); if (source) { return ( } onLayout={measureLayout} style={[ styles.wheel, { width: size, height: size, transform: [{ rotate: rotateInterpolated }], }, ]} source={source} {...panHandlers} /> ); } return ( {enableInnerShadow ? ( ) : null} ); }