mirror of https://github.com/vector-im/riot-web
				
				
				
			Merge pull request #6873 from matrix-org/gsouquet/threads-action-bar-19127
						commit
						ca3b8e596a
					
				|  | @ -0,0 +1 @@ | |||
| <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 16 16"><path fill="#737D8C" fill-rule="evenodd" d="M1 2.75A.75.75 0 0 1 1.75 2h.005a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 2.75Zm2.495 0a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 0 1.5h-.01a.75.75 0 0 1-.75-.75Zm2.5 0a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 0 1.5h-.01a.75.75 0 0 1-.75-.75Zm2.5 0a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 0 1.5h-.01a.75.75 0 0 1-.75-.75Zm2.5 0a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 0 1.5h-.01a.75.75 0 0 1-.75-.75Zm2.5 0a.75.75 0 0 1 .75-.75h.005a.75.75 0 0 1 0 1.5h-.005a.75.75 0 0 1-.75-.75ZM1 6.75A.75.75 0 0 1 1.75 6h8.5a.75.75 0 0 1 0 1.5h-8.5A.75.75 0 0 1 1 6.75ZM1 9.75A.75.75 0 0 1 1.75 9h4.5a.75.75 0 0 1 0 1.5h-4.5A.75.75 0 0 1 1 9.75ZM1 13.75a.75.75 0 0 1 .75-.75h.005a.75.75 0 0 1 0 1.5H1.75a.75.75 0 0 1-.75-.75Zm2.495 0a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 0 1.5h-.01a.75.75 0 0 1-.75-.75Zm2.5 0a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 0 1.5h-.01a.75.75 0 0 1-.75-.75Zm2.5 0a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 0 1.5h-.01a.75.75 0 0 1-.75-.75Zm2.5 0a.75.75 0 0 1 .75-.75h.01a.75.75 0 0 1 0 1.5h-.01a.75.75 0 0 1-.75-.75Zm2.5 0a.75.75 0 0 1 .75-.75h.005a.75.75 0 0 1 0 1.5h-.005a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"/></svg> | ||||
| After Width: | Height: | Size: 1.2 KiB | 
|  | @ -139,7 +139,7 @@ export default class ThreadView extends React.Component<IProps, IState> { | |||
|                         sendReadReceiptOnLoad={false} // No RR support in thread's MVP
 | ||||
|                         timelineSet={this.state?.thread?.timelineSet} | ||||
|                         showUrlPreview={true} | ||||
|                         tileShape={TileShape.Notif} | ||||
|                         tileShape={TileShape.Thread} | ||||
|                         empty={<div>empty</div>} | ||||
|                         alwaysShowTimestamps={true} | ||||
|                         layout={Layout.Group} | ||||
|  |  | |||
|  | @ -128,6 +128,11 @@ const ReactButton: React.FC<IReactButtonProps> = ({ mxEvent, reactions, onFocusC | |||
|     </React.Fragment>; | ||||
| }; | ||||
| 
 | ||||
| export enum ActionBarRenderingContext { | ||||
|     Room, | ||||
|     Thread | ||||
| } | ||||
| 
 | ||||
| interface IMessageActionBarProps { | ||||
|     mxEvent: MatrixEvent; | ||||
|     reactions?: Relations; | ||||
|  | @ -135,15 +140,20 @@ interface IMessageActionBarProps { | |||
|     getTile: () => any | null; | ||||
|     getReplyThread: () => ReplyThread | undefined; | ||||
|     permalinkCreator?: RoomPermalinkCreator; | ||||
|     onFocusChange: (menuDisplayed: boolean) => void; | ||||
|     isQuoteExpanded?: boolean; | ||||
|     onFocusChange?: (menuDisplayed: boolean) => void; | ||||
|     toggleThreadExpanded: () => void; | ||||
|     renderingContext?: ActionBarRenderingContext; | ||||
|     isQuoteExpanded?: boolean; | ||||
| } | ||||
| 
 | ||||
| @replaceableComponent("views.messages.MessageActionBar") | ||||
| export default class MessageActionBar extends React.PureComponent<IMessageActionBarProps> { | ||||
|     public static contextType = RoomContext; | ||||
| 
 | ||||
|     public static defaultProps = { | ||||
|         renderingContext: ActionBarRenderingContext.Room, | ||||
|     }; | ||||
| 
 | ||||
|     public componentDidMount(): void { | ||||
|         if (this.props.mxEvent.status && this.props.mxEvent.status !== EventStatus.SENT) { | ||||
|             this.props.mxEvent.on("Event.status", this.onSent); | ||||
|  | @ -288,7 +298,7 @@ export default class MessageActionBar extends React.PureComponent<IMessageAction | |||
|                 // Like the resend button, the react and reply buttons need to appear before the edit.
 | ||||
|                 // The only catch is we do the reply button first so that we can make sure the react
 | ||||
|                 // button is the very first button without having to do length checks for `splice()`.
 | ||||
|                 if (this.context.canReply) { | ||||
|                 if (this.context.canReply && this.props.renderingContext === ActionBarRenderingContext.Room) { | ||||
|                     toolbarOpts.splice(0, 0, <> | ||||
|                         <RovingAccessibleTooltipButton | ||||
|                             className="mx_MessageActionBar_maskButton mx_MessageActionBar_replyButton" | ||||
|  |  | |||
|  | @ -53,7 +53,7 @@ import SenderProfile from '../messages/SenderProfile'; | |||
| import MessageTimestamp from '../messages/MessageTimestamp'; | ||||
| import TooltipButton from '../elements/TooltipButton'; | ||||
| import ReadReceiptMarker from "./ReadReceiptMarker"; | ||||
| import MessageActionBar from "../messages/MessageActionBar"; | ||||
| import MessageActionBar, { ActionBarRenderingContext } from "../messages/MessageActionBar"; | ||||
| import ReactionsRow from '../messages/ReactionsRow'; | ||||
| import { getEventDisplayInfo } from '../../../utils/EventUtils'; | ||||
| import { RightPanelPhases } from "../../../stores/RightPanelStorePhases"; | ||||
|  | @ -192,6 +192,7 @@ export enum TileShape { | |||
|     Notif = "notif", | ||||
|     FileGrid = "file_grid", | ||||
|     Pinned = "pinned", | ||||
|     Thread = "thread", | ||||
| } | ||||
| 
 | ||||
| interface IProps { | ||||
|  | @ -1055,6 +1056,9 @@ export default class EventTile extends React.Component<IProps, IState> { | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         const renderingContext = this.props.tileShape === TileShape.Thread | ||||
|             ? ActionBarRenderingContext.Thread | ||||
|             : ActionBarRenderingContext.Room; | ||||
|         const actionBar = !isEditing ? <MessageActionBar | ||||
|             mxEvent={this.props.mxEvent} | ||||
|             reactions={this.state.reactions} | ||||
|  | @ -1062,6 +1066,7 @@ export default class EventTile extends React.Component<IProps, IState> { | |||
|             getTile={this.getTile} | ||||
|             getReplyThread={this.getReplyThread} | ||||
|             onFocusChange={this.onActionBarFocusChange} | ||||
|             renderingContext={renderingContext} | ||||
|             isQuoteExpanded={isQuoteExpanded} | ||||
|             toggleThreadExpanded={() => this.setQuoteExpanded(!isQuoteExpanded)} | ||||
|         /> : undefined; | ||||
|  | @ -1170,6 +1175,40 @@ export default class EventTile extends React.Component<IProps, IState> { | |||
|                     </div>, | ||||
|                 ]); | ||||
|             } | ||||
|             case TileShape.Thread: { | ||||
|                 const room = this.context.getRoom(this.props.mxEvent.getRoomId()); | ||||
|                 return React.createElement(this.props.as || "li", { | ||||
|                     "className": classes, | ||||
|                     "aria-live": ariaLive, | ||||
|                     "aria-atomic": true, | ||||
|                     "data-scroll-tokens": scrollToken, | ||||
|                 }, [ | ||||
|                     <div className="mx_EventTile_roomName" key="mx_EventTile_roomName"> | ||||
|                         <RoomAvatar room={room} width={28} height={28} /> | ||||
|                         <a href={permalink} onClick={this.onPermalinkClicked}> | ||||
|                             { room ? room.name : '' } | ||||
|                         </a> | ||||
|                     </div>, | ||||
|                     <div className="mx_EventTile_senderDetails" key="mx_EventTile_senderDetails"> | ||||
|                         { avatar } | ||||
|                         <a href={permalink} onClick={this.onPermalinkClicked}> | ||||
|                             { sender } | ||||
|                             { timestamp } | ||||
|                         </a> | ||||
|                     </div>, | ||||
|                     <div className="mx_EventTile_line" key="mx_EventTile_line"> | ||||
|                         <EventTileType ref={this.tile} | ||||
|                             mxEvent={this.props.mxEvent} | ||||
|                             highlights={this.props.highlights} | ||||
|                             highlightLink={this.props.highlightLink} | ||||
|                             showUrlPreview={this.props.showUrlPreview} | ||||
|                             onHeightChanged={this.props.onHeightChanged} | ||||
|                             tileShape={this.props.tileShape} | ||||
|                         /> | ||||
|                         { actionBar } | ||||
|                     </div>, | ||||
|                 ]); | ||||
|             } | ||||
|             case TileShape.FileGrid: { | ||||
|                 return React.createElement(this.props.as || "li", { | ||||
|                     "className": classes, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Germain
						Germain