// Hooks
import { useEffect, useState } from 'react'
import { useTranslation } from 'next-i18next'
import { useView } from 'shared/hooks/use-view.mjs'
import { usePatternSettings } from 'shared/hooks/use-pattern-settings.mjs'
import { useAccount } from 'shared/hooks/use-account.mjs'
import { useControlState } from 'shared/components/account/control.mjs'
// Dependencies
import { pluginTheme } from '@freesewing/plugin-theme'
import { pluginI18n } from '@freesewing/plugin-i18n'
import { objUpdate, hasRequiredMeasurements } from 'shared/utils.mjs'
// Components
import { WorkbenchHeader } from './header.mjs'
import { ErrorView } from 'shared/components/error/view.mjs'
import { ModalSpinner } from 'shared/components/modal/spinner.mjs'
// Views
import { DraftView, ns as draftNs } from 'shared/components/workbench/views/draft/index.mjs'
import { SaveView, ns as saveNs } from 'shared/components/workbench/views/save/index.mjs'
import { PrintView, ns as printNs } from 'shared/components/workbench/views/print/index.mjs'
import { CutView, ns as cutNs } from 'shared/components/workbench/views/cut/index.mjs'
import { EditView, ns as editNs } from './views/edit/index.mjs'
import { TestView, ns as testNs } from 'shared/components/workbench/views/test/index.mjs'
import { ExportView, ns as exportNs } from 'shared/components/workbench/views/exporting/index.mjs'
import { LogView, ns as logNs } from 'shared/components/workbench/views/logs/index.mjs'
import { InspectView, ns as inspectNs } from 'shared/components/workbench/views/inspect/index.mjs'
import { MeasiesView, ns as measiesNs } from 'shared/components/workbench/views/measies/index.mjs'
export const ns = [
'account',
'workbench',
...draftNs,
...saveNs,
...printNs,
...cutNs,
...editNs,
...testNs,
...exportNs,
...logNs,
...inspectNs,
...measiesNs,
]
const defaultUi = {
renderer: 'react',
}
const views = {
draft: DraftView,
print: PrintView,
cut: CutView,
export: ExportView,
edit: EditView,
test: TestView,
logs: LogView,
inspect: InspectView,
measies: MeasiesView,
}
const draftViews = ['draft', 'inspect']
export const Workbench = ({ design, Design, DynamicDocs }) => {
// Hooks
const { t, i18n } = useTranslation(ns)
const { language } = i18n
const { account } = useAccount()
const controlState = useControlState()
// State
const [view, setView] = useView()
const [settings, setSettings] = usePatternSettings()
const [ui, setUi] = useState(defaultUi)
const [error, setError] = useState(false)
const [mounted, setMounted] = useState(false)
const [missingMeasurements, setMissingMeasurements] = useState(false)
useEffect(() => {
// Force the measurements view if we have missing measurements
const [ok, missing] = hasRequiredMeasurements(Design, settings.measurements)
if (ok) setMissingMeasurements(false)
else {
// Guard against loops
if (JSON.stringify(missing) !== JSON.stringify(missingMeasurements))
setMissingMeasurements(missing)
if (view !== 'measies') setView('measies')
}
}, [Design, settings.measurements, missingMeasurements, view])
// Helper methods for settings/ui updates
const update = {
settings: (path, val) => setSettings(objUpdate({ ...settings }, path, val)),
ui: (path, val) => setUi(objUpdate({ ...ui }, path, val)),
toggleSa: () => {
const sa = settings.samm || (account.imperial ? 15.3125 : 10)
if (settings.sabool)
setSettings(
objUpdate({ ...settings }, [
[['sabool'], 0],
[['sa'], 0],
[['samm'], sa],
])
)
else {
const sa = settings.samm || (account.imperial ? 15.3125 : 10)
setSettings(
objUpdate({ ...settings }, [
[['sabool'], 1],
[['sa'], sa],
[['samm'], sa],
])
)
}
},
setControl: controlState.update,
}
// Don't bother without a Design
if (!Design) return