1import { Animated } from 'react-native'; 2 3import { ImageTestProps, ImageTestEventHandler } from './types'; 4 5type LogCallback = (message: string) => void; 6 7function round(num: number): number { 8 return Math.round(num * 1000) / 1000; 9} 10 11function range( 12 start: number, 13 end: number, 14 animValue?: Animated.Value, 15 flatten?: boolean 16): number | Animated.AnimatedInterpolation<number> | string { 17 if (animValue) { 18 if (flatten) { 19 // @ts-ignore 20 if (animValue.__isNative) { 21 //return `(native: ${start}..${end})`; 22 return '(native)'; 23 } else { 24 // @ts-ignore 25 const val = animValue.__getValue(); 26 return round((end - start) * val + start); 27 } 28 } else { 29 return animValue.interpolate({ 30 inputRange: [0, 1], 31 outputRange: [start, end], 32 }); 33 } 34 } else { 35 return round((end - start) * 0.5 + start); 36 } 37} 38 39let firstTimeStamp: number = 0; 40 41function event(name: string, logCallback?: LogCallback): ImageTestEventHandler { 42 return (...args) => { 43 try { 44 const event = args[0]; 45 const { timeStamp, nativeEvent } = event; 46 firstTimeStamp = firstTimeStamp || timeStamp; 47 const msec = (timeStamp - firstTimeStamp) % 60000; 48 const message = `${msec} ${name}: ${JSON.stringify(nativeEvent)}`; 49 if (logCallback) logCallback(message); 50 } catch (err) { 51 const message = `${name}: ${err.message}`; 52 if (logCallback) logCallback(message); 53 } 54 }; 55} 56 57export function resolveProps( 58 props: ImageTestProps, 59 animValue?: Animated.Value, 60 flatten?: boolean, 61 logCallback?: LogCallback 62): ImageTestProps { 63 if (typeof props === 'function') { 64 return props({ 65 range: (start: number, end: number) => range(start, end, animValue, flatten), 66 event: (name: string) => event(name, logCallback), 67 }); 68 } else { 69 return props; 70 } 71} 72