UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

145 lines (131 loc) 5.12 kB
// Copyright (c) 2021 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import React, {useEffect} from 'react'; import styled from 'styled-components'; import ImagePreview from 'components/common/image-preview'; import {EXPORT_IMG_RATIO_OPTIONS, EXPORT_IMG_RESOLUTION_OPTIONS} from 'constants/default-settings'; import {StyledModalContent, SelectionButton, CheckMark} from 'components/common/styled-components'; import Switch from 'components/common/switch'; import {injectIntl} from 'react-intl'; import {FormattedMessage} from 'localization'; const ImageOptionList = styled.div` display: flex; flex-direction: column; justify-content: space-around; width: 250px; .image-option-section { .image-option-section-title { font-weight: 500; font-size: 14px; } } .button-list { display: flex; flex-direction: row; padding: 8px 0px; } input { margin-right: 8px; } `; const ExportImageModalFactory = () => { /** @type {typeof import('./export-image-modal').ExportImageModal} */ const ExportImageModal = ({ mapW, mapH, exportImage, onUpdateImageSetting, cleanupExportImage, intl }) => { const {legend, ratio, resolution} = exportImage; useEffect(() => { onUpdateImageSetting({ exporting: true }); return cleanupExportImage; }, [onUpdateImageSetting, cleanupExportImage]); useEffect(() => { if (mapH !== exportImage.mapH || mapW !== exportImage.mapW) { onUpdateImageSetting({ mapH, mapW }); } }, [mapH, mapW, exportImage, onUpdateImageSetting]); return ( <StyledModalContent className="export-image-modal"> <ImageOptionList> <div className="image-option-section"> <div className="image-option-section-title"> <FormattedMessage id={'modal.exportImage.ratioTitle'} /> </div> <FormattedMessage id={'modal.exportImage.ratioDescription'} /> <div className="button-list" id="export-image-modal__option_ratio"> {EXPORT_IMG_RATIO_OPTIONS.filter(op => !op.hidden).map(op => ( <SelectionButton key={op.id} selected={ratio === op.id} onClick={() => onUpdateImageSetting({ratio: op.id})} > <FormattedMessage id={op.label} /> {ratio === op.id && <CheckMark />} </SelectionButton> ))} </div> </div> <div className="image-option-section"> <div className="image-option-section-title"> <FormattedMessage id={'modal.exportImage.resolutionTitle'} /> </div> <FormattedMessage id={'modal.exportImage.resolutionDescription'} /> <div className="button-list" id="export-image-modal__option_resolution"> {EXPORT_IMG_RESOLUTION_OPTIONS.map(op => ( <SelectionButton key={op.id} selected={resolution === op.id} onClick={() => op.available && onUpdateImageSetting({resolution: op.id})} > {op.label} {resolution === op.id && <CheckMark />} </SelectionButton> ))} </div> </div> <div className="image-option-section"> <div className="image-option-section-title"> <FormattedMessage id={'modal.exportImage.mapLegendTitle'} /> </div> <Switch type="checkbox" id="add-map-legend" checked={legend} label={intl.formatMessage({id: 'modal.exportImage.mapLegendAdd'})} onChange={() => onUpdateImageSetting({legend: !legend})} /> </div> </ImageOptionList> <ImagePreview exportImage={exportImage} /> </StyledModalContent> ); }; return injectIntl(ExportImageModal); }; export default ExportImageModalFactory;