1
0
Fork 0
freesewing/packages/freesewing.shared/components/wrappers/workbench.js

116 lines
3.3 KiB
JavaScript
Raw Normal View History

2022-02-12 15:23:37 +01:00
import { useEffect } from 'react'
import useLocalStorage from 'shared/hooks/useLocalStorage.js'
import Layout from 'shared/components/layouts/default'
2022-01-25 12:39:29 +01:00
import Menu from 'shared/components/workbench/menu/index.js'
import set from 'lodash.set'
import unset from 'lodash.unset'
2022-01-27 12:26:56 +01:00
import defaultSettings from 'shared/components/workbench/default-settings.js'
2022-01-30 15:14:44 +01:00
import DraftError from 'shared/components/workbench/draft/error.js'
import theme from 'pkgs/plugin-theme/src/index.js'
2022-01-27 12:26:56 +01:00
// Views
2022-02-12 15:23:37 +01:00
import Measurements from 'shared/components/workbench/measurements/index.js'
import LabDraft from 'shared/components/workbench/draft/index.js'
2022-02-13 15:45:27 +01:00
import LabSample from 'shared/components/workbench/sample.js'
import GistAsJson from 'shared/components/workbench/json.js'
import GistAsYaml from 'shared/components/workbench/yaml.js'
import DraftEvents from 'shared/components/workbench/events.js'
const views = {
measurements: Measurements,
draft: LabDraft,
2022-02-13 15:45:27 +01:00
test: LabSample,
export: () => <p>TODO</p>,
events: DraftEvents,
yaml: GistAsYaml,
json: GistAsJson,
welcome: () => <p>TODO</p>,
}
// Generates a default pattern gist to start from
const defaultGist = (pattern, locale='en') => {
2022-01-27 12:26:56 +01:00
const gist = {
design: pattern.config.name,
version: pattern.config.version,
...defaultSettings
}
if (locale) gist.locale = locale
2022-01-27 12:26:56 +01:00
return gist
}
const hasRequiredMeasurements = (pattern, gist) => {
for (const m of pattern.config.measurements) {
2022-01-25 10:29:47 +01:00
if (!gist?.measurements?.[m]) return false
}
2022-01-25 10:29:47 +01:00
return true
}
/*
* This component wraps the workbench and is in charge of
* keeping the gist state, which will trickly down
* to all workbench subcomponents
*/
const WorkbenchWrapper = ({ app, pattern }) => {
// State for gist
const [gist, setGist] = useLocalStorage(`${pattern.config.name}_gist`, defaultGist(pattern, app.locale))
// If we don't have the required measurements,
// force view to measurements
useEffect(() => {
if (
gist?._state?.view !== 'measurements'
&& !hasRequiredMeasurements(pattern, gist)
) updateGist(['_state', 'view'], 'measurements')
})
// Helper methods to manage the gist state
const updateGist = (path, content) => {
const newGist = {...gist}
set(newGist, path, content)
setGist(newGist)
}
const unsetGist = (path) => {
const newGist = {...gist}
unset(newGist, path)
setGist(newGist)
}
// Generate the draft here so we can pass it down
2022-01-30 15:14:44 +01:00
let draft = false
2022-02-13 15:45:27 +01:00
if (['draft', 'events', 'test'].indexOf(gist?._state?.view) !== -1) {
2022-01-30 15:14:44 +01:00
draft = new pattern(gist)
2022-02-13 16:10:51 +01:00
if (gist.renderer === 'svg') draft.use(theme)
2022-02-13 15:45:27 +01:00
try {
if (gist._state.view !== 'test') draft.draft()
}
2022-01-30 15:14:44 +01:00
catch(error) {
console.log('Failed to draft pattern', error)
return <DraftError error={error} app={app} draft={draft} at={'draft'} />
}
}
// Props to pass down
const componentProps = { app, pattern, gist, updateGist, unsetGist, setGist, draft }
// Required props for layout
const layoutProps = {
app: app,
noSearch: true,
workbench: true,
AltMenu: <Menu {...componentProps }/>
}
const Component = views[gist?._state?.view]
? views[gist._state.view]
: views.welcome
2022-01-30 15:14:44 +01:00
return <Layout {...layoutProps}>
<Component {...componentProps} />
</Layout>
}
export default WorkbenchWrapper