Showing state being passed into useIdeState dispatch middleware
#224
@@ -6,10 +6,16 @@ export const IdeContext = createContext()
|
||||
|
||||
const IdeToolbarNew = () => {
|
||||
const [state, dispatch] = useIdeState()
|
||||
function setIdeType(ide) { dispatch({ type: 'setIdeType', payload: { message: ide } }) }
|
||||
|
||||
return (
|
||||
<IdeContext.Provider value={{ state, dispatch }}>
|
||||
<div className="p-8 border-2">
|
||||
<div>hi I'm the toolbar</div>
|
||||
<nav class="flex">
|
||||
<button onClick={() => setIdeType('openCascade')} class="p-2 br-2 border-2 m-2 bg-blue-200">Switch to OpenCascade</button>
|
||||
<button onClick={() => setIdeType('openScad')} class="p-2 br-2 border-2 m-2 bg-indigo-200">Switch to OpenSCAD</button>
|
||||
</nav>
|
||||
<IdeContainer />
|
||||
</div>
|
||||
</IdeContext.Provider>
|
||||
|
||||
@@ -9,7 +9,8 @@ const IdeViewer = () => {
|
||||
<div>
|
||||
I should be showing an{' '}
|
||||
<span className="font-mono uppercase">{state.objectData?.type}</span>{' '}
|
||||
right now
|
||||
right now with the data{' '}
|
||||
<span className="font-mono uppercase">{state.objectData?.data}</span>{' '}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
||||
7
web/src/helpers/cadPackages/index.js
Normal file
7
web/src/helpers/cadPackages/index.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import openScad from './openScadController'
|
||||
import openCascade from './newCascadeController'
|
||||
|
||||
export const cadPackages = {
|
||||
openScad,
|
||||
openCascade,
|
||||
}
|
||||
35
web/src/helpers/cadPackages/newCascadeController.js
Normal file
35
web/src/helpers/cadPackages/newCascadeController.js
Normal file
@@ -0,0 +1,35 @@
|
||||
// Rename this file to remove "new" once Cascade integration is complete
|
||||
|
||||
export const render = async ({ code, settings }) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
const shouldReject = Math.random() < 0.7
|
||||
if (shouldReject) {
|
||||
resolve({
|
||||
objectData: {
|
||||
type: 'stl',
|
||||
data: ((Math.random() * 256 + 1) >>> 0).toString(2), // Randomized 8-bit numbers for funzies
|
||||
},
|
||||
message: {
|
||||
type: 'message',
|
||||
message: `bodies rendered by: ${code}`,
|
||||
},
|
||||
})
|
||||
} else {
|
||||
reject({
|
||||
message: {
|
||||
type: 'error',
|
||||
message: 'unable to parse line: x',
|
||||
},
|
||||
})
|
||||
}
|
||||
}, 700)
|
||||
})
|
||||
}
|
||||
|
||||
const openCascade = {
|
||||
render,
|
||||
// More functions to come
|
||||
}
|
||||
|
||||
export default openCascade
|
||||
@@ -1,12 +1,12 @@
|
||||
export const renderOpenScad = async ({ code, settings }) => {
|
||||
export const render = async ({ code, settings }) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
const shouldReject = Math.random() < 0.7
|
||||
if (shouldReject) {
|
||||
resolve({
|
||||
objectData: {
|
||||
type: Math.random() > 0.6 ? 'stl' : 'jpg',
|
||||
data: 'some binary',
|
||||
type: 'jpg',
|
||||
data: ((Math.random() * 256 + 1) >>> 0).toString(2), // Randomized 8-bit numbers for funzies
|
||||
},
|
||||
message: {
|
||||
type: 'message',
|
||||
@@ -24,3 +24,11 @@ export const renderOpenScad = async ({ code, settings }) => {
|
||||
}, 700)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
const openScad = {
|
||||
render,
|
||||
// more functions to come
|
||||
}
|
||||
|
||||
export default openScad
|
||||
@@ -1,9 +1,9 @@
|
||||
import { useReducer } from 'react'
|
||||
import { renderOpenScad } from 'src/helpers/openScadController'
|
||||
import { cadPackages } from 'src/helpers/cadPackages'
|
||||
|
||||
export const useIdeState = () => {
|
||||
const initialState = {
|
||||
ideType: 'openscad',
|
||||
ideType: 'openScad',
|
||||
consoleMessages: [
|
||||
{ type: 'error', message: 'line 15 is being very naughty' },
|
||||
{ type: 'message', message: '5 bodies produced' },
|
||||
@@ -36,14 +36,19 @@ export const useIdeState = () => {
|
||||
? [...state.consoleMessages, payload.message]
|
||||
: payload.message,
|
||||
}
|
||||
case 'setIdeType':
|
||||
return {
|
||||
...state,
|
||||
ideType: payload.message,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function dispatchMiddleware(dispatch) {
|
||||
function dispatchMiddleware(dispatch, state) {
|
||||
return ({ type, payload }) => {
|
||||
switch (type) {
|
||||
case 'render':
|
||||
renderOpenScad({ code: payload.code })
|
||||
cadPackages[state.ideType].render({ code: payload.code })
|
||||
.then(({ objectData, message }) =>
|
||||
dispatch({
|
||||
type: 'healthyRender',
|
||||
@@ -65,5 +70,5 @@ export const useIdeState = () => {
|
||||
}
|
||||
|
||||
const [state, dispatch] = useReducer(reducer, initialState)
|
||||
return [state, dispatchMiddleware(dispatch)]
|
||||
return [state, dispatchMiddleware(dispatch, state)]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user