Skip to content

Commit

Permalink
Inhibit interactions on forward dialog message previews (#11025)
Browse files Browse the repository at this point in the history
* Inhibit interactions on forward dialog message previews

and improve inhibiting of video message body

* Consolidate prop types

* Iterate

* Update src/components/views/messages/IBodyProps.ts

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>

---------

Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
  • Loading branch information
t3chguy and richvdh committed Jun 6, 2023
1 parent 7d36c83 commit 6fa005d
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 19 deletions.
8 changes: 7 additions & 1 deletion src/components/views/dialogs/ForwardDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,13 @@ const ForwardDialog: React.FC<IProps> = ({ matrixClient: cli, event, permalinkCr
mx_IRCLayout: previewLayout == Layout.IRC,
})}
>
<EventTile mxEvent={mockEvent} layout={previewLayout} permalinkCreator={permalinkCreator} as="div" />
<EventTile
mxEvent={mockEvent}
layout={previewLayout}
permalinkCreator={permalinkCreator}
as="div"
inhibitInteraction
/>
</div>
<hr />
<div className="mx_ForwardList" id="mx_ForwardList">
Expand Down
4 changes: 4 additions & 0 deletions src/components/views/messages/IBodyProps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,8 @@ export interface IBodyProps {
getRelationsForEvent?: GetRelationsForEvent;

ref?: React.RefObject<any> | LegacyRef<any>;

// Set to `true` to disable interactions (e.g. video controls) and to remove controls from the tab order.
// This may be useful when displaying a preview of the event.
inhibitInteraction?: boolean;
}
4 changes: 2 additions & 2 deletions src/components/views/messages/MVideoBody.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ export default class MVideoBody extends React.PureComponent<IBodyProps, IState>

public render(): React.ReactNode {
const content = this.props.mxEvent.getContent();
const autoplay = SettingsStore.getValue("autoplayVideo");
const autoplay = !this.props.inhibitInteraction && SettingsStore.getValue("autoplayVideo");

let aspectRatio;
if (content.info?.w && content.info?.h) {
Expand Down Expand Up @@ -287,7 +287,7 @@ export default class MVideoBody extends React.PureComponent<IBodyProps, IState>
ref={this.videoRef}
src={contentUrl}
title={content.body}
controls
controls={!this.props.inhibitInteraction}
// Disable downloading as it doesn't work with e2ee video,
// users should use the dedicated Download button in the Message Action Bar
controlsList="nodownload"
Expand Down
1 change: 1 addition & 0 deletions src/components/views/messages/MessageEvent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ export default class MessageEvent extends React.Component<IProps> implements IMe
mediaEventHelper={this.mediaHelper}
getRelationsForEvent={this.props.getRelationsForEvent}
isSeeingThroughMessageHiddenForModeration={this.props.isSeeingThroughMessageHiddenForModeration}
inhibitInteraction={this.props.inhibitInteraction}
/>
) : null;
}
Expand Down
37 changes: 21 additions & 16 deletions src/events/EventTileFactory.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,8 @@ import { MatrixClient } from "matrix-js-sdk/src/client";
import { GroupCallIntent } from "matrix-js-sdk/src/webrtc/groupCall";

import SettingsStore from "../settings/SettingsStore";
import EditorStateTransfer from "../utils/EditorStateTransfer";
import { RoomPermalinkCreator } from "../utils/permalinks/Permalinks";
import LegacyCallEventGrouper from "../components/structures/LegacyCallEventGrouper";
import { GetRelationsForEvent } from "../components/views/rooms/EventTile";
import { EventTileProps } from "../components/views/rooms/EventTile";
import { TimelineRenderingType } from "../contexts/RoomContext";
import MessageEvent from "../components/views/messages/MessageEvent";
import MKeyVerificationConclusion from "../components/views/messages/MKeyVerificationConclusion";
Expand Down Expand Up @@ -56,20 +54,24 @@ import {
} from "../voice-broadcast";

// Subset of EventTile's IProps plus some mixins
export interface EventTileTypeProps {
export interface EventTileTypeProps
extends Pick<
EventTileProps,
| "mxEvent"
| "highlights"
| "highlightLink"
| "showUrlPreview"
| "onHeightChanged"
| "forExport"
| "getRelationsForEvent"
| "editState"
| "replacingEventId"
| "permalinkCreator"
| "callEventGrouper"
| "isSeeingThroughMessageHiddenForModeration"
| "inhibitInteraction"
> {
ref?: React.RefObject<any>; // `any` because it's effectively impossible to convince TS of a reasonable type
mxEvent: MatrixEvent;
highlights?: string[];
highlightLink?: string;
showUrlPreview?: boolean;
onHeightChanged?: () => void;
forExport?: boolean;
getRelationsForEvent?: GetRelationsForEvent;
editState?: EditorStateTransfer;
replacingEventId?: string;
permalinkCreator?: RoomPermalinkCreator;
callEventGrouper?: LegacyCallEventGrouper;
isSeeingThroughMessageHiddenForModeration?: boolean;
timestamp?: JSX.Element;
maxImageHeight?: number; // pixels
overrideBodyTypes?: Record<string, typeof React.Component>;
Expand Down Expand Up @@ -322,6 +324,7 @@ export function renderTile(
getRelationsForEvent,
isSeeingThroughMessageHiddenForModeration,
timestamp,
inhibitInteraction,
} = props;

switch (renderType) {
Expand All @@ -340,6 +343,7 @@ export function renderTile(
getRelationsForEvent,
isSeeingThroughMessageHiddenForModeration,
permalinkCreator,
inhibitInteraction,
});
default:
// NEARLY ALL THE OPTIONS!
Expand All @@ -357,6 +361,7 @@ export function renderTile(
getRelationsForEvent,
isSeeingThroughMessageHiddenForModeration,
timestamp,
inhibitInteraction,
});
}
}
Expand Down

0 comments on commit 6fa005d

Please sign in to comment.