import * as React from 'react'; import { Animated, Easing } from 'react-native'; import { IMDIndicatorProps, styles } from './indicator-interface'; export default { roller (index: number, progress: Animated.Value, props: IMDIndicatorProps) { const { size, color, duration } = props; const frames = (60 * duration!) / 1000; const easing = Easing.bezier(0.4, 0.0, 0.7, 1.0); const inputRange = Array.from( new Array(frames), (value, i) => i / (frames - 1) ); const outputRange = Array.from(new Array(frames), (value, i) => { const rotation = index ? 360 - 15 : -(180 - 15); const direction = index ? -1 : 1; let _progress = (2 * i) / (frames - 1); if (_progress > 1.0) { _progress = 2.0 - _progress; } return direction * (180 - 30) * easing(_progress) + rotation + 'deg'; }); const layerStyle = { width: size, height: size, transform: [ { rotate: progress.interpolate({ inputRange: [0, 1], outputRange: [0 + 30 + 15 + 'deg', 2 * 360 + 30 + 15 + 'deg'], }), }, ], }; const viewportStyle = { width: size, height: size, transform: [ { translateY: index ? -size! / 2 : 0, }, { rotate: progress.interpolate({ inputRange, outputRange }), }, ], }; const containerStyle = { width: size, height: size! / 2, overflow: 'hidden', }; const offsetStyle = index ? { top: size! / 2 } : null; const lineStyle = { width: size, height: size, borderColor: color, borderWidth: size! / 10, borderRadius: size! / 2, }; return ( ); }, spinner (index: number, progress: Animated.Value, props: IMDIndicatorProps) { const { size, color, count } = props; const angle = (index * 360) / count!; const layerStyle = { transform: [ { rotate: angle + 'deg', }, ], }; const inputRange = Array.from( new Array(count! + 1), (value, _index) => _index / count! ); const outputRange = Array.from(new Array(count), (value, _index) => Math.max(1.0 - _index * (1 / (count! - 1)), 0) ); for (let j = 0; j < index; j++) { outputRange.unshift(outputRange.pop()!); } outputRange.unshift(...outputRange.slice(-1)); const barStyle = { width: size! / 10, height: size! / 4, borderRadius: size! / 20, backgroundColor: color, opacity: progress.interpolate({ inputRange, outputRange }), }; return ( ); }, carousel (index: number, progress: Animated.Value, props: IMDIndicatorProps) { const { size, color, count } = props; const inputRange = [ 0.0, (index + 0.5) / (count! + 1), (index + 1.0) / (count! + 1), (index + 1.5) / (count! + 1), 1.0, ]; const opacityOutputRange = [0.5, 0.8, 1, 0.7, 0.5]; const scaleOutputRange = [1.0, 1.36, 1.56, 1.06, 1.0]; const style = { width: size, height: size, margin: size! / 2, borderRadius: size! / 2, backgroundColor: color, opacity: progress.interpolate({ inputRange, outputRange: opacityOutputRange, }), transform: [ { scale: progress.interpolate({ inputRange, outputRange: scaleOutputRange, }), }, ], }; return ; }, };