UNPKG

auspice

Version:

Web app for visualizing pathogen evolution

102 lines (87 loc) 3.26 kB
import React from "react"; import Mousetrap from "mousetrap"; import { connect } from "react-redux"; import { withTranslation } from 'react-i18next'; import { SET_MODAL } from "../../actions/types"; import { infoPanelStyles } from "../../globalStyles"; import { stopProp } from "../tree/infoPanels/click"; import DownloadModalContents from "../download/downloadModal"; import { LinkOutModalContents } from "./LinkOutModalContents.jsx"; import DatasetSelector, {datasetSelectorStyles} from "../datasetSelector/datasetSelector.tsx"; @connect((state) => ({ browserDimensions: state.browserDimensions.browserDimensions, modal: state.controls.modal, })) class Modal extends React.Component { constructor(props) { super(props); this.dismissModal = this.dismissModal.bind(this); } /** * Key-press 'd' opens the download modal (at the time of implementation this was the only modal) * and if _any_ modal's open pressing 'd' dismisses it */ componentDidMount() { Mousetrap.bind('d', () => { this.props.dispatch({ type: SET_MODAL, modal: this.props.modal ? null : 'download' }); }); } componentWillUnmount() { Mousetrap.unbind('d'); } dismissModal() { this.props.dispatch({ type: SET_MODAL, modal: null }); } styles(callbacks={}) { const apply = { container: (x) => x, // default panel: (x) => x, // default dismissMsg: (x) => x, // default ...callbacks }; const container = apply.container({...infoPanelStyles.modalContainer}, this.props.broswerDimensions) const dismissMsg = apply.dismissMsg({...infoPanelStyles.topRightMessage}, this.props.broswerDimensions) // The default panel styles are a little complicated as historically we took styles from globalStyles // and then changed some of them! We preserve this behaviour here for the time being. const defaultPanel = {...infoPanelStyles.panel}; defaultPanel.width = this.props.browserDimensions.width * 0.66; defaultPanel.maxWidth = defaultPanel.width; defaultPanel.maxHeight = this.props.browserDimensions.height * 0.66; defaultPanel.fontSize = 14; defaultPanel.lineHeight = 1.4; const panel = apply.panel({...defaultPanel}, this.props.browserDimensions) return {container, panel, dismissMsg} } render() { const { t } = this.props; let Contents = null; let styles; switch (this.props.modal) { case 'download': Contents = DownloadModalContents; styles = this.styles(); // No custom styles for this modal break; case 'linkOut': Contents = LinkOutModalContents; styles = this.styles(); // No custom styles for this modal break; case 'datasetSelector': Contents = DatasetSelector; styles = this.styles(datasetSelectorStyles) break; default: return null; } return ( <div style={styles.container} onClick={this.dismissModal}> <div style={styles.panel} onClick={(e) => stopProp(e)}> <p style={styles.dismissMsg}> ({t("click outside this box to return to the app")}) </p> <Contents/> </div> </div> ); } } export default withTranslation()(Modal);