Change custom emoji to be animated when hovering container (#15637)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
		| @@ -3,6 +3,8 @@ | ||||
| exports[`<DisplayName /> renders display name + account name 1`] = ` | ||||
| <span | ||||
|   className="display-name" | ||||
|   onMouseEnter={[Function]} | ||||
|   onMouseLeave={[Function]} | ||||
| > | ||||
|   <bdi> | ||||
|     <strong | ||||
|   | ||||
| @@ -11,45 +11,30 @@ export default class DisplayName extends React.PureComponent { | ||||
|     localDomain: PropTypes.string, | ||||
|   }; | ||||
|  | ||||
|   _updateEmojis () { | ||||
|     const node = this.node; | ||||
|  | ||||
|     if (!node || autoPlayGif) { | ||||
|   handleMouseEnter = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const emojis = node.querySelectorAll('.custom-emoji'); | ||||
|     const emojis = currentTarget.querySelectorAll('.custom-emoji'); | ||||
|  | ||||
|     for (var i = 0; i < emojis.length; i++) { | ||||
|       let emoji = emojis[i]; | ||||
|       if (emoji.classList.contains('status-emoji')) { | ||||
|         continue; | ||||
|       } | ||||
|       emoji.classList.add('status-emoji'); | ||||
|  | ||||
|       emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false); | ||||
|       emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false); | ||||
|       emoji.src = emoji.getAttribute('data-original'); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   componentDidMount () { | ||||
|     this._updateEmojis(); | ||||
|   } | ||||
|   handleMouseLeave = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   componentDidUpdate () { | ||||
|     this._updateEmojis(); | ||||
|   } | ||||
|     const emojis = currentTarget.querySelectorAll('.custom-emoji'); | ||||
|  | ||||
|   handleEmojiMouseEnter = ({ target }) => { | ||||
|     target.src = target.getAttribute('data-original'); | ||||
|   } | ||||
|  | ||||
|   handleEmojiMouseLeave = ({ target }) => { | ||||
|     target.src = target.getAttribute('data-static'); | ||||
|   } | ||||
|  | ||||
|   setRef = (c) => { | ||||
|     this.node = c; | ||||
|     for (var i = 0; i < emojis.length; i++) { | ||||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-static'); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   render () { | ||||
| @@ -81,7 +66,7 @@ export default class DisplayName extends React.PureComponent { | ||||
|     } | ||||
|  | ||||
|     return ( | ||||
|       <span className='display-name' ref={this.setRef}> | ||||
|       <span className='display-name' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> | ||||
|         {displayName} {suffix} | ||||
|       </span> | ||||
|     ); | ||||
|   | ||||
| @@ -75,35 +75,38 @@ export default class StatusContent extends React.PureComponent { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   _updateStatusEmojis () { | ||||
|     const node = this.node; | ||||
|  | ||||
|     if (!node || autoPlayGif) { | ||||
|   handleMouseEnter = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const emojis = node.querySelectorAll('.custom-emoji'); | ||||
|     const emojis = currentTarget.querySelectorAll('.custom-emoji'); | ||||
|  | ||||
|     for (var i = 0; i < emojis.length; i++) { | ||||
|       let emoji = emojis[i]; | ||||
|       if (emoji.classList.contains('status-emoji')) { | ||||
|         continue; | ||||
|       } | ||||
|       emoji.classList.add('status-emoji'); | ||||
|       emoji.src = emoji.getAttribute('data-original'); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|       emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false); | ||||
|       emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false); | ||||
|   handleMouseLeave = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const emojis = currentTarget.querySelectorAll('.custom-emoji'); | ||||
|  | ||||
|     for (var i = 0; i < emojis.length; i++) { | ||||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-static'); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   componentDidMount () { | ||||
|     this._updateStatusLinks(); | ||||
|     this._updateStatusEmojis(); | ||||
|   } | ||||
|  | ||||
|   componentDidUpdate () { | ||||
|     this._updateStatusLinks(); | ||||
|     this._updateStatusEmojis(); | ||||
|   } | ||||
|  | ||||
|   onMentionClick = (mention, e) => { | ||||
| @@ -122,14 +125,6 @@ export default class StatusContent extends React.PureComponent { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   handleEmojiMouseEnter = ({ target }) => { | ||||
|     target.src = target.getAttribute('data-original'); | ||||
|   } | ||||
|  | ||||
|   handleEmojiMouseLeave = ({ target }) => { | ||||
|     target.src = target.getAttribute('data-static'); | ||||
|   } | ||||
|  | ||||
|   handleMouseDown = (e) => { | ||||
|     this.startXY = [e.clientX, e.clientY]; | ||||
|   } | ||||
| @@ -219,7 +214,7 @@ export default class StatusContent extends React.PureComponent { | ||||
|       } | ||||
|  | ||||
|       return ( | ||||
|         <div className={classNames} ref={this.setRef} tabIndex='0' onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp}> | ||||
|         <div className={classNames} ref={this.setRef} tabIndex='0' onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> | ||||
|           <p style={{ marginBottom: hidden && status.get('mentions').isEmpty() ? '0px' : null }}> | ||||
|             <span dangerouslySetInnerHTML={spoilerContent} className='translate' /> | ||||
|             {' '} | ||||
| @@ -237,7 +232,7 @@ export default class StatusContent extends React.PureComponent { | ||||
|       ); | ||||
|     } else if (this.props.onClick) { | ||||
|       const output = [ | ||||
|         <div className={classNames} ref={this.setRef} tabIndex='0' onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp} key='status-content'> | ||||
|         <div className={classNames} ref={this.setRef} tabIndex='0' onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp} key='status-content' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> | ||||
|           <div className='status__content__text status__content__text--visible translate' dangerouslySetInnerHTML={content} /> | ||||
|  | ||||
|           {!!status.get('poll') && <PollContainer pollId={status.get('poll')} />} | ||||
| @@ -253,7 +248,7 @@ export default class StatusContent extends React.PureComponent { | ||||
|       return output; | ||||
|     } else { | ||||
|       return ( | ||||
|         <div className={classNames} ref={this.setRef} tabIndex='0'> | ||||
|         <div className={classNames} ref={this.setRef} tabIndex='0' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> | ||||
|           <div className='status__content__text status__content__text--visible translate' dangerouslySetInnerHTML={content} /> | ||||
|  | ||||
|           {!!status.get('poll') && <PollContainer pollId={status.get('poll')} />} | ||||
|   | ||||
| @@ -96,45 +96,30 @@ class Header extends ImmutablePureComponent { | ||||
|     return !location.pathname.match(/\/(followers|following)\/?$/); | ||||
|   } | ||||
|  | ||||
|   _updateEmojis () { | ||||
|     const node = this.node; | ||||
|  | ||||
|     if (!node || autoPlayGif) { | ||||
|   handleMouseEnter = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const emojis = node.querySelectorAll('.custom-emoji'); | ||||
|     const emojis = currentTarget.querySelectorAll('.custom-emoji'); | ||||
|  | ||||
|     for (var i = 0; i < emojis.length; i++) { | ||||
|       let emoji = emojis[i]; | ||||
|       if (emoji.classList.contains('status-emoji')) { | ||||
|         continue; | ||||
|       } | ||||
|       emoji.classList.add('status-emoji'); | ||||
|  | ||||
|       emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false); | ||||
|       emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false); | ||||
|       emoji.src = emoji.getAttribute('data-original'); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   componentDidMount () { | ||||
|     this._updateEmojis(); | ||||
|   } | ||||
|   handleMouseLeave = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   componentDidUpdate () { | ||||
|     this._updateEmojis(); | ||||
|   } | ||||
|     const emojis = currentTarget.querySelectorAll('.custom-emoji'); | ||||
|  | ||||
|   handleEmojiMouseEnter = ({ target }) => { | ||||
|     target.src = target.getAttribute('data-original'); | ||||
|   } | ||||
|  | ||||
|   handleEmojiMouseLeave = ({ target }) => { | ||||
|     target.src = target.getAttribute('data-static'); | ||||
|   } | ||||
|  | ||||
|   setRef = (c) => { | ||||
|     this.node = c; | ||||
|     for (var i = 0; i < emojis.length; i++) { | ||||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-static'); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   render () { | ||||
| @@ -276,7 +261,7 @@ class Header extends ImmutablePureComponent { | ||||
|     } | ||||
|  | ||||
|     return ( | ||||
|       <div className={classNames('account__header', { inactive: !!account.get('moved') })} ref={this.setRef}> | ||||
|       <div className={classNames('account__header', { inactive: !!account.get('moved') })} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> | ||||
|         <div className='account__header__image'> | ||||
|           <div className='account__header__info'> | ||||
|             {!suspended && info} | ||||
|   | ||||
| @@ -44,41 +44,30 @@ class Conversation extends ImmutablePureComponent { | ||||
|     intl: PropTypes.object.isRequired, | ||||
|   }; | ||||
|  | ||||
|   _updateEmojis () { | ||||
|     const node = this.namesNode; | ||||
|  | ||||
|     if (!node || autoPlayGif) { | ||||
|   handleMouseEnter = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const emojis = node.querySelectorAll('.custom-emoji'); | ||||
|     const emojis = currentTarget.querySelectorAll('.custom-emoji'); | ||||
|  | ||||
|     for (var i = 0; i < emojis.length; i++) { | ||||
|       let emoji = emojis[i]; | ||||
|       if (emoji.classList.contains('status-emoji')) { | ||||
|         continue; | ||||
|       } | ||||
|       emoji.classList.add('status-emoji'); | ||||
|  | ||||
|       emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false); | ||||
|       emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false); | ||||
|       emoji.src = emoji.getAttribute('data-original'); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   componentDidMount () { | ||||
|     this._updateEmojis(); | ||||
|   } | ||||
|   handleMouseLeave = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   componentDidUpdate () { | ||||
|     this._updateEmojis(); | ||||
|   } | ||||
|     const emojis = currentTarget.querySelectorAll('.custom-emoji'); | ||||
|  | ||||
|   handleEmojiMouseEnter = ({ target }) => { | ||||
|     target.src = target.getAttribute('data-original'); | ||||
|   } | ||||
|  | ||||
|   handleEmojiMouseLeave = ({ target }) => { | ||||
|     target.src = target.getAttribute('data-static'); | ||||
|     for (var i = 0; i < emojis.length; i++) { | ||||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-static'); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   handleClick = () => { | ||||
| @@ -123,10 +112,6 @@ class Conversation extends ImmutablePureComponent { | ||||
|     this.props.onToggleHidden(this.props.lastStatus); | ||||
|   } | ||||
|  | ||||
|   setNamesRef = (c) => { | ||||
|     this.namesNode = c; | ||||
|   } | ||||
|  | ||||
|   render () { | ||||
|     const { accounts, lastStatus, unread, scrollKey, intl } = this.props; | ||||
|  | ||||
| @@ -171,7 +156,7 @@ class Conversation extends ImmutablePureComponent { | ||||
|                 {unread && <span className='conversation__unread' />} <RelativeTimestamp timestamp={lastStatus.get('created_at')} /> | ||||
|               </div> | ||||
|  | ||||
|               <div className='conversation__content__names' ref={this.setNamesRef}> | ||||
|               <div className='conversation__content__names' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> | ||||
|                 <FormattedMessage id='conversation.with' defaultMessage='With {names}' values={{ names: <span>{names}</span> }} /> | ||||
|               </div> | ||||
|             </div> | ||||
|   | ||||
| @@ -102,43 +102,32 @@ class AccountCard extends ImmutablePureComponent { | ||||
|     onMute: PropTypes.func.isRequired, | ||||
|   }; | ||||
|  | ||||
|   _updateEmojis() { | ||||
|     const node = this.node; | ||||
|  | ||||
|     if (!node || autoPlayGif) { | ||||
|   handleMouseEnter = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const emojis = node.querySelectorAll('.custom-emoji'); | ||||
|     const emojis = currentTarget.querySelectorAll('.custom-emoji'); | ||||
|  | ||||
|     for (var i = 0; i < emojis.length; i++) { | ||||
|       let emoji = emojis[i]; | ||||
|       if (emoji.classList.contains('status-emoji')) { | ||||
|         continue; | ||||
|       } | ||||
|       emoji.classList.add('status-emoji'); | ||||
|  | ||||
|       emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false); | ||||
|       emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false); | ||||
|       emoji.src = emoji.getAttribute('data-original'); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   componentDidMount() { | ||||
|     this._updateEmojis(); | ||||
|   handleMouseLeave = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const emojis = currentTarget.querySelectorAll('.custom-emoji'); | ||||
|  | ||||
|     for (var i = 0; i < emojis.length; i++) { | ||||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-static'); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   componentDidUpdate() { | ||||
|     this._updateEmojis(); | ||||
|   } | ||||
|  | ||||
|   handleEmojiMouseEnter = ({ target }) => { | ||||
|     target.src = target.getAttribute('data-original'); | ||||
|   }; | ||||
|  | ||||
|   handleEmojiMouseLeave = ({ target }) => { | ||||
|     target.src = target.getAttribute('data-static'); | ||||
|   }; | ||||
|  | ||||
|   handleFollow = () => { | ||||
|     this.props.onFollow(this.props.account); | ||||
|   }; | ||||
| @@ -151,10 +140,6 @@ class AccountCard extends ImmutablePureComponent { | ||||
|     this.props.onMute(this.props.account); | ||||
|   }; | ||||
|  | ||||
|   setRef = (c) => { | ||||
|     this.node = c; | ||||
|   }; | ||||
|  | ||||
|   render() { | ||||
|     const { account, intl } = this.props; | ||||
|  | ||||
| @@ -239,7 +224,7 @@ class AccountCard extends ImmutablePureComponent { | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <div className='directory__card__extra' ref={this.setRef}> | ||||
|         <div className='directory__card__extra' onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> | ||||
|           <div | ||||
|             className='account__header__content translate' | ||||
|             dangerouslySetInnerHTML={{ __html: account.get('note_emojified') }} | ||||
|   | ||||
| @@ -39,35 +39,10 @@ class Content extends ImmutablePureComponent { | ||||
|  | ||||
|   componentDidMount () { | ||||
|     this._updateLinks(); | ||||
|     this._updateEmojis(); | ||||
|   } | ||||
|  | ||||
|   componentDidUpdate () { | ||||
|     this._updateLinks(); | ||||
|     this._updateEmojis(); | ||||
|   } | ||||
|  | ||||
|   _updateEmojis () { | ||||
|     const node = this.node; | ||||
|  | ||||
|     if (!node || autoPlayGif) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const emojis = node.querySelectorAll('.custom-emoji'); | ||||
|  | ||||
|     for (var i = 0; i < emojis.length; i++) { | ||||
|       let emoji = emojis[i]; | ||||
|  | ||||
|       if (emoji.classList.contains('status-emoji')) { | ||||
|         continue; | ||||
|       } | ||||
|  | ||||
|       emoji.classList.add('status-emoji'); | ||||
|  | ||||
|       emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false); | ||||
|       emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   _updateLinks () { | ||||
| @@ -132,12 +107,30 @@ class Content extends ImmutablePureComponent { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   handleEmojiMouseEnter = ({ target }) => { | ||||
|     target.src = target.getAttribute('data-original'); | ||||
|   handleMouseEnter = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const emojis = currentTarget.querySelectorAll('.custom-emoji'); | ||||
|  | ||||
|     for (var i = 0; i < emojis.length; i++) { | ||||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-original'); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   handleEmojiMouseLeave = ({ target }) => { | ||||
|     target.src = target.getAttribute('data-static'); | ||||
|   handleMouseLeave = ({ currentTarget }) => { | ||||
|     if (autoPlayGif) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const emojis = currentTarget.querySelectorAll('.custom-emoji'); | ||||
|  | ||||
|     for (var i = 0; i < emojis.length; i++) { | ||||
|       let emoji = emojis[i]; | ||||
|       emoji.src = emoji.getAttribute('data-static'); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   render () { | ||||
| @@ -148,6 +141,8 @@ class Content extends ImmutablePureComponent { | ||||
|         className='announcements__item__content translate' | ||||
|         ref={this.setRef} | ||||
|         dangerouslySetInnerHTML={{ __html: announcement.get('contentHtml') }} | ||||
|         onMouseEnter={this.handleMouseEnter} | ||||
|         onMouseLeave={this.handleMouseLeave} | ||||
|       /> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user