image (gifs) and video messages will autoplay if enabled.
This commit is contained in:
parent
b3b16d1858
commit
4509901592
2 changed files with 30 additions and 20 deletions
|
@ -25,6 +25,7 @@ import sdk from '../../../index';
|
||||||
import dis from '../../../dispatcher';
|
import dis from '../../../dispatcher';
|
||||||
import { decryptFile, readBlobAsDataUri } from '../../../utils/DecryptFile';
|
import { decryptFile, readBlobAsDataUri } from '../../../utils/DecryptFile';
|
||||||
import q from 'q';
|
import q from 'q';
|
||||||
|
import UserSettingsStore from '../../../UserSettingsStore';
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'MImageBody',
|
displayName: 'MImageBody',
|
||||||
|
@ -42,7 +43,7 @@ module.exports = React.createClass({
|
||||||
decryptedUrl: null,
|
decryptedUrl: null,
|
||||||
decryptedThumbnailUrl: null,
|
decryptedThumbnailUrl: null,
|
||||||
decryptedBlob: null,
|
decryptedBlob: null,
|
||||||
error: null
|
error: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -55,7 +56,7 @@ module.exports = React.createClass({
|
||||||
const ImageView = sdk.getComponent("elements.ImageView");
|
const ImageView = sdk.getComponent("elements.ImageView");
|
||||||
const params = {
|
const params = {
|
||||||
src: httpUrl,
|
src: httpUrl,
|
||||||
mxEvent: this.props.mxEvent
|
mxEvent: this.props.mxEvent,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (content.info) {
|
if (content.info) {
|
||||||
|
@ -70,22 +71,25 @@ module.exports = React.createClass({
|
||||||
|
|
||||||
_isGif: function() {
|
_isGif: function() {
|
||||||
const content = this.props.mxEvent.getContent();
|
const content = this.props.mxEvent.getContent();
|
||||||
return (content && content.info && content.info.mimetype === "image/gif");
|
return (
|
||||||
|
content &&
|
||||||
|
content.info &&
|
||||||
|
content.info.mimetype === "image/gif");
|
||||||
},
|
},
|
||||||
|
|
||||||
onImageEnter: function(e) {
|
onImageEnter: function(e) {
|
||||||
if (!this._isGif()) {
|
if (!this._isGif() || UserSettingsStore.getSyncedSetting("autoplayGifsAndVideos", false)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var imgElement = e.target;
|
const imgElement = e.target;
|
||||||
imgElement.src = this._getContentUrl();
|
imgElement.src = this._getContentUrl();
|
||||||
},
|
},
|
||||||
|
|
||||||
onImageLeave: function(e) {
|
onImageLeave: function(e) {
|
||||||
if (!this._isGif()) {
|
if (!this._isGif() || UserSettingsStore.getSyncedSetting("autoplayGifsAndVideos", false)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var imgElement = e.target;
|
const imgElement = e.target;
|
||||||
imgElement.src = this._getThumbUrl();
|
imgElement.src = this._getThumbUrl();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -100,7 +104,9 @@ module.exports = React.createClass({
|
||||||
|
|
||||||
_getThumbUrl: function() {
|
_getThumbUrl: function() {
|
||||||
const content = this.props.mxEvent.getContent();
|
const content = this.props.mxEvent.getContent();
|
||||||
|
console.log(content);
|
||||||
if (content.file !== undefined) {
|
if (content.file !== undefined) {
|
||||||
|
// Don't use the thumbnail for client's wishing to autoplay gifs.
|
||||||
if (this.state.decryptedThumbnailUrl) {
|
if (this.state.decryptedThumbnailUrl) {
|
||||||
return this.state.decryptedThumbnailUrl;
|
return this.state.decryptedThumbnailUrl;
|
||||||
}
|
}
|
||||||
|
@ -115,15 +121,15 @@ module.exports = React.createClass({
|
||||||
this.fixupHeight();
|
this.fixupHeight();
|
||||||
const content = this.props.mxEvent.getContent();
|
const content = this.props.mxEvent.getContent();
|
||||||
if (content.file !== undefined && this.state.decryptedUrl === null) {
|
if (content.file !== undefined && this.state.decryptedUrl === null) {
|
||||||
var thumbnailPromise = q(null);
|
let thumbnailPromise = q(null);
|
||||||
if (content.info.thumbnail_file) {
|
if (content.info.thumbnail_file) {
|
||||||
thumbnailPromise = decryptFile(
|
thumbnailPromise = decryptFile(
|
||||||
content.info.thumbnail_file
|
content.info.thumbnail_file,
|
||||||
).then(function(blob) {
|
).then(function(blob) {
|
||||||
return readBlobAsDataUri(blob);
|
return readBlobAsDataUri(blob);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
var decryptedBlob;
|
let decryptedBlob;
|
||||||
thumbnailPromise.then((thumbnailUrl) => {
|
thumbnailPromise.then((thumbnailUrl) => {
|
||||||
return decryptFile(content.file).then(function(blob) {
|
return decryptFile(content.file).then(function(blob) {
|
||||||
decryptedBlob = blob;
|
decryptedBlob = blob;
|
||||||
|
@ -168,7 +174,7 @@ module.exports = React.createClass({
|
||||||
// the alternative here would be 600*timelineWidth/800; to scale them down to fit inside a 4:3 bounding box
|
// the alternative here would be 600*timelineWidth/800; to scale them down to fit inside a 4:3 bounding box
|
||||||
|
|
||||||
//console.log("trying to fit image into timelineWidth of " + this.refs.body.offsetWidth + " or " + this.refs.body.clientWidth);
|
//console.log("trying to fit image into timelineWidth of " + this.refs.body.offsetWidth + " or " + this.refs.body.clientWidth);
|
||||||
var thumbHeight = null;
|
let thumbHeight = null;
|
||||||
if (content.info) {
|
if (content.info) {
|
||||||
thumbHeight = ImageUtils.thumbHeight(content.info.w, content.info.h, timelineWidth, maxHeight);
|
thumbHeight = ImageUtils.thumbHeight(content.info.w, content.info.h, timelineWidth, maxHeight);
|
||||||
}
|
}
|
||||||
|
@ -190,7 +196,6 @@ module.exports = React.createClass({
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.file !== undefined && this.state.decryptedUrl === null) {
|
if (content.file !== undefined && this.state.decryptedUrl === null) {
|
||||||
|
|
||||||
// Need to decrypt the attachment
|
// Need to decrypt the attachment
|
||||||
// The attachment is decrypted in componentDidMount.
|
// The attachment is decrypted in componentDidMount.
|
||||||
// For now add an img tag with a spinner.
|
// For now add an img tag with a spinner.
|
||||||
|
@ -210,7 +215,12 @@ module.exports = React.createClass({
|
||||||
}
|
}
|
||||||
|
|
||||||
const contentUrl = this._getContentUrl();
|
const contentUrl = this._getContentUrl();
|
||||||
const thumbUrl = this._getThumbUrl();
|
let thumbUrl;
|
||||||
|
if (this._isGif() && UserSettingsStore.getSyncedSetting("autoplayGifsAndVideos", false)) {
|
||||||
|
thumbUrl = contentUrl;
|
||||||
|
} else {
|
||||||
|
thumbUrl = this._getThumbUrl();
|
||||||
|
}
|
||||||
|
|
||||||
if (thumbUrl) {
|
if (thumbUrl) {
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -23,6 +23,7 @@ import Model from '../../../Modal';
|
||||||
import sdk from '../../../index';
|
import sdk from '../../../index';
|
||||||
import { decryptFile, readBlobAsDataUri } from '../../../utils/DecryptFile';
|
import { decryptFile, readBlobAsDataUri } from '../../../utils/DecryptFile';
|
||||||
import q from 'q';
|
import q from 'q';
|
||||||
|
import UserSettingsStore from '../../../UserSettingsStore';
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'MVideoBody',
|
displayName: 'MVideoBody',
|
||||||
|
@ -152,11 +153,11 @@ module.exports = React.createClass({
|
||||||
|
|
||||||
const contentUrl = this._getContentUrl();
|
const contentUrl = this._getContentUrl();
|
||||||
const thumbUrl = this._getThumbUrl();
|
const thumbUrl = this._getThumbUrl();
|
||||||
|
const autoplay = UserSettingsStore.getSyncedSetting("autoplayGifsAndVideos", false);
|
||||||
var height = null;
|
let height = null;
|
||||||
var width = null;
|
let width = null;
|
||||||
var poster = null;
|
let poster = null;
|
||||||
var preload = "metadata";
|
let preload = "metadata";
|
||||||
if (content.info) {
|
if (content.info) {
|
||||||
const scale = this.thumbScale(content.info.w, content.info.h, 480, 360);
|
const scale = this.thumbScale(content.info.w, content.info.h, 480, 360);
|
||||||
if (scale) {
|
if (scale) {
|
||||||
|
@ -169,11 +170,10 @@ module.exports = React.createClass({
|
||||||
preload = "none";
|
preload = "none";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<span className="mx_MVideoBody">
|
<span className="mx_MVideoBody">
|
||||||
<video className="mx_MVideoBody" src={contentUrl} alt={content.body}
|
<video className="mx_MVideoBody" src={contentUrl} alt={content.body}
|
||||||
controls preload={preload} autoPlay={false}
|
controls preload={preload} muted={autoplay} autoPlay={autoplay}
|
||||||
height={height} width={width} poster={poster}>
|
height={height} width={width} poster={poster}>
|
||||||
</video>
|
</video>
|
||||||
<MFileBody {...this.props} decryptedBlob={this.state.decryptedBlob} />
|
<MFileBody {...this.props} decryptedBlob={this.state.decryptedBlob} />
|
||||||
|
|
Loading…
Reference in a new issue