226 lines
6.0 KiB
JavaScript
226 lines
6.0 KiB
JavaScript
import FileItem from "./FileItem";
|
|
import {startSetSelectedItem, setRightSelected, setLastSelected} from "../../actions/selectedItem"
|
|
import mobileCheck from "../../utils/mobileCheck"
|
|
import env from "../../enviroment/envFrontEnd";
|
|
import axios from "axios";
|
|
import {connect} from "react-redux";
|
|
import React from "react";
|
|
|
|
const currentURL = env.url;
|
|
|
|
class FileItemContainer extends React.Component {
|
|
|
|
constructor(props) {
|
|
super(props);
|
|
|
|
this.failedToLoad = false;
|
|
|
|
this.lastTouch = 0;
|
|
|
|
this.state = {
|
|
contextMenuPos: {},
|
|
imageSrc: "/images/file-svg.svg",
|
|
imageClassname: this.props.listView ? "file__image__listview" : "file__image"
|
|
}
|
|
}
|
|
|
|
getThumbnail = async() => {
|
|
|
|
const thumbnailID = this.props.metadata.thumbnailID;
|
|
const imageClassname = this.props.listView ? "file__image__listview--no-opacity" : "file__image--no-opacity"
|
|
|
|
const config = {
|
|
headers: {'Authorization': "Bearer " + window.localStorage.getItem("token")},
|
|
responseType: 'arraybuffer'
|
|
};
|
|
|
|
await this.setState(() => ({
|
|
...this.state,
|
|
imageSrc: "/images/file-svg.svg",
|
|
imageClassname: this.props.listView ? "file__image__listview" : "file__image"
|
|
}))
|
|
|
|
axios.get(currentURL +`/file-service/thumbnail/${thumbnailID}`, config).then((results) => {
|
|
|
|
const imgFile = new Blob([results.data]);
|
|
const imgUrl = URL.createObjectURL(imgFile);
|
|
|
|
this.setState(() => ({
|
|
...this.state,
|
|
imageSrc: imgUrl,
|
|
imageClassname: imageClassname
|
|
}))
|
|
|
|
|
|
}).catch((err) => {
|
|
console.log(err)
|
|
})
|
|
}
|
|
|
|
componentDidMount = () => {
|
|
|
|
const hasThumbnail = this.props.metadata.hasThumbnail;
|
|
|
|
if (hasThumbnail && !this.failedToLoad) {
|
|
this.getThumbnail();
|
|
}
|
|
}
|
|
|
|
shouldComponentUpdate = (nextProp, nextState) => {
|
|
|
|
return (nextProp.itemSelected !== this.props.itemSelected
|
|
|| nextProp.listView !== this.props.listView
|
|
|| nextProp.rightSelected !== this.props.rightSelected
|
|
|| nextState.imageSrc !== this.state.imageSrc
|
|
|| nextState.imageClassname !== this.state.imageClassname
|
|
|| this.props.filename !== nextProp.filename
|
|
|| this.props.metadata.transcoded !== nextProp.metadata.transcoded)
|
|
}
|
|
|
|
|
|
componentDidUpdate = (nextProp) => {
|
|
|
|
console.log("file item component updated")
|
|
|
|
const hasThumbnail = this.props.metadata.hasThumbnail;
|
|
|
|
if (hasThumbnail && !this.failedToLoad && nextProp.listView !== this.props.listView) {
|
|
|
|
this.getThumbnail();
|
|
|
|
} else if (nextProp.listView !== this.props.listView) {
|
|
|
|
this.setState(() => ({
|
|
...this.state,
|
|
imageClassname: this.props.listView ? "file__image__listview" : "file__image"
|
|
}))
|
|
}
|
|
}
|
|
|
|
onTouchStart = () => {
|
|
//alert("Touch start");
|
|
const date = new Date();
|
|
this.lastTouch = date.getTime();
|
|
}
|
|
|
|
onTouchMove = () => {
|
|
|
|
this.lastTouch = 0;
|
|
}
|
|
|
|
onTouchEnd = () => {
|
|
|
|
if (this.lastTouch === 0) {
|
|
|
|
//alert("last touch 0");
|
|
return;
|
|
}
|
|
|
|
const date = new Date();
|
|
const difference = date - this.lastTouch;
|
|
//alert("Touch end: " + difference)
|
|
//alert("touch end: " + difference);
|
|
this.lastTouch = 0;
|
|
|
|
if (difference > 500) {
|
|
//alert("Context menu");
|
|
this.getContextMenu();
|
|
}
|
|
|
|
}
|
|
|
|
getContextMenu = (e) => {
|
|
|
|
if (e) e.preventDefault();
|
|
|
|
const isMobile = mobileCheck();
|
|
|
|
const windowX = window.innerWidth;
|
|
const windowY = window.innerHeight;
|
|
|
|
let styleObj = {right:0, left:0, top: "-38px", bottom: 0}
|
|
|
|
if (isMobile) {
|
|
|
|
styleObj = {bottom: 0, left: "2px", top: "unset", right: "unset"}
|
|
|
|
} else {
|
|
|
|
const clientY = e.nativeEvent.clientY;
|
|
const clientX = e.nativeEvent.clientX;
|
|
|
|
if (clientY < (windowY / 3)) {
|
|
|
|
styleObj = {bottom:"-190px", top:"unset"}
|
|
}
|
|
|
|
if (clientY > ((windowY / 4) * 3.5)) {
|
|
|
|
styleObj = {bottom:"unset", top: "-190px"}
|
|
}
|
|
|
|
if (clientX > windowX / 2) {
|
|
|
|
styleObj = {...styleObj, left:"unset", right:0}
|
|
|
|
} else {
|
|
|
|
styleObj = {...styleObj, left:0, right:"unset"}
|
|
}
|
|
}
|
|
|
|
// if (isMobile) {
|
|
|
|
// styleObj = {bottom: 0, left: "2px", top: "unset", right: "unset"}
|
|
// }
|
|
|
|
this.setState(() => ({...this.state, contextMenuPos: styleObj}))
|
|
|
|
this.props.dispatch(startSetSelectedItem(this.props._id, true, false))
|
|
this.props.dispatch(setLastSelected(0));
|
|
this.props.dispatch(setRightSelected(this.props._id))
|
|
|
|
}
|
|
|
|
getWrapperClassname = () => {
|
|
|
|
let classname = "";
|
|
|
|
if (this.props.listView) {
|
|
|
|
classname += "file__item__listview"
|
|
|
|
} else {
|
|
|
|
classname += "file__item"
|
|
}
|
|
|
|
if (this.props._id === this.props.selected) {
|
|
|
|
classname += " file__item--selected"
|
|
}
|
|
|
|
return classname;
|
|
}
|
|
|
|
render() {
|
|
|
|
return <FileItem
|
|
getWrapperClassname={this.getWrapperClassname}
|
|
getContextMenu={this.getContextMenu}
|
|
onTouchStart={this.onTouchStart}
|
|
onTouchEnd={this.onTouchEnd}
|
|
onTouchMove={this.onTouchMove}
|
|
state={this.state}
|
|
{...this.props}/>
|
|
}
|
|
}
|
|
|
|
const connectStateToProp = (state) => ({
|
|
listView: state.filter.listView,
|
|
rightSelected: state.selectedItem.rightSelected,
|
|
resetSelected: state.selectedItem.resetSelected,
|
|
selected: state.selectedItem.selected
|
|
})
|
|
|
|
export default connect(connectStateToProp)(FileItemContainer) |