diff --git a/lib/IconToggle.js b/lib/IconToggle.js index cc74536..7316ea7 100644 --- a/lib/IconToggle.js +++ b/lib/IconToggle.js @@ -19,6 +19,14 @@ export default class IconToggle extends Component { }; } + componentDidUpdate(prevProps) { + if (this.props && this.props.badge) { + if (this.props.badge.value !== prevProps.badge.value) { + this._animateBadgeCounter(); + } + } + }; + static propTypes = { color: PropTypes.string.isRequired, opacity: PropTypes.number, @@ -28,6 +36,7 @@ export default class IconToggle extends Component { children: PropTypes.element.isRequired, badge: PropTypes.shape({ value: PropTypes.number, + animate: PropTypes.bool, backgroundColor: PropTypes.string, textColor: PropTypes.string }) @@ -36,7 +45,7 @@ export default class IconToggle extends Component { static defaultProps = { opacity: .1, disabled: false, - percent: 90, + percent: 90 }; setSize = (event) => { @@ -65,18 +74,20 @@ export default class IconToggle extends Component { if (badge && typeof badge.value === 'number') { badge = Object.assign({}, - { value: badge.value }, - badge.backgroundColor ? { backgroundColor: badge.backgroundColor } : { backgroundColor: 'paperRed' }, - badge.textColor ? { textColor: badge.textColor } : { textColor: '#ffffff' } + {value: badge.value}, + badge.backgroundColor ? {backgroundColor: badge.backgroundColor} : {backgroundColor: 'paperRed'}, + badge.textColor ? {textColor: badge.textColor} : {textColor: '#ffffff'} ); } + this.badgeAnim = this.badgeAnim || new Animated.Value(0); + return ( {size && - + /> } { this.setSize(event) }}> {children} {size && badge && typeof badge.value === 'number' && - - - {badge.value} - - + > + + {badge.value} + + } @@ -127,6 +158,7 @@ export default class IconToggle extends Component { } }; + /** * * @private @@ -143,6 +175,22 @@ export default class IconToggle extends Component { } }; + /** + * + * @private + */ + _animateBadgeCounter = () => { + if (this.badgeAnim && this.props.badge && this.props.badge.animate !== false) { + Animated.spring(this.badgeAnim, { + toValue: 0, // Returns to the start + velocity: 8, // Velocity makes it move + tension: -5, // Slow + friction: 1, // Oscillate a lot + duration: 300 + }).start(); + } + }; + /** * * @private