mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
MetaMask mascot support for provided directions targets and toggling followMouse (#9166)
* MetaMask mascot support for provided directions targets and toggling followMouse * Fixes for mascot.component.js * Update metamask-logo version to 2.4.0 * Lint fix * Fix mouse follow updating Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Improve mascot story name Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Update package.json Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Lint fix Co-authored-by: Mark Stacey <markjstacey@gmail.com>
This commit is contained in:
parent
5f11273550
commit
42f4c2e407
@ -127,7 +127,7 @@
|
|||||||
"lodash": "^4.17.19",
|
"lodash": "^4.17.19",
|
||||||
"loglevel": "^1.4.1",
|
"loglevel": "^1.4.1",
|
||||||
"luxon": "^1.24.1",
|
"luxon": "^1.24.1",
|
||||||
"metamask-logo": "^2.1.4",
|
"metamask-logo": "^2.4.1",
|
||||||
"multihashes": "^0.4.12",
|
"multihashes": "^0.4.12",
|
||||||
"nanoid": "^2.1.6",
|
"nanoid": "^2.1.6",
|
||||||
"nonce-tracker": "^1.0.0",
|
"nonce-tracker": "^1.0.0",
|
||||||
|
@ -3,20 +3,43 @@ import React, { createRef, Component } from 'react'
|
|||||||
import metamaskLogo from 'metamask-logo'
|
import metamaskLogo from 'metamask-logo'
|
||||||
import { debounce } from 'lodash'
|
import { debounce } from 'lodash'
|
||||||
|
|
||||||
|
const directionTargetGenerator = ({ top, left, height, width }) => {
|
||||||
|
const horizontalMiddle = left + (width / 2)
|
||||||
|
const verticalMiddle = top + (height / 2)
|
||||||
|
return {
|
||||||
|
up: { x: horizontalMiddle, y: top - height },
|
||||||
|
down: { x: horizontalMiddle, y: top + (height * 2) },
|
||||||
|
left: { x: left - width, y: verticalMiddle },
|
||||||
|
right: { x: left + (width * 2), y: verticalMiddle },
|
||||||
|
middle: { x: horizontalMiddle, y: verticalMiddle },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export default class Mascot extends Component {
|
export default class Mascot extends Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
animationEventEmitter: PropTypes.object.isRequired,
|
animationEventEmitter: PropTypes.object.isRequired,
|
||||||
width: PropTypes.string,
|
width: PropTypes.string,
|
||||||
height: PropTypes.string,
|
height: PropTypes.string,
|
||||||
|
followMouse: PropTypes.bool,
|
||||||
|
lookAtTarget: PropTypes.object,
|
||||||
|
lookAtDirection: PropTypes.oneOf(['up', 'down', 'left', 'right', 'middle']),
|
||||||
|
}
|
||||||
|
|
||||||
|
static defaultProps = {
|
||||||
|
width: '200',
|
||||||
|
height: '200',
|
||||||
|
followMouse: true,
|
||||||
|
lookAtTarget: {},
|
||||||
|
lookAtDirection: '',
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor (props) {
|
constructor (props) {
|
||||||
super(props)
|
super(props)
|
||||||
|
|
||||||
const { width = '200', height = '200' } = props
|
const { width, height, followMouse } = props
|
||||||
|
|
||||||
this.logo = metamaskLogo({
|
this.logo = metamaskLogo({
|
||||||
followMouse: true,
|
followMouse,
|
||||||
pxNotRatio: true,
|
pxNotRatio: true,
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
@ -46,6 +69,30 @@ export default class Mascot extends Component {
|
|||||||
|
|
||||||
componentDidMount () {
|
componentDidMount () {
|
||||||
this.mascotContainer.current.appendChild(this.logo.container)
|
this.mascotContainer.current.appendChild(this.logo.container)
|
||||||
|
this.directionTargetMap = directionTargetGenerator(this.mascotContainer.current.getBoundingClientRect())
|
||||||
|
|
||||||
|
const { lookAtTarget, lookAtDirection } = this.props
|
||||||
|
|
||||||
|
if (lookAtTarget?.x && lookAtTarget?.y) {
|
||||||
|
this.logo.lookAtAndRender(lookAtTarget)
|
||||||
|
} else if (lookAtDirection) {
|
||||||
|
this.logo.lookAtAndRender(this.directionTargetMap[lookAtDirection])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate (prevProps) {
|
||||||
|
const { lookAtTarget: prevTarget = {}, lookAtDirection: prevDirection = '', followMouse: prevFollowMouse } = prevProps
|
||||||
|
const { lookAtTarget = {}, followMouse, lookAtDirection } = this.props
|
||||||
|
|
||||||
|
if (lookAtDirection && prevDirection !== lookAtDirection) {
|
||||||
|
this.logo.lookAtAndRender(this.directionTargetMap[lookAtDirection])
|
||||||
|
} else if (lookAtTarget?.x !== prevTarget?.x || lookAtTarget?.y !== prevTarget?.y) {
|
||||||
|
this.logo.lookAtAndRender(lookAtTarget)
|
||||||
|
}
|
||||||
|
if (prevFollowMouse !== followMouse) {
|
||||||
|
this.unfollowMouse()
|
||||||
|
followMouse && this.refollowMouse()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount () {
|
componentWillUnmount () {
|
||||||
|
98
ui/app/components/ui/mascot/mascot.stories.js
Normal file
98
ui/app/components/ui/mascot/mascot.stories.js
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
import EventEmitter from 'events'
|
||||||
|
import React, { useState } from 'react'
|
||||||
|
import Button from '../button'
|
||||||
|
import ButtonGroup from '../button-group'
|
||||||
|
import Mascot from './mascot.component'
|
||||||
|
|
||||||
|
const animationEventEmitter = new EventEmitter()
|
||||||
|
|
||||||
|
const containerStyle = {
|
||||||
|
height: '600px',
|
||||||
|
width: '357px',
|
||||||
|
border: '1px solid black',
|
||||||
|
display: 'flex',
|
||||||
|
flexFlow: 'column',
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
}
|
||||||
|
|
||||||
|
const buttonStyle = {
|
||||||
|
marginTop: '16px',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
title: 'Mascot',
|
||||||
|
}
|
||||||
|
|
||||||
|
export function Demo () {
|
||||||
|
const [lookAtDirection, setLookAtDirection] = useState(null)
|
||||||
|
const [followMouseMode, setFollowMouseMode] = useState(false)
|
||||||
|
const [clickToLookMode, setClickToLookMode] = useState(false)
|
||||||
|
const [clickedTarget, setClickedTarget] = useState(null)
|
||||||
|
|
||||||
|
const createDirectionOnClick = (direction) => () => {
|
||||||
|
setFollowMouseMode(false)
|
||||||
|
setClickToLookMode(false)
|
||||||
|
setLookAtDirection(direction)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
style={containerStyle}
|
||||||
|
onClick={(event) => {
|
||||||
|
const isButtonClick = event.target.classList.contains('button-group__button')
|
||||||
|
if (clickToLookMode && !isButtonClick) {
|
||||||
|
setLookAtDirection(null)
|
||||||
|
setClickedTarget({ x: event.clientX, y: event.clientY })
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Mascot
|
||||||
|
animationEventEmitter={animationEventEmitter}
|
||||||
|
width="120"
|
||||||
|
height="120"
|
||||||
|
followMouse={followMouseMode}
|
||||||
|
lookAtTarget={clickedTarget}
|
||||||
|
lookAtDirection={lookAtDirection}
|
||||||
|
/>
|
||||||
|
<div style={buttonStyle}>
|
||||||
|
<ButtonGroup
|
||||||
|
style={{ width: '300px', flexFlow: 'column' }}
|
||||||
|
defaultActiveButtonIndex={4}
|
||||||
|
>
|
||||||
|
<Button onClick={createDirectionOnClick('up')}>
|
||||||
|
Up
|
||||||
|
</Button>
|
||||||
|
<Button onClick={createDirectionOnClick('down')}>
|
||||||
|
Down
|
||||||
|
</Button>
|
||||||
|
<Button onClick={createDirectionOnClick('left')}>
|
||||||
|
Left
|
||||||
|
</Button>
|
||||||
|
<Button onClick={createDirectionOnClick('right')}>
|
||||||
|
Right
|
||||||
|
</Button>
|
||||||
|
<Button onClick={createDirectionOnClick('middle')}>
|
||||||
|
Middle
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
onClick={() => {
|
||||||
|
setFollowMouseMode(true)
|
||||||
|
setClickToLookMode(false)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Follow Mouse mode
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
onClick={() => {
|
||||||
|
setFollowMouseMode(false)
|
||||||
|
setClickToLookMode(true)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Look a clicked location mode
|
||||||
|
</Button>
|
||||||
|
</ButtonGroup>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
@ -18044,10 +18044,10 @@ mersenne-twister@^1.0.1, mersenne-twister@^1.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz#f916618ee43d7179efcf641bec4531eb9670978a"
|
resolved "https://registry.yarnpkg.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz#f916618ee43d7179efcf641bec4531eb9670978a"
|
||||||
integrity sha1-+RZhjuQ9cXnvz2Qb7EUx65Zwl4o=
|
integrity sha1-+RZhjuQ9cXnvz2Qb7EUx65Zwl4o=
|
||||||
|
|
||||||
metamask-logo@^2.1.4:
|
metamask-logo@^2.4.1:
|
||||||
version "2.1.4"
|
version "2.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/metamask-logo/-/metamask-logo-2.1.4.tgz#0612b2b0ffc7eeb6be480c310785426ad9599e3c"
|
resolved "https://registry.yarnpkg.com/metamask-logo/-/metamask-logo-2.4.1.tgz#7b51456358e2d8b4576a1487640b7da304ddae87"
|
||||||
integrity sha512-hg/FzMfijpzGgLdZWH+KJKS56cRYaMEwcOq8UcnL/MznpgK4OMlJEaIfO8lg7P2F4Z74Ki+ulrTrFW6jf9L2bw==
|
integrity sha512-JPMCLs/p3RTL/pLpbofV69kPn/AKJrpIdtFBZd9d+3p3f/HydT9tply2SWBr+8RjnsUaNmUoaBBZilvlPzcTDg==
|
||||||
dependencies:
|
dependencies:
|
||||||
gl-mat4 "1.1.4"
|
gl-mat4 "1.1.4"
|
||||||
gl-vec3 "1.0.3"
|
gl-vec3 "1.0.3"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user