Only show download link below media if it's not in the timeline

This commit is contained in:
Travis Ralston 2021-07-16 11:05:04 -06:00
parent 7ba0adba77
commit 623f2e7613
5 changed files with 33 additions and 45 deletions

View file

@ -97,7 +97,7 @@ export default class MAudioBody extends React.PureComponent<IBodyProps, IState>
return ( return (
<span className="mx_MAudioBody"> <span className="mx_MAudioBody">
<AudioPlayer playback={this.state.playback} mediaName={this.props.mxEvent.getContent().body} /> <AudioPlayer playback={this.state.playback} mediaName={this.props.mxEvent.getContent().body} />
{/*<MFileBody {...this.props} decryptedBlob={this.state.decryptedBlob} showGenericPlaceholder={false} />*/} { this.props.tileShape && <MFileBody {...this.props} showGenericPlaceholder={false} /> }
</span> </span>
); );
} }

View file

@ -15,18 +15,15 @@ limitations under the License.
*/ */
import React, { createRef } from 'react'; import React, { createRef } from 'react';
import PropTypes from 'prop-types';
import filesize from 'filesize'; import filesize from 'filesize';
import { _t } from '../../../languageHandler'; import { _t } from '../../../languageHandler';
import { decryptFile } from '../../../utils/DecryptFile';
import Modal from '../../../Modal'; import Modal from '../../../Modal';
import AccessibleButton from "../elements/AccessibleButton"; import AccessibleButton from "../elements/AccessibleButton";
import { replaceableComponent } from "../../../utils/replaceableComponent"; import { replaceableComponent } from "../../../utils/replaceableComponent";
import { mediaFromContent } from "../../../customisations/Media"; import { mediaFromContent } from "../../../customisations/Media";
import ErrorDialog from "../dialogs/ErrorDialog"; import ErrorDialog from "../dialogs/ErrorDialog";
import { TileShape } from "../rooms/EventTile"; import { TileShape } from "../rooms/EventTile";
import { IContent, MatrixEvent } from "matrix-js-sdk/src"; import { IContent } from "matrix-js-sdk/src";
import { MediaEventHelper } from "../../../utils/MediaEventHelper";
import { IMediaEventContent } from "../../../customisations/models/IMediaEventContent"; import { IMediaEventContent } from "../../../customisations/models/IMediaEventContent";
import { IBodyProps } from "./IBodyProps"; import { IBodyProps } from "./IBodyProps";
@ -181,6 +178,8 @@ export default class MFileBody extends React.Component<IProps, IState> {
); );
} }
const showDownloadLink = this.props.tileShape || !this.props.showGenericPlaceholder;
if (isEncrypted) { if (isEncrypted) {
if (!this.state.decryptedBlob) { if (!this.state.decryptedBlob) {
// Need to decrypt the attachment // Need to decrypt the attachment
@ -205,12 +204,12 @@ export default class MFileBody extends React.Component<IProps, IState> {
// but it is not guaranteed between various browsers' settings. // but it is not guaranteed between various browsers' settings.
return ( return (
<span className="mx_MFileBody"> <span className="mx_MFileBody">
{placeholder} { placeholder }
<div className="mx_MFileBody_download"> { showDownloadLink && <div className="mx_MFileBody_download">
<AccessibleButton onClick={decrypt}> <AccessibleButton onClick={decrypt}>
{ _t("Decrypt %(text)s", { text: text }) } { _t("Decrypt %(text)s", { text: text }) }
</AccessibleButton> </AccessibleButton>
</div> </div> }
</span> </span>
); );
} }
@ -237,8 +236,8 @@ export default class MFileBody extends React.Component<IProps, IState> {
// If the attachment is encrypted then put the link inside an iframe. // If the attachment is encrypted then put the link inside an iframe.
return ( return (
<span className="mx_MFileBody"> <span className="mx_MFileBody">
{placeholder} { placeholder }
<div className="mx_MFileBody_download"> { showDownloadLink && <div className="mx_MFileBody_download">
<div style={{ display: "none" }}> <div style={{ display: "none" }}>
{ /* { /*
* Add dummy copy of the "a" tag * Add dummy copy of the "a" tag
@ -252,7 +251,7 @@ export default class MFileBody extends React.Component<IProps, IState> {
onLoad={onIframeLoad} onLoad={onIframeLoad}
ref={this.iframe} ref={this.iframe}
sandbox="allow-scripts allow-downloads allow-downloads-without-user-activation" /> sandbox="allow-scripts allow-downloads allow-downloads-without-user-activation" />
</div> </div> }
</span> </span>
); );
} else if (contentUrl) { } else if (contentUrl) {
@ -300,40 +299,24 @@ export default class MFileBody extends React.Component<IProps, IState> {
downloadProps["download"] = fileName; downloadProps["download"] = fileName;
} }
// If the attachment is not encrypted then we check whether we return (
// are being displayed in the room timeline or in a list of <span className="mx_MFileBody">
// files in the right hand side of the screen. { placeholder }
if (this.props.tileShape === TileShape.FileGrid) { { showDownloadLink && <div className="mx_MFileBody_download">
return ( <a {...downloadProps}>
<span className="mx_MFileBody"> <span className="mx_MFileBody_download_icon" />
{placeholder} { _t("Download %(text)s", { text: text }) }
<div className="mx_MFileBody_download"> </a>
<a className="mx_MFileBody_downloadLink" {...downloadProps}> { this.props.tileShape === TileShape.FileGrid && <div className="mx_MImageBody_size">
{ fileName } { content.info && content.info.size ? filesize(content.info.size) : "" }
</a> </div>}
<div className="mx_MImageBody_size"> </div> }
{ content.info && content.info.size ? filesize(content.info.size) : "" } </span>
</div> );
</div>
</span>
);
} else {
return (
<span className="mx_MFileBody">
{placeholder}
<div className="mx_MFileBody_download">
<a {...downloadProps}>
<span className="mx_MFileBody_download_icon" />
{ _t("Download %(text)s", { text: text }) }
</a>
</div>
</span>
);
}
} else { } else {
const extra = text ? (': ' + text) : ''; const extra = text ? (': ' + text) : '';
return <span className="mx_MFileBody"> return <span className="mx_MFileBody">
{placeholder} { placeholder }
{ _t("Invalid file%(extra)s", { extra: extra }) } { _t("Invalid file%(extra)s", { extra: extra }) }
</span>; </span>;
} }

View file

@ -415,7 +415,10 @@ export default class MImageBody extends React.Component<IBodyProps, IState> {
// Overidden by MStickerBody // Overidden by MStickerBody
protected getFileBody(): JSX.Element { protected getFileBody(): JSX.Element {
return <MFileBody {...this.props} decryptedBlob={this.state.decryptedBlob} showGenericPlaceholder={false} />; // We only ever need the download bar if we're appearing outside of the timeline
if (this.props.tileShape) {
return <MFileBody {...this.props} showGenericPlaceholder={false} />;
}
} }
render() { render() {

View file

@ -25,6 +25,7 @@ import { mediaFromContent } from "../../../customisations/Media";
import { BLURHASH_FIELD } from "../../../ContentMessages"; import { BLURHASH_FIELD } from "../../../ContentMessages";
import { IMediaEventContent } from "../../../customisations/models/IMediaEventContent"; import { IMediaEventContent } from "../../../customisations/models/IMediaEventContent";
import { IBodyProps } from "./IBodyProps"; import { IBodyProps } from "./IBodyProps";
import MFileBody from "./MFileBody";
interface IState { interface IState {
decryptedUrl?: string; decryptedUrl?: string;
@ -268,7 +269,7 @@ export default class MVideoBody extends React.PureComponent<IBodyProps, IState>
onPlay={this.videoOnPlay} onPlay={this.videoOnPlay}
> >
</video> </video>
{/*<MFileBody {...this.props} decryptedBlob={this.state.decryptedBlob} showGenericPlaceholder={false} />*/} { this.props.tileShape && <MFileBody {...this.props} showGenericPlaceholder={false} /> }
</span> </span>
); );
} }

View file

@ -20,6 +20,7 @@ import InlineSpinner from '../elements/InlineSpinner';
import { _t } from "../../../languageHandler"; import { _t } from "../../../languageHandler";
import RecordingPlayback from "../audio_messages/RecordingPlayback"; import RecordingPlayback from "../audio_messages/RecordingPlayback";
import MAudioBody from "./MAudioBody"; import MAudioBody from "./MAudioBody";
import MFileBody from "./MFileBody";
@replaceableComponent("views.messages.MVoiceMessageBody") @replaceableComponent("views.messages.MVoiceMessageBody")
export default class MVoiceMessageBody extends MAudioBody { export default class MVoiceMessageBody extends MAudioBody {
@ -50,7 +51,7 @@ export default class MVoiceMessageBody extends MAudioBody {
return ( return (
<span className="mx_MVoiceMessageBody"> <span className="mx_MVoiceMessageBody">
<RecordingPlayback playback={this.state.playback} tileShape={this.props.tileShape} /> <RecordingPlayback playback={this.state.playback} tileShape={this.props.tileShape} />
{/*<MFileBody {...this.props} decryptedBlob={this.state.decryptedBlob} showGenericPlaceholder={false} />*/} { this.props.tileShape && <MFileBody {...this.props} showGenericPlaceholder={false} /> }
</span> </span>
); );
} }