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

111 lines
2.7 KiB
JavaScript
Raw Normal View History

import { useState, 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'
2022-01-25 11:22:48 +01:00
import Measurements, { Input } from 'shared/components/workbench/measurements/index.js'
import LabDraft from 'shared/components/workbench/draft/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'
// 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 mode & gist state, which will trickly down
* to all workbench subcomponents
*
* mode: What to display (draft, sample, measurements, ...)
* gist: The runtime pattern configuration
*/
const WorkbenchWrapper = ({ app, pattern }) => {
// State for display mode and gist
const [mode, setMode] = useState('measurements')
const [gist, setGist] = useLocalStorage('gist', defaultGist(pattern, app.locale))
// If we don't have the requiremed measurements,
// force mode to measurements
useEffect(() => {
if (
mode !== 'measurements'
&& !hasRequiredMeasurements(pattern, gist)
) setMode('measurements')
})
/*
* Update gist method. See lodash.set
*/
const updateGist = (path, content) => {
const newGist = {...gist}
set(newGist, path, content)
setGist(newGist)
}
const unsetGist = (path) => {
const newGist = {...gist}
unset(newGist, path)
setGist(newGist)
}
// Required props for layout
const layoutProps = {
app: app,
noSearch: true,
workbench: true,
AltMenu: <Menu
app={app}
pattern={pattern}
mode={mode}
setMode={setMode}
gist={gist}
updateGist={updateGist}
unsetGist={unsetGist}
setGist={setGist}
/>
}
return (
<Layout {...layoutProps}>
{mode === 'measurements' && (
<Measurements
app={app}
pattern={pattern}
gist={gist}
updateGist={updateGist}
/>
)}
2022-01-25 11:22:48 +01:00
{mode === 'draft' && (
<LabDraft
app={app}
pattern={pattern}
gist={gist}
updateGist={updateGist}
/>
)}
</Layout>
)
}
export default WorkbenchWrapper