revert some changes to resolve what looks like a props mutation race-condition
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>pull/21833/head
							parent
							
								
									9d7a7c707f
								
							
						
					
					
						commit
						4e8203cca1
					
				|  | @ -19,11 +19,10 @@ import PropTypes from 'prop-types'; | |||
| import classNames from 'classnames'; | ||||
| 
 | ||||
| import {MatrixClientPeg} from '../../../MatrixClientPeg'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import { formatCommaSeparatedList } from '../../../utils/FormattingUtils'; | ||||
| import dis from "../../../dispatcher/dispatcher"; | ||||
| import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; | ||||
| import {unicodeToShortcode} from "../../../HtmlUtils"; | ||||
| 
 | ||||
| export default class ReactionsRowButton extends React.PureComponent { | ||||
|     static propTypes = { | ||||
|  | @ -39,6 +38,14 @@ export default class ReactionsRowButton extends React.PureComponent { | |||
|         myReactionEvent: PropTypes.object, | ||||
|     } | ||||
| 
 | ||||
|     constructor(props) { | ||||
|         super(props); | ||||
| 
 | ||||
|         this.state = { | ||||
|             tooltipVisible: false, | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     onClick = (ev) => { | ||||
|         const { mxEvent, myReactionEvent, content } = this.props; | ||||
|         if (myReactionEvent) { | ||||
|  | @ -58,7 +65,24 @@ export default class ReactionsRowButton extends React.PureComponent { | |||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     onMouseOver = () => { | ||||
|         this.setState({ | ||||
|             // To avoid littering the DOM with a tooltip for every reaction,
 | ||||
|             // only render it on first use.
 | ||||
|             tooltipRendered: true, | ||||
|             tooltipVisible: true, | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     onMouseOut = () => { | ||||
|         this.setState({ | ||||
|             tooltipVisible: false, | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         const ReactionsRowButtonTooltip = | ||||
|             sdk.getComponent('messages.ReactionsRowButtonTooltip'); | ||||
|         const { mxEvent, content, count, reactionEvents, myReactionEvent } = this.props; | ||||
| 
 | ||||
|         const classes = classNames({ | ||||
|  | @ -66,9 +90,18 @@ export default class ReactionsRowButton extends React.PureComponent { | |||
|             mx_ReactionsRowButton_selected: !!myReactionEvent, | ||||
|         }); | ||||
| 
 | ||||
|         let tooltip; | ||||
|         if (this.state.tooltipRendered) { | ||||
|             tooltip = <ReactionsRowButtonTooltip | ||||
|                 mxEvent={this.props.mxEvent} | ||||
|                 content={content} | ||||
|                 reactionEvents={reactionEvents} | ||||
|                 visible={this.state.tooltipVisible} | ||||
|             />; | ||||
|         } | ||||
| 
 | ||||
|         const room = MatrixClientPeg.get().getRoom(mxEvent.getRoomId()); | ||||
|         let label; | ||||
|         let tooltip; | ||||
|         if (room) { | ||||
|             const senders = []; | ||||
|             for (const reactionEvent of reactionEvents) { | ||||
|  | @ -93,37 +126,14 @@ export default class ReactionsRowButton extends React.PureComponent { | |||
|                     }, | ||||
|                 }, | ||||
|             ); | ||||
| 
 | ||||
|             const shortName = unicodeToShortcode(content); | ||||
|             tooltip = <div>{_t( | ||||
|                 "<reactors/><reactedWith>reacted with %(shortName)s</reactedWith>", | ||||
|                 { | ||||
|                     shortName, | ||||
|                 }, | ||||
|                 { | ||||
|                     reactors: () => { | ||||
|                         return <div className="mx_ReactionsRowButtonTooltip_senders"> | ||||
|                             {formatCommaSeparatedList(senders, 6)} | ||||
|                         </div>; | ||||
|                     }, | ||||
|                     reactedWith: (sub) => { | ||||
|                         if (!shortName) { | ||||
|                             return null; | ||||
|                         } | ||||
|                         return <div className="mx_ReactionsRowButtonTooltip_reactedWith"> | ||||
|                             {sub} | ||||
|                         </div>; | ||||
|                     }, | ||||
|                 }, | ||||
|             )}</div>; | ||||
|         } | ||||
| 
 | ||||
|         return <AccessibleTooltipButton | ||||
|             className={classes} | ||||
|         const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); | ||||
|         return <AccessibleButton className={classes} | ||||
|             aria-label={label} | ||||
|             onClick={this.onClick} | ||||
|             title={label} | ||||
|             tooltip={tooltip} | ||||
|             tooltipClassName="mx_Tooltip_timeline" | ||||
|             onMouseOver={this.onMouseOver} | ||||
|             onMouseOut={this.onMouseOut} | ||||
|         > | ||||
|             <span className="mx_ReactionsRowButton_content" aria-hidden="true"> | ||||
|                 {content} | ||||
|  | @ -131,6 +141,7 @@ export default class ReactionsRowButton extends React.PureComponent { | |||
|             <span className="mx_ReactionsRowButton_count" aria-hidden="true"> | ||||
|                 {count} | ||||
|             </span> | ||||
|         </AccessibleTooltipButton>; | ||||
|             {tooltip} | ||||
|         </AccessibleButton>; | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,85 @@ | |||
| /* | ||||
| Copyright 2019 The Matrix.org Foundation C.I.C. | ||||
| 
 | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
| 
 | ||||
|     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import PropTypes from 'prop-types'; | ||||
| 
 | ||||
| import {MatrixClientPeg} from '../../../MatrixClientPeg'; | ||||
| import * as sdk from '../../../index'; | ||||
| import { unicodeToShortcode } from '../../../HtmlUtils'; | ||||
| import { _t } from '../../../languageHandler'; | ||||
| import { formatCommaSeparatedList } from '../../../utils/FormattingUtils'; | ||||
| 
 | ||||
| export default class ReactionsRowButtonTooltip extends React.PureComponent { | ||||
|     static propTypes = { | ||||
|         // The event we're displaying reactions for
 | ||||
|         mxEvent: PropTypes.object.isRequired, | ||||
|         // The reaction content / key / emoji
 | ||||
|         content: PropTypes.string.isRequired, | ||||
|         // A Set of Martix reaction events for this key
 | ||||
|         reactionEvents: PropTypes.object.isRequired, | ||||
|         visible: PropTypes.bool.isRequired, | ||||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         const Tooltip = sdk.getComponent('elements.Tooltip'); | ||||
|         const { content, reactionEvents, mxEvent, visible } = this.props; | ||||
| 
 | ||||
|         const room = MatrixClientPeg.get().getRoom(mxEvent.getRoomId()); | ||||
|         let tooltipLabel; | ||||
|         if (room) { | ||||
|             const senders = []; | ||||
|             for (const reactionEvent of reactionEvents) { | ||||
|                 const member = room.getMember(reactionEvent.getSender()); | ||||
|                 const name = member ? member.name : reactionEvent.getSender(); | ||||
|                 senders.push(name); | ||||
|             } | ||||
|             const shortName = unicodeToShortcode(content); | ||||
|             tooltipLabel = <div>{_t( | ||||
|                 "<reactors/><reactedWith>reacted with %(shortName)s</reactedWith>", | ||||
|                 { | ||||
|                     shortName, | ||||
|                 }, | ||||
|                 { | ||||
|                     reactors: () => { | ||||
|                         return <div className="mx_ReactionsRowButtonTooltip_senders"> | ||||
|                             {formatCommaSeparatedList(senders, 6)} | ||||
|                         </div>; | ||||
|                     }, | ||||
|                     reactedWith: (sub) => { | ||||
|                         if (!shortName) { | ||||
|                             return null; | ||||
|                         } | ||||
|                         return <div className="mx_ReactionsRowButtonTooltip_reactedWith"> | ||||
|                             {sub} | ||||
|                         </div>; | ||||
|                     }, | ||||
|                 }, | ||||
|             )}</div>; | ||||
|         } | ||||
| 
 | ||||
|         let tooltip; | ||||
|         if (tooltipLabel) { | ||||
|             tooltip = <Tooltip | ||||
|                 tooltipClassName="mx_Tooltip_timeline" | ||||
|                 visible={visible} | ||||
|                 label={tooltipLabel} | ||||
|             />; | ||||
|         } | ||||
| 
 | ||||
|         return tooltip; | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	 Michael Telatynski
						Michael Telatynski