1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-10-23 11:46:13 +02:00
metamask-extension/ui/app/components/ui/mascot.js
Mark Stacey 00a73ee25e
Replace debounce package with debounce function from lodash (#7931)
These two functions differ slightly in options, but none of those
options are being used by us, so in these cases they're functionally
equivalent. They're even both descendants of the original `debounce`
function from `underscore`.

This was done to reduce the number of direct dependencies we have. It
should not affect bundle size, as we still depend upon the `debounce`
package transitively.
2020-01-29 13:36:03 -04:00

71 lines
1.7 KiB
JavaScript

import PropTypes from 'prop-types'
import React, { createRef, Component } from 'react'
import metamaskLogo from 'metamask-logo'
import { debounce } from 'lodash'
export default class Mascot extends Component {
static propTypes = {
animationEventEmitter: PropTypes.object.isRequired,
width: PropTypes.string,
height: PropTypes.string,
}
constructor (props) {
super(props)
const { width = '200', height = '200' } = props
this.logo = metamaskLogo({
followMouse: true,
pxNotRatio: true,
width,
height,
})
this.mascotContainer = createRef()
this.refollowMouse = debounce(this.logo.setFollowMouse.bind(this.logo, true), 1000)
this.unfollowMouse = this.logo.setFollowMouse.bind(this.logo, false)
}
handleAnimationEvents () {
// only setup listeners once
if (this.animations) {
return
}
this.animations = this.props.animationEventEmitter
this.animations.on('point', this.lookAt.bind(this))
this.animations.on('setFollowMouse', this.logo.setFollowMouse.bind(this.logo))
}
lookAt (target) {
this.unfollowMouse()
this.logo.lookAt(target)
this.refollowMouse()
}
componentDidMount () {
this.mascotContainer.current.appendChild(this.logo.container)
}
componentWillUnmount () {
this.animations = this.props.animationEventEmitter
this.animations.removeAllListeners()
this.logo.container.remove()
this.logo.stopAnimation()
}
render () {
// this is a bit hacky
// the event emitter is on `this.props`
// and we dont get that until render
this.handleAnimationEvents()
return (
<div
ref={this.mascotContainer}
style={{ zIndex: 0 }}
/>
)
}
}