UNPKG

react-native-cocentric-progress-circle

Version:

A react native concentric progress circle package

94 lines (80 loc) 2.48 kB
import React from 'react'; import PropTypes from 'prop-types'; import { Animated, Easing } from 'react-native'; import CircularProgress from './CircularProgress'; const AnimatedProgress = Animated.createAnimatedComponent(CircularProgress); export default class AnimatedCircularProgress extends React.PureComponent { constructor(props) { super(props); this.state = { fillAnimation: new Animated.Value(props.prefill), }; } componentDidMount() { this.animate(); } componentDidUpdate(prevProps) { if (prevProps.fill !== this.props.fill) { this.animate(); } } reAnimate(prefill, toVal, dur, ease) { this.setState( { fillAnimation: new Animated.Value(prefill), }, () => this.animate(toVal, dur, ease) ); } animate(toVal, dur, ease) { const toValue = toVal >= 0 ? toVal : this.props.fill; const duration = dur || this.props.duration; const easing = ease || this.props.easing; const useNativeDriver = this.props.useNativeDriver; const anim = Animated.timing(this.state.fillAnimation, { useNativeDriver, toValue, easing, duration, }); anim.start(this.props.onAnimationComplete); return anim; } animateColor() { if (!this.props.tintColorSecondary && !this.props.tintColorInputInterpolation) { return this.props.tintColor } if(this.props.tintColorSecondary){ const tintAnimation = this.state.fillAnimation.interpolate({ inputRange: [0, 100], outputRange: [this.props.tintColor, this.props.tintColorSecondary] }) return tintAnimation } if(this.props.tintColorInputInterpolation){ const tintAnimation = this.state.fillAnimation.interpolate({ inputRange: this.props.tintColorInputInterpolation, outputRange: this.props.tintColorOutputInterpolation }) return tintAnimation } } render() { const { fill, prefill, ...other } = this.props; return <AnimatedProgress {...other} fill={this.state.fillAnimation} tintColor={this.animateColor()} />; } } AnimatedCircularProgress.propTypes = { ...CircularProgress.propTypes, prefill: PropTypes.number, duration: PropTypes.number, easing: PropTypes.func, onAnimationComplete: PropTypes.func, useNativeDriver: PropTypes.bool, }; AnimatedCircularProgress.defaultProps = { duration: 500, easing: Easing.out(Easing.ease), prefill: 0, useNativeDriver: false, };