From 1f4ca15442a3593e888384903d4910a72dae3492 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 17 Jan 2018 15:53:03 +0100 Subject: [PATCH] Show dialog for closed popups #30 --- src/interface/index.js | 43 +++++++++++++++++++++++++++++++++++++++--- src/interface/utils.js | 13 ++++++++----- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/interface/index.js b/src/interface/index.js index f29ef78..8c521ab 100644 --- a/src/interface/index.js +++ b/src/interface/index.js @@ -23,6 +23,7 @@ import createSceneData from 'doodle3d-core/d3/createSceneData.js'; import { generateExportMesh } from 'doodle3d-core/utils/exportUtils.js'; import { Matrix4 } from 'three/src/math/Matrix4.js'; import muiThemeable from 'material-ui/styles/muiThemeable'; +import Dialog from 'material-ui/Dialog'; const MAX_FULLSCREEN_WIDTH = 720; @@ -121,6 +122,10 @@ class Interface extends React.Component { popover: { element: null, open: false + }, + openUrlDialog: { + open: true, + url: '' } }; } @@ -222,8 +227,12 @@ class Interface extends React.Component { const updateProgres = progress => this.setState({ progress: { ...this.state.progress, ...progress } }); await slice(target, name, exportMesh, settings, updateProgres); } catch (error) { - this.setState({ error: error.message }); - throw error; + if (error.code === 3) { + this.setState({ openUrlDialog: { open: true, url: error.url } }); + } else { + this.setState({ error: error.message }); + throw error; + } } finally { this.setState({ isSlicing: false }); } @@ -288,7 +297,7 @@ class Interface extends React.Component { render() { const { classes, onCancel } = this.props; - const { isSlicing, isLoading, progress, showFullScreen, error, objectDimensions } = this.state; + const { isSlicing, isLoading, progress, showFullScreen, error, objectDimensions, openUrlDialog } = this.state; const disableUI = isSlicing || isLoading; const style = { ...(showFullScreen ? {} : { maxWidth: 'inherit', width: '100%', height: '100%' }) }; @@ -352,6 +361,32 @@ class Interface extends React.Component { ); + const closeDialog = () => this.setState({ openUrlDialog: { open: false, url: '' } }); + + const dialog = ( + , + { + window.open(openUrlDialog.url, '_blank'); + closeDialog(); + }} + /> + ]} + > +

Click 'Open' to continue to Doodle3D Connect

+
+ ) + if (showFullScreen) { return (
@@ -359,6 +394,7 @@ class Interface extends React.Component {

Doodle3D Slicer

{d3Panel} {settingsPanel} + {dialog}
); } else { @@ -379,6 +415,7 @@ class Interface extends React.Component { {d3Panel} + {dialog} ); } diff --git a/src/interface/utils.js b/src/interface/utils.js index 64aeb58..7f98ec4 100644 --- a/src/interface/utils.js +++ b/src/interface/utils.js @@ -118,7 +118,7 @@ const GCODE_SERVER_URL = 'https://gcodeserver.doodle3d.com'; const CONNECT_URL = 'http://connect.doodle3d.com/'; export async function slice(target, name, mesh, settings, updateProgress) { - if (!settings) throw new Error('please select a printer first'); + if (!settings) throw { message: 'please select a printer first', code: 0 }; let steps; let currentStep = 0; @@ -130,7 +130,7 @@ export async function slice(target, name, mesh, settings, updateProgress) { steps = 2; break; default: - throw new Error('unknown target'); + throw { message: 'unknown target', code: 1 }; break; } @@ -144,6 +144,8 @@ export async function slice(target, name, mesh, settings, updateProgress) { action: progress.action, percentage: currentStep / steps + progress.done / progress.total / steps }); + }).catch(error => { + throw { message: `error during slicing: ${error.message}`, code: 2 }; }); currentStep ++; @@ -182,13 +184,14 @@ export async function slice(target, name, mesh, settings, updateProgress) { }); currentStep ++; - const popup = window.open(`${CONNECT_URL}?uuid=${id}`, '_blank'); - if (!popup) throw new Error('popup was blocked by browser'); + const url = `${CONNECT_URL}?uuid=${id}`; + const popup = window.open(url, '_blank'); + if (!popup) throw { message: 'popup was blocked by browser', code: 3, url }; break; } default: - throw new Error('unknown target'); + throw { message: 'unknown target', code: 1 }; break; } }