2020-04-19 20:06:17 +00:00
|
|
|
import React from "react";
|
|
|
|
import PropTypes from "prop-types";
|
2020-04-22 17:44:09 +00:00
|
|
|
import styled from "styled-components";
|
2021-02-24 17:11:23 +00:00
|
|
|
import Text from "@appserver/components/text";
|
2021-02-25 15:41:06 +00:00
|
|
|
import MediaDeleteIcon from "../../../../public/images/media.delete.react.svg";
|
|
|
|
import MediaDownloadIcon from "../../../../public/images/media.download.react.svg";
|
2020-10-16 12:38:04 +00:00
|
|
|
import ImageViewer from "./sub-components/image-viewer";
|
|
|
|
import VideoViewer from "./sub-components/video-viewer";
|
|
|
|
import MediaScrollButton from "./sub-components/scroll-button";
|
|
|
|
import ControlBtn from "./sub-components/control-btn";
|
|
|
|
import StyledMediaViewer from "./StyledMediaViewer";
|
2020-12-08 11:09:46 +00:00
|
|
|
import equal from "fast-deep-equal/react";
|
2020-10-16 12:38:04 +00:00
|
|
|
import Hammer from "hammerjs";
|
2021-08-04 14:50:50 +00:00
|
|
|
import IconButton from "@appserver/components/icon-button";
|
2021-02-24 17:11:23 +00:00
|
|
|
import commonIconsStyles from "@appserver/components/utils/common-icons-style";
|
2020-04-19 20:06:17 +00:00
|
|
|
|
2020-04-22 17:44:09 +00:00
|
|
|
const StyledVideoViewer = styled(VideoViewer)`
|
2021-05-06 09:52:19 +00:00
|
|
|
z-index: 301;
|
2020-10-16 12:38:04 +00:00
|
|
|
`;
|
2020-05-20 10:40:41 +00:00
|
|
|
const mediaTypes = Object.freeze({
|
2020-10-16 12:38:04 +00:00
|
|
|
audio: 1,
|
|
|
|
video: 2,
|
2020-05-20 10:40:41 +00:00
|
|
|
});
|
2020-08-12 13:11:30 +00:00
|
|
|
|
|
|
|
const ButtonKeys = Object.freeze({
|
2020-10-16 12:38:04 +00:00
|
|
|
leftArrow: 37,
|
|
|
|
rightArrow: 39,
|
|
|
|
upArrow: 38,
|
|
|
|
downArrow: 40,
|
|
|
|
esc: 27,
|
|
|
|
ctr: 17,
|
|
|
|
one: 49,
|
2021-08-04 09:43:31 +00:00
|
|
|
del: 46,
|
2021-08-10 13:12:51 +00:00
|
|
|
s: 83,
|
2020-08-12 13:11:30 +00:00
|
|
|
});
|
|
|
|
|
2021-02-20 14:54:12 +00:00
|
|
|
const StyledMediaDeleteIcon = styled(MediaDeleteIcon)`
|
|
|
|
${commonIconsStyles}
|
|
|
|
`;
|
|
|
|
|
|
|
|
const StyledMediaDownloadIcon = styled(MediaDownloadIcon)`
|
|
|
|
${commonIconsStyles}
|
|
|
|
`;
|
|
|
|
|
2020-08-12 13:11:30 +00:00
|
|
|
let ctrIsPressed = false;
|
2020-04-19 20:06:17 +00:00
|
|
|
class MediaViewer extends React.Component {
|
2020-10-16 12:38:04 +00:00
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
|
2021-03-22 16:21:36 +00:00
|
|
|
const item = props.playlist.find(
|
|
|
|
(file) => file.fileId === props.currentFileId
|
|
|
|
);
|
|
|
|
|
|
|
|
const playlistPos = item ? item.id : 0;
|
|
|
|
|
2020-10-16 12:38:04 +00:00
|
|
|
this.state = {
|
|
|
|
visible: props.visible,
|
|
|
|
allowConvert: true,
|
|
|
|
playlist: props.playlist,
|
2021-03-22 16:21:36 +00:00
|
|
|
playlistPos,
|
2020-04-23 21:44:47 +00:00
|
|
|
};
|
2020-04-24 18:53:30 +00:00
|
|
|
|
2020-10-16 12:38:04 +00:00
|
|
|
this.detailsContainer = React.createRef();
|
|
|
|
this.viewerToolbox = React.createRef();
|
|
|
|
}
|
|
|
|
|
|
|
|
updateHammer() {
|
|
|
|
let currentPlaylistPos = this.state.playlistPos;
|
|
|
|
|
|
|
|
let currentFile = this.state.playlist[currentPlaylistPos];
|
|
|
|
let fileTitle = currentFile.title;
|
|
|
|
let url = currentFile.src;
|
|
|
|
var ext = this.getFileExtension(fileTitle)
|
|
|
|
? this.getFileExtension(fileTitle)
|
|
|
|
: this.getFileExtension(url);
|
|
|
|
var _this = this;
|
|
|
|
|
|
|
|
if (this.hammer) {
|
|
|
|
this.hammer.off("swipeleft", this.nextMedia);
|
|
|
|
this.hammer.off("swiperight", this.prevMedia);
|
|
|
|
this.hammer.off("pinchout", this.prevMedia);
|
|
|
|
this.hammer.off("pinchin", this.prevMedia);
|
|
|
|
this.hammer.off("pinchend", this.prevMedia);
|
|
|
|
this.hammer.off("doubletap", this.prevMedia);
|
2020-07-02 08:02:50 +00:00
|
|
|
}
|
2020-10-16 12:38:04 +00:00
|
|
|
this.hammer = null;
|
|
|
|
setTimeout(function () {
|
|
|
|
try {
|
|
|
|
if (_this.canImageView(ext)) {
|
|
|
|
const pinch = new Hammer.Pinch();
|
|
|
|
_this.hammer = Hammer(
|
|
|
|
document.getElementsByClassName("react-viewer-canvas")[0]
|
|
|
|
);
|
|
|
|
_this.hammer.add([pinch]);
|
|
|
|
_this.hammer.on("pinchout", _this.handleZoomOut);
|
|
|
|
_this.hammer.on("pinchin", _this.handleZoomIn);
|
|
|
|
_this.hammer.on("pinchend", _this.handleZoomEnd);
|
|
|
|
_this.hammer.on("doubletap", _this.doubleTap);
|
|
|
|
} else if (
|
|
|
|
_this.mapSupplied[ext] &&
|
|
|
|
(_this.mapSupplied[ext].type == mediaTypes.video ||
|
|
|
|
_this.mapSupplied[ext].type == mediaTypes.audio)
|
|
|
|
) {
|
|
|
|
_this.hammer = Hammer(
|
|
|
|
document.getElementsByClassName("videoViewerOverlay")[0]
|
|
|
|
);
|
2020-07-02 08:02:50 +00:00
|
|
|
}
|
2020-10-16 12:38:04 +00:00
|
|
|
if (_this.hammer) {
|
|
|
|
_this.hammer.on("swipeleft", _this.nextMedia);
|
|
|
|
_this.hammer.on("swiperight", _this.prevMedia);
|
2020-07-02 08:02:50 +00:00
|
|
|
}
|
2020-10-16 12:38:04 +00:00
|
|
|
} catch (ex) {
|
|
|
|
console.error("MediaViewer updateHammer", ex);
|
|
|
|
}
|
|
|
|
}, 500);
|
|
|
|
}
|
|
|
|
|
|
|
|
componentDidUpdate(prevProps) {
|
|
|
|
this.updateHammer();
|
|
|
|
if (this.props.visible !== prevProps.visible) {
|
|
|
|
this.setState({
|
|
|
|
visible: this.props.visible,
|
|
|
|
playlistPos:
|
|
|
|
this.props.playlist.length > 0
|
|
|
|
? this.props.playlist.find(
|
|
|
|
(file) => file.fileId === this.props.currentFileId
|
|
|
|
).id
|
|
|
|
: 0,
|
|
|
|
});
|
2020-07-02 08:02:50 +00:00
|
|
|
}
|
2020-10-16 12:38:04 +00:00
|
|
|
if (
|
|
|
|
this.props.visible &&
|
|
|
|
this.props.visible === prevProps.visible &&
|
2020-12-08 11:09:46 +00:00
|
|
|
!equal(this.props.playlist, prevProps.playlist)
|
2020-10-16 12:38:04 +00:00
|
|
|
) {
|
|
|
|
let playlistPos = 0;
|
|
|
|
if (this.props.playlist.length > 0) {
|
|
|
|
if (this.props.playlist.length - 1 < this.state.playlistPos) {
|
|
|
|
playlistPos = this.props.playlist.length - 1;
|
|
|
|
}
|
2020-04-23 21:44:47 +00:00
|
|
|
this.setState({
|
2020-10-16 12:38:04 +00:00
|
|
|
playlist: this.props.playlist,
|
|
|
|
playlistPos: playlistPos,
|
2020-04-23 21:44:47 +00:00
|
|
|
});
|
2020-10-16 12:38:04 +00:00
|
|
|
} else {
|
|
|
|
this.props.onEmptyPlaylistError();
|
2020-04-23 21:44:47 +00:00
|
|
|
this.setState({
|
2020-10-16 12:38:04 +00:00
|
|
|
visible: false,
|
2020-04-23 21:44:47 +00:00
|
|
|
});
|
2020-10-16 12:38:04 +00:00
|
|
|
}
|
2020-12-08 11:09:46 +00:00
|
|
|
} else if (!equal(this.props.playlist, prevProps.playlist)) {
|
2020-10-16 12:38:04 +00:00
|
|
|
this.setState({
|
|
|
|
playlist: this.props.playlist,
|
|
|
|
});
|
2020-05-05 13:15:33 +00:00
|
|
|
}
|
2020-10-16 12:38:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
componentDidMount() {
|
|
|
|
var _this = this;
|
|
|
|
setTimeout(function () {
|
|
|
|
if (document.getElementsByClassName("react-viewer-canvas").length > 0) {
|
|
|
|
_this.hammer = Hammer(
|
|
|
|
document.getElementsByClassName("react-viewer-canvas")[0]
|
|
|
|
);
|
|
|
|
var pinch = new Hammer.Pinch();
|
|
|
|
_this.hammer.add([pinch]);
|
|
|
|
_this.hammer.on("pinchout", _this.handleZoomOut);
|
|
|
|
_this.hammer.on("pinchin", _this.handleZoomIn);
|
|
|
|
_this.hammer.on("pinchend", _this.handleZoomEnd);
|
|
|
|
_this.hammer.on("doubletap", _this.doubleTap);
|
|
|
|
} else {
|
|
|
|
_this.hammer = Hammer(
|
|
|
|
document.getElementsByClassName("videoViewerOverlay")[0]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (_this.hammer) {
|
|
|
|
_this.hammer.on("swipeleft", _this.nextMedia);
|
|
|
|
_this.hammer.on("swiperight", _this.prevMedia);
|
|
|
|
}
|
|
|
|
}, 500);
|
|
|
|
document.addEventListener("keydown", this.onKeydown, false);
|
|
|
|
document.addEventListener("keyup", this.onKeyup, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
componentWillUnmount() {
|
2021-05-06 09:52:19 +00:00
|
|
|
if (this.hammer) {
|
|
|
|
this.hammer.off("swipeleft", this.nextMedia);
|
|
|
|
this.hammer.off("swiperight", this.prevMedia);
|
|
|
|
this.hammer.off("pinchout", this.prevMedia);
|
|
|
|
this.hammer.off("pinchin", this.prevMedia);
|
|
|
|
this.hammer.off("pinchend", this.prevMedia);
|
|
|
|
this.hammer.off("doubletap", this.prevMedia);
|
|
|
|
}
|
2020-10-16 12:38:04 +00:00
|
|
|
document.removeEventListener("keydown", this.onKeydown, false);
|
|
|
|
document.removeEventListener("keyup", this.onKeyup, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
mapSupplied = {
|
|
|
|
".aac": { supply: "m4a", type: mediaTypes.audio },
|
|
|
|
".flac": { supply: "mp3", type: mediaTypes.audio },
|
|
|
|
".m4a": { supply: "m4a", type: mediaTypes.audio },
|
|
|
|
".mp3": { supply: "mp3", type: mediaTypes.audio },
|
|
|
|
".oga": { supply: "oga", type: mediaTypes.audio },
|
|
|
|
".ogg": { supply: "oga", type: mediaTypes.audio },
|
|
|
|
".wav": { supply: "wav", type: mediaTypes.audio },
|
|
|
|
|
|
|
|
".f4v": { supply: "m4v", type: mediaTypes.video },
|
|
|
|
".m4v": { supply: "m4v", type: mediaTypes.video },
|
|
|
|
".mov": { supply: "m4v", type: mediaTypes.video },
|
|
|
|
".mp4": { supply: "m4v", type: mediaTypes.video },
|
|
|
|
".ogv": { supply: "ogv", type: mediaTypes.video },
|
|
|
|
".webm": { supply: "webmv", type: mediaTypes.video },
|
|
|
|
".wmv": { supply: "m4v", type: mediaTypes.video, convertable: true },
|
|
|
|
".avi": { supply: "m4v", type: mediaTypes.video, convertable: true },
|
|
|
|
".mpeg": { supply: "m4v", type: mediaTypes.video, convertable: true },
|
|
|
|
".mpg": { supply: "m4v", type: mediaTypes.video, convertable: true },
|
|
|
|
};
|
|
|
|
|
|
|
|
canImageView = function (ext) {
|
|
|
|
return this.props.extsImagePreviewed.indexOf(ext) != -1;
|
|
|
|
};
|
|
|
|
canPlay = (fileTitle, allowConvert) => {
|
|
|
|
var ext =
|
|
|
|
fileTitle[0] === "." ? fileTitle : this.getFileExtension(fileTitle);
|
|
|
|
|
|
|
|
var supply = this.mapSupplied[ext];
|
|
|
|
|
|
|
|
var canConv = allowConvert || this.props.allowConvert;
|
|
|
|
|
|
|
|
return (
|
|
|
|
!!supply &&
|
|
|
|
this.props.extsMediaPreviewed.indexOf(ext) != -1 &&
|
|
|
|
(!supply.convertable || canConv)
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
getFileExtension = (fileTitle) => {
|
|
|
|
if (!fileTitle) {
|
|
|
|
return "";
|
2020-05-20 10:40:41 +00:00
|
|
|
}
|
2020-10-16 12:38:04 +00:00
|
|
|
fileTitle = fileTitle.trim();
|
|
|
|
var posExt = fileTitle.lastIndexOf(".");
|
|
|
|
return 0 <= posExt ? fileTitle.substring(posExt).trim().toLowerCase() : "";
|
|
|
|
};
|
|
|
|
|
|
|
|
zoom = 1;
|
|
|
|
handleZoomEnd = () => {
|
|
|
|
this.zoom = 1;
|
|
|
|
};
|
|
|
|
handleZoomIn = (e) => {
|
|
|
|
if (this.zoom - e.scale > 0.1) {
|
|
|
|
this.zoom = e.scale;
|
|
|
|
document.querySelector('li[data-key="zoomOut"]').click();
|
2020-05-20 10:40:41 +00:00
|
|
|
}
|
2020-10-16 12:38:04 +00:00
|
|
|
};
|
|
|
|
handleZoomOut = (e) => {
|
|
|
|
if (e.scale - this.zoom > 0.3) {
|
|
|
|
this.zoom = e.scale;
|
|
|
|
document.querySelector('li[data-key="zoomIn"]').click();
|
2020-08-12 13:11:30 +00:00
|
|
|
}
|
2020-10-16 12:38:04 +00:00
|
|
|
};
|
|
|
|
doubleTap = () => {
|
|
|
|
document.querySelector('li[data-key="zoomIn"]').click();
|
|
|
|
};
|
|
|
|
prevMedia = () => {
|
|
|
|
let currentPlaylistPos = this.state.playlistPos;
|
|
|
|
currentPlaylistPos--;
|
|
|
|
if (currentPlaylistPos < 0)
|
|
|
|
currentPlaylistPos = this.state.playlist.length - 1;
|
|
|
|
|
|
|
|
this.setState({
|
|
|
|
playlistPos: currentPlaylistPos,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
nextMedia = () => {
|
|
|
|
let currentPlaylistPos = this.state.playlistPos;
|
|
|
|
currentPlaylistPos = (currentPlaylistPos + 1) % this.state.playlist.length;
|
|
|
|
|
|
|
|
this.setState({
|
|
|
|
playlistPos: currentPlaylistPos,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
getOffset = () => {
|
|
|
|
if (this.detailsContainer.current && this.viewerToolbox.current) {
|
|
|
|
return (
|
|
|
|
this.detailsContainer.current.offsetHeight +
|
|
|
|
this.viewerToolbox.current.offsetHeight
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
return 0;
|
2020-08-12 13:11:30 +00:00
|
|
|
}
|
2020-10-16 12:38:04 +00:00
|
|
|
};
|
|
|
|
onDelete = () => {
|
|
|
|
let currentFileId =
|
|
|
|
this.state.playlist.length > 0
|
|
|
|
? this.state.playlist.find((file) => file.id === this.state.playlistPos)
|
|
|
|
.fileId
|
|
|
|
: 0;
|
|
|
|
this.props.onDelete && this.props.onDelete(currentFileId);
|
|
|
|
};
|
|
|
|
onDownload = () => {
|
|
|
|
let currentFileId =
|
|
|
|
this.state.playlist.length > 0
|
|
|
|
? this.state.playlist.find((file) => file.id === this.state.playlistPos)
|
|
|
|
.fileId
|
|
|
|
: 0;
|
|
|
|
this.props.onDownload && this.props.onDownload(currentFileId);
|
|
|
|
};
|
2021-08-10 13:49:17 +00:00
|
|
|
|
2020-10-16 12:38:04 +00:00
|
|
|
onKeyup = (e) => {
|
|
|
|
if (ButtonKeys.ctr === e.keyCode) {
|
|
|
|
ctrIsPressed = false;
|
|
|
|
}
|
|
|
|
};
|
2021-08-10 13:49:17 +00:00
|
|
|
|
2020-10-16 12:38:04 +00:00
|
|
|
onKeydown = (e) => {
|
|
|
|
let isActionKey = false;
|
|
|
|
for (let key in ButtonKeys) {
|
|
|
|
if (ButtonKeys[key] === e.keyCode) {
|
|
|
|
e.preventDefault();
|
|
|
|
isActionKey = true;
|
|
|
|
}
|
2020-10-13 10:30:26 +00:00
|
|
|
}
|
|
|
|
|
2020-10-16 12:38:04 +00:00
|
|
|
if (isActionKey) {
|
|
|
|
switch (e.keyCode) {
|
|
|
|
case ButtonKeys.leftArrow:
|
|
|
|
ctrIsPressed
|
|
|
|
? document.getElementsByClassName("iconContainer rotateLeft")
|
|
|
|
.length > 0 &&
|
|
|
|
document
|
|
|
|
.getElementsByClassName("iconContainer rotateLeft")[0]
|
|
|
|
.click()
|
|
|
|
: this.prevMedia();
|
|
|
|
break;
|
|
|
|
case ButtonKeys.rightArrow:
|
|
|
|
ctrIsPressed
|
|
|
|
? document.getElementsByClassName("iconContainer rotateRight")
|
|
|
|
.length > 0 &&
|
|
|
|
document
|
|
|
|
.getElementsByClassName("iconContainer rotateRight")[0]
|
|
|
|
.click()
|
|
|
|
: this.nextMedia();
|
|
|
|
break;
|
|
|
|
case ButtonKeys.esc:
|
2021-08-10 13:49:17 +00:00
|
|
|
if (!this.props.deleteDialogVisible) this.props.onClose();
|
2020-10-16 12:38:04 +00:00
|
|
|
break;
|
|
|
|
case ButtonKeys.upArrow:
|
|
|
|
document.getElementsByClassName("iconContainer zoomIn").length > 0 &&
|
|
|
|
document.getElementsByClassName("iconContainer zoomIn")[0].click();
|
|
|
|
break;
|
|
|
|
case ButtonKeys.downArrow:
|
|
|
|
document.getElementsByClassName("iconContainer zoomOut").length > 0 &&
|
|
|
|
document.getElementsByClassName("iconContainer zoomOut")[0].click();
|
|
|
|
break;
|
|
|
|
case ButtonKeys.ctr:
|
|
|
|
ctrIsPressed = true;
|
|
|
|
break;
|
2021-08-10 13:12:51 +00:00
|
|
|
case ButtonKeys.s:
|
|
|
|
if (ctrIsPressed) this.onDownload();
|
|
|
|
break;
|
2020-10-16 12:38:04 +00:00
|
|
|
case ButtonKeys.one:
|
|
|
|
ctrIsPressed &&
|
|
|
|
document.getElementsByClassName("iconContainer reset").length > 0 &&
|
|
|
|
document.getElementsByClassName("iconContainer reset")[0].click();
|
|
|
|
break;
|
2021-08-04 09:43:31 +00:00
|
|
|
case ButtonKeys.del:
|
|
|
|
this.onDelete();
|
|
|
|
break;
|
|
|
|
|
2020-10-16 12:38:04 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
onClose = () => {
|
|
|
|
this.props.onClose();
|
|
|
|
this.setState({ visible: false });
|
|
|
|
};
|
|
|
|
|
|
|
|
render() {
|
|
|
|
let currentPlaylistPos = this.state.playlistPos;
|
|
|
|
let currentFileId =
|
|
|
|
this.state.playlist.length > 0
|
|
|
|
? this.state.playlist.find((file) => file.id === currentPlaylistPos)
|
|
|
|
.fileId
|
|
|
|
: 0;
|
|
|
|
|
|
|
|
let currentFile = this.state.playlist[currentPlaylistPos];
|
|
|
|
let fileTitle = currentFile.title;
|
|
|
|
let url = currentFile.src;
|
|
|
|
|
|
|
|
let isImage = false;
|
|
|
|
let isVideo = false;
|
|
|
|
let canOpen = true;
|
|
|
|
|
|
|
|
var ext = this.getFileExtension(fileTitle)
|
|
|
|
? this.getFileExtension(fileTitle)
|
|
|
|
: this.getFileExtension(url);
|
|
|
|
|
|
|
|
if (!this.canPlay(ext) && !this.canImageView(ext)) {
|
|
|
|
canOpen = false;
|
|
|
|
this.props.onError && this.props.onError();
|
|
|
|
}
|
2020-04-30 08:37:16 +00:00
|
|
|
|
2020-10-16 12:38:04 +00:00
|
|
|
if (this.canImageView(ext)) {
|
|
|
|
isImage = true;
|
|
|
|
} else {
|
|
|
|
isImage = false;
|
|
|
|
isVideo = this.mapSupplied[ext]
|
|
|
|
? this.mapSupplied[ext].type == mediaTypes.video
|
|
|
|
: false;
|
2020-04-29 14:11:01 +00:00
|
|
|
}
|
2020-10-16 12:38:04 +00:00
|
|
|
|
|
|
|
if (this.mapSupplied[ext])
|
|
|
|
if (!isImage && this.mapSupplied[ext].convertable && !url.includes("#")) {
|
|
|
|
url += (url.includes("?") ? "&" : "?") + "convpreview=true";
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<StyledMediaViewer visible={this.state.visible}>
|
|
|
|
<div className="videoViewerOverlay"></div>
|
|
|
|
{!isImage && (
|
|
|
|
<>
|
|
|
|
<MediaScrollButton
|
|
|
|
orientation="right"
|
|
|
|
onClick={this.prevMedia}
|
|
|
|
inactive={this.state.playlist.length <= 1}
|
|
|
|
/>
|
|
|
|
<MediaScrollButton
|
|
|
|
orientation="left"
|
|
|
|
onClick={this.nextMedia}
|
|
|
|
inactive={this.state.playlist.length <= 1}
|
|
|
|
/>
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
|
|
|
|
<div>
|
|
|
|
<div className="details" ref={this.detailsContainer}>
|
|
|
|
<Text isBold fontSize="14px" color="#fff" className="title">
|
|
|
|
{fileTitle}
|
|
|
|
</Text>
|
|
|
|
<ControlBtn
|
|
|
|
onClick={this.props.onClose && this.props.onClose}
|
|
|
|
className="mediaPlayerClose"
|
|
|
|
>
|
2021-08-04 14:50:50 +00:00
|
|
|
<IconButton
|
|
|
|
color="#fff"
|
|
|
|
iconName="/static/images/cross.react.svg"
|
|
|
|
size={25}
|
|
|
|
/>
|
2020-10-16 12:38:04 +00:00
|
|
|
</ControlBtn>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
{canOpen &&
|
|
|
|
(isImage ? (
|
|
|
|
<ImageViewer
|
2021-05-12 11:05:54 +00:00
|
|
|
userAccess={this.props.userAccess}
|
2020-10-16 12:38:04 +00:00
|
|
|
visible={this.state.visible}
|
|
|
|
onClose={this.onClose}
|
|
|
|
images={[{ src: url, alt: "" }]}
|
|
|
|
inactive={this.state.playlist.length <= 1}
|
|
|
|
onNextClick={this.nextMedia}
|
|
|
|
onPrevClick={this.prevMedia}
|
|
|
|
onDeleteClick={this.onDelete}
|
|
|
|
onDownloadClick={this.onDownload}
|
|
|
|
/>
|
|
|
|
) : (
|
|
|
|
<StyledVideoViewer
|
|
|
|
url={url}
|
|
|
|
isVideo={isVideo}
|
|
|
|
getOffset={this.getOffset}
|
|
|
|
/>
|
|
|
|
))}
|
|
|
|
<div className="mediaViewerToolbox" ref={this.viewerToolbox}>
|
|
|
|
{!isImage && (
|
|
|
|
<span>
|
|
|
|
{this.props.canDelete(currentFileId) && (
|
|
|
|
<ControlBtn onClick={this.onDelete}>
|
|
|
|
<div className="deleteBtnContainer">
|
2021-02-20 14:54:12 +00:00
|
|
|
<StyledMediaDeleteIcon size="scale" />
|
2020-10-16 12:38:04 +00:00
|
|
|
</div>
|
|
|
|
</ControlBtn>
|
|
|
|
)}
|
|
|
|
{this.props.canDownload(currentFileId) && (
|
|
|
|
<ControlBtn onClick={this.onDownload}>
|
|
|
|
<div className="downloadBtnContainer">
|
2021-02-20 14:54:12 +00:00
|
|
|
<StyledMediaDownloadIcon size="scale" />
|
2020-10-16 12:38:04 +00:00
|
|
|
</div>
|
|
|
|
</ControlBtn>
|
|
|
|
)}
|
|
|
|
</span>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
</StyledMediaViewer>
|
|
|
|
);
|
|
|
|
}
|
2020-04-19 20:06:17 +00:00
|
|
|
}
|
|
|
|
|
2020-04-29 14:11:01 +00:00
|
|
|
MediaViewer.propTypes = {
|
2020-10-16 12:38:04 +00:00
|
|
|
allowConvert: PropTypes.bool,
|
|
|
|
visible: PropTypes.bool,
|
2021-05-19 10:45:37 +00:00
|
|
|
currentFileId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
|
2020-10-16 12:38:04 +00:00
|
|
|
playlist: PropTypes.arrayOf(PropTypes.object),
|
|
|
|
extsImagePreviewed: PropTypes.arrayOf(PropTypes.string),
|
|
|
|
extsMediaPreviewed: PropTypes.arrayOf(PropTypes.string),
|
|
|
|
onError: PropTypes.func,
|
|
|
|
canDelete: PropTypes.func,
|
|
|
|
canDownload: PropTypes.func,
|
|
|
|
onDelete: PropTypes.func,
|
|
|
|
onDownload: PropTypes.func,
|
|
|
|
onClose: PropTypes.func,
|
|
|
|
onEmptyPlaylistError: PropTypes.func,
|
2021-08-10 13:49:17 +00:00
|
|
|
deleteDialogVisible: PropTypes.bool,
|
2020-10-16 12:38:04 +00:00
|
|
|
};
|
2020-04-19 20:06:17 +00:00
|
|
|
|
2020-04-29 14:11:01 +00:00
|
|
|
MediaViewer.defaultProps = {
|
2020-10-16 12:38:04 +00:00
|
|
|
currentFileId: 0,
|
|
|
|
visible: false,
|
|
|
|
allowConvert: true,
|
|
|
|
canDelete: () => {
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
canDownload: () => {
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
export default MediaViewer;
|