import PropTypes from "prop-types";
import { defineMessages, injectIntl } from "react-intl";
import classNames from "classnames";
import ImmutablePropTypes from "react-immutable-proptypes";
import ImmutablePureComponent from "react-immutable-pure-component";
import ReactSwipeableViews from "react-swipeable-views";
import { getAverageFromBlurhash } from "flavours/glitch/blurhash";
import { GIFV } from "flavours/glitch/components/gifv";
import { Icon } from "flavours/glitch/components/icon";
import { IconButton } from "flavours/glitch/components/icon_button";
import Footer from "flavours/glitch/features/picture_in_picture/components/footer";
import Video from "flavours/glitch/features/video";
import { disableSwiping } from "flavours/glitch/initial_state";
import ImageLoader from "./image_loader";
const messages = defineMessages({
close: { id: "lightbox.close", defaultMessage: "Close" },
previous: { id: "lightbox.previous", defaultMessage: "Previous" },
next: { id: "lightbox.next", defaultMessage: "Next" },
});
class MediaModal extends ImmutablePureComponent {
static contextTypes = {
router: PropTypes.object,
};
static propTypes = {
media: ImmutablePropTypes.list.isRequired,
statusId: PropTypes.string,
lang: PropTypes.string,
index: PropTypes.number.isRequired,
onClose: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired,
onChangeBackgroundColor: PropTypes.func.isRequired,
currentTime: PropTypes.number,
autoPlay: PropTypes.bool,
volume: PropTypes.number,
};
state = {
index: null,
navigationHidden: false,
zoomButtonHidden: false,
};
handleSwipe = (index) => {
this.setState({ index: index % this.props.media.size });
};
handleTransitionEnd = () => {
this.setState({
zoomButtonHidden: false,
});
};
handleNextClick = () => {
this.setState({
index: (this.getIndex() + 1) % this.props.media.size,
zoomButtonHidden: true,
});
};
handlePrevClick = () => {
this.setState({
index: (this.props.media.size + this.getIndex() - 1) % this.props.media.size,
zoomButtonHidden: true,
});
};
handleChangeIndex = (e) => {
const index = Number(e.currentTarget.getAttribute("data-index"));
this.setState({
index: index % this.props.media.size,
zoomButtonHidden: true,
});
};
handleKeyDown = (e) => {
switch(e.key) {
case "ArrowLeft":
this.handlePrevClick();
e.preventDefault();
e.stopPropagation();
break;
case "ArrowRight":
this.handleNextClick();
e.preventDefault();
e.stopPropagation();
break;
}
};
componentDidMount () {
window.addEventListener("keydown", this.handleKeyDown, false);
this._sendBackgroundColor();
}
componentWillUnmount () {
window.removeEventListener("keydown", this.handleKeyDown);
this.props.onChangeBackgroundColor(null);
}
getIndex () {
return this.state.index !== null ? this.state.index : this.props.index;
}
toggleNavigation = () => {
this.setState(prevState => ({
navigationHidden: !prevState.navigationHidden,
}));
};
componentDidUpdate (prevProps, prevState) {
if (prevState.index !== this.state.index) {
this._sendBackgroundColor();
}
}
_sendBackgroundColor () {
const { media, onChangeBackgroundColor } = this.props;
const index = this.getIndex();
const blurhash = media.getIn([index, "blurhash"]);
if (blurhash) {
const backgroundColor = getAverageFromBlurhash(blurhash);
onChangeBackgroundColor(backgroundColor);
}
}
render () {
const { media, statusId, lang, intl, onClose } = this.props;
const { navigationHidden } = this.state;
const index = this.getIndex();
const leftNav = media.size > 1 && ;
const rightNav = media.size > 1 && ;
const content = media.map((image) => {
const width = image.getIn(["meta", "original", "width"]) || null;
const height = image.getIn(["meta", "original", "height"]) || null;
const description = image.getIn(["translation", "description"]) || image.get("description");
if (image.get("type") === "image") {
return (