diff options
author | fusagiko / takayamaki <24884114+takayamaki@users.noreply.github.com> | 2023-04-17 14:07:27 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-17 07:07:27 +0200 |
commit | 9f8d34620b6fa502da683f3775805bf2a5474f92 (patch) | |
tree | c6e3e58da936ee79b9fd315194963dae7b8da012 /app/javascript | |
parent | cf3fa1e814c59fd25008b56a976dbc67bfc0efd0 (diff) |
Rewrite AvatarOverlay component with React hooks (#24543)
Diffstat (limited to 'app/javascript')
3 files changed, 53 insertions, 55 deletions
diff --git a/app/javascript/mastodon/components/__tests__/__snapshots__/avatar_overlay-test.jsx.snap b/app/javascript/mastodon/components/__tests__/__snapshots__/avatar_overlay-test.jsx.snap index f8385357a..fbd44ecc5 100644 --- a/app/javascript/mastodon/components/__tests__/__snapshots__/avatar_overlay-test.jsx.snap +++ b/app/javascript/mastodon/components/__tests__/__snapshots__/avatar_overlay-test.jsx.snap @@ -3,6 +3,8 @@ exports[`<AvatarOverlay renders a overlay avatar 1`] = ` <div className="account__avatar-overlay" + onMouseEnter={[Function]} + onMouseLeave={[Function]} style={ { "height": 46, @@ -15,8 +17,6 @@ exports[`<AvatarOverlay renders a overlay avatar 1`] = ` > <div className="account__avatar" - onMouseEnter={[Function]} - onMouseLeave={[Function]} style={ { "height": "36px", @@ -35,8 +35,6 @@ exports[`<AvatarOverlay renders a overlay avatar 1`] = ` > <div className="account__avatar" - onMouseEnter={[Function]} - onMouseLeave={[Function]} style={ { "height": "24px", diff --git a/app/javascript/mastodon/components/avatar_overlay.jsx b/app/javascript/mastodon/components/avatar_overlay.jsx deleted file mode 100644 index 034e8ba56..000000000 --- a/app/javascript/mastodon/components/avatar_overlay.jsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import { autoPlayGif } from '../initial_state'; -import Avatar from './avatar'; - -export default class AvatarOverlay extends React.PureComponent { - - static propTypes = { - account: ImmutablePropTypes.map.isRequired, - friend: ImmutablePropTypes.map.isRequired, - animate: PropTypes.bool, - size: PropTypes.number, - baseSize: PropTypes.number, - overlaySize: PropTypes.number, - }; - - static defaultProps = { - animate: autoPlayGif, - size: 46, - baseSize: 36, - overlaySize: 24, - }; - - state = { - hovering: false, - }; - - handleMouseEnter = () => { - if (this.props.animate) return; - this.setState({ hovering: true }); - }; - - handleMouseLeave = () => { - if (this.props.animate) return; - this.setState({ hovering: false }); - }; - - render() { - const { account, friend, animate, size, baseSize, overlaySize } = this.props; - const { hovering } = this.state; - - return ( - <div className='account__avatar-overlay' style={{ width: size, height: size }}> - <div className='account__avatar-overlay-base'><Avatar animate={hovering || animate} account={account} size={baseSize} /></div> - <div className='account__avatar-overlay-overlay'><Avatar animate={hovering || animate} account={friend} size={overlaySize} /></div> - </div> - ); - } - -} diff --git a/app/javascript/mastodon/components/avatar_overlay.tsx b/app/javascript/mastodon/components/avatar_overlay.tsx new file mode 100644 index 000000000..5c65a928c --- /dev/null +++ b/app/javascript/mastodon/components/avatar_overlay.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import type { Account } from '../../types/resources'; +import { useHovering } from '../../hooks/useHovering'; +import { autoPlayGif } from '../initial_state'; + +type Props = { + account: Account; + friend: Account; + size?: number; + baseSize?: number; + overlaySize?: number; +}; + +export const AvatarOverlay: React.FC<Props> = ({ + account, + friend, + size = 46, + baseSize = 36, + overlaySize = 24, +}) => { + const { hovering, handleMouseEnter, handleMouseLeave } = useHovering(autoPlayGif); + const accountSrc = hovering ? account?.get('avatar') : account?.get('avatar_static'); + const friendSrc = hovering ? friend?.get('avatar') : friend?.get('avatar_static'); + + return ( + <div + className='account__avatar-overlay' style={{ width: size, height: size }} + onMouseEnter={handleMouseEnter} + onMouseLeave={handleMouseLeave} + > + <div className='account__avatar-overlay-base'> + <div + className='account__avatar' + style={{ width: `${baseSize}px`, height: `${baseSize}px` }} + > + {accountSrc && <img src={accountSrc} alt={account?.get('acct')} />} + </div> + </div> + <div className='account__avatar-overlay-overlay'> + <div + className='account__avatar' + style={{ width: `${overlaySize}px`, height: `${overlaySize}px` }} + > + {friendSrc && <img src={friendSrc} alt={friend?.get('acct')} />} + </div> + </div> + </div> + ); +}; + +export default AvatarOverlay; |