diff --git a/res/css/views/messages/_MImageBody.scss b/res/css/views/messages/_MImageBody.scss
index 86bc022829..e5c29ba9e0 100644
--- a/res/css/views/messages/_MImageBody.scss
+++ b/res/css/views/messages/_MImageBody.scss
@@ -19,6 +19,21 @@ limitations under the License.
margin-right: 34px;
}
+.mx_MImageBody_hidden {
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ right: 0;
+ text-align: center;
+ border: 1px dashed $input-border-color;
+
+ // To center the text in the middle of the frame
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
.mx_MImageBody_thumbnail {
position: absolute;
width: 100%;
diff --git a/res/css/views/messages/_MStickerBody.scss b/res/css/views/messages/_MStickerBody.scss
index e4977bcc34..162ee7da86 100644
--- a/res/css/views/messages/_MStickerBody.scss
+++ b/res/css/views/messages/_MStickerBody.scss
@@ -22,3 +22,14 @@ limitations under the License.
position: absolute;
top: 50%;
}
+
+.mx_MStickerBody_hidden {
+ max-width: 220px;
+ text-decoration: none;
+ text-align: center;
+
+ // To center the text in the middle of the frame
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js
index de19d0026f..4f165ea7bd 100644
--- a/src/components/views/messages/MImageBody.js
+++ b/src/components/views/messages/MImageBody.js
@@ -64,6 +64,7 @@ export default class MImageBody extends React.Component {
imgLoaded: false,
loadedImageDimensions: null,
hover: false,
+ showImage: SettingsStore.getValue("showImages"),
};
}
@@ -86,9 +87,19 @@ export default class MImageBody extends React.Component {
}
}
+ showImage() {
+ localStorage.setItem("mx_ShowImage_" + this.props.mxEvent.getId(), "true");
+ this.setState({showImage: true});
+ }
+
onClick(ev) {
if (ev.button === 0 && !ev.metaKey) {
ev.preventDefault();
+ if (!this.state.showImage) {
+ this.showImage();
+ return;
+ }
+
const content = this.props.mxEvent.getContent();
const httpUrl = this._getContentUrl();
const ImageView = sdk.getComponent("elements.ImageView");
@@ -120,7 +131,7 @@ export default class MImageBody extends React.Component {
onImageEnter(e) {
this.setState({ hover: true });
- if (!this._isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) {
+ if (!this.state.showImage || !this._isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) {
return;
}
const imgElement = e.target;
@@ -130,7 +141,7 @@ export default class MImageBody extends React.Component {
onImageLeave(e) {
this.setState({ hover: false });
- if (!this._isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) {
+ if (!this.state.showImage || !this._isGif() || SettingsStore.getValue("autoplayGifsAndVideos")) {
return;
}
const imgElement = e.target;
@@ -280,6 +291,12 @@ export default class MImageBody extends React.Component {
});
}).done();
}
+
+ // Remember that the user wanted to show this particular image
+ if (!this.state.showImage && localStorage.getItem("mx_ShowImage_" + this.props.mxEvent.getId()) === "true") {
+ this.setState({showImage: true});
+ }
+
this._afterComponentDidMount();
}
@@ -321,13 +338,21 @@ export default class MImageBody extends React.Component {
// By doing this, the image "pops" into the timeline, but is still restricted
// by the same width and height logic below.
if (!this.state.loadedImageDimensions) {
- return this.wrapImage(contentUrl,
+ let imageElement = (
,
+ alt={content.body}
+ onError={this.onImageError}
+ onLoad={this.onImageLoad}
+ />
);
+ if (!this.state.showImage) {
+ imageElement = (
+