react-planner
Version:
react-planner is a React Component for plans design. Draw a 2D floorplan and navigate it in 3D mode.
134 lines (106 loc) • 3.79 kB
JSX
import React from 'react';
import PropTypes from 'prop-types';
import { MdCamera } from 'react-icons/md'
import {ReactPlannerComponents, ReactPlannerConstants} from 'react-planner';
const {
MODE_IDLE,
MODE_2D_ZOOM_IN,
MODE_2D_ZOOM_OUT,
MODE_2D_PAN,
MODE_WAITING_DRAWING_LINE,
MODE_DRAGGING_LINE,
MODE_DRAGGING_VERTEX,
MODE_DRAGGING_ITEM,
MODE_DRAWING_LINE,
MODE_DRAWING_HOLE,
MODE_DRAWING_ITEM,
MODE_DRAGGING_HOLE,
MODE_ROTATING_ITEM,
MODE_3D_FIRST_PERSON,
MODE_3D_VIEW
} = ReactPlannerConstants;
const { ToolbarButton } = ReactPlannerComponents.ToolbarComponents;
export default function ToolbarScreenshotButton({mode}, {translator}) {
let imageBrowserDownload = imageUri => {
let fileOutputLink = document.createElement('a');
let filename = 'output' + Date.now() + '.png';
filename = window.prompt('Insert output filename', filename);
if (!filename) return;
fileOutputLink.setAttribute('download', filename);
fileOutputLink.href = imageUri;
fileOutputLink.style.display = 'none';
document.body.appendChild(fileOutputLink);
fileOutputLink.click();
document.body.removeChild(fileOutputLink);
};
let saveScreenshotToFile = event => {
event.preventDefault();
let canvas = document.getElementsByTagName('canvas')[0];
imageBrowserDownload(canvas.toDataURL());
};
let saveSVGScreenshotToFile = event => {
event.preventDefault();
// First of all I need the svg content of the viewer
let svgElements = document.getElementsByTagName('svg');
// I get the element with max width (which is the viewer)
let maxWidthSVGElement = svgElements[0];
for (let i = 1; i < svgElements.length; i++) {
if (svgElements[i].width.baseVal.value > maxWidthSVGElement.width.baseVal.value) {
maxWidthSVGElement = svgElements[i];
}
}
let serializer = new XMLSerializer();
let img = new Image;
// I create the new canvas to draw
let canvas = document.createElement('canvas');
let ctx = canvas.getContext('2d');
// Set width and height for the new canvas
let heightAtt = document.createAttribute('height');
heightAtt.value = maxWidthSVGElement.height.baseVal.value;
canvas.setAttributeNode(heightAtt);
let widthAtt = document.createAttribute('width');
widthAtt.value = maxWidthSVGElement.width.baseVal.value;
canvas.setAttributeNode(widthAtt);
ctx.fillStyle = 'white';
ctx.fillRect(0, 0, canvas.width, canvas.height);
img.crossOrigin = 'anonymous';
img.src = `data:image/svg+xml;base64,${window.btoa(serializer.serializeToString(maxWidthSVGElement))}`;
img.onload = () => {
ctx.drawImage(img, 0, 0, maxWidthSVGElement.width.baseVal.value, maxWidthSVGElement.height.baseVal.value);
imageBrowserDownload(canvas.toDataURL());
};
};
if ([MODE_3D_FIRST_PERSON, MODE_3D_VIEW].includes(mode)) {
return (
<ToolbarButton active={false} tooltip={translator.t('Get Screenshot')} onClick={saveScreenshotToFile}>
<MdCamera/>
</ToolbarButton>
);
}
if ([MODE_IDLE,
MODE_2D_ZOOM_IN,
MODE_2D_ZOOM_OUT,
MODE_2D_PAN,
MODE_WAITING_DRAWING_LINE,
MODE_DRAGGING_LINE,
MODE_DRAGGING_VERTEX,
MODE_DRAGGING_ITEM,
MODE_DRAWING_LINE,
MODE_DRAWING_HOLE,
MODE_DRAWING_ITEM,
MODE_DRAGGING_HOLE,
MODE_ROTATING_ITEM].includes(mode)) {
return (
<ToolbarButton active={false} tooltip={translator.t('Get Screenshot')} onClick={saveSVGScreenshotToFile}>
<MdCamera/>
</ToolbarButton>
);
}
return null;
}
ToolbarScreenshotButton.propTypes = {
mode: PropTypes.string.isRequired,
};
ToolbarScreenshotButton.contextTypes = {
translator: PropTypes.object.isRequired,
};