2022-06-22 15:19:07 -05:00
|
|
|
import React, {useMemo} from 'react'
|
2022-01-25 15:34:54 +01:00
|
|
|
import MeasurementInput from '../inputs/measurement.js'
|
2022-06-20 18:31:22 +02:00
|
|
|
import { withBreasts, withoutBreasts } from '@freesewing/models'
|
2022-01-25 11:22:48 +01:00
|
|
|
import nonHuman from './non-human.js'
|
2022-01-25 08:31:06 +01:00
|
|
|
import WithBreastsIcon from 'shared/components/icons/with-breasts.js'
|
|
|
|
import WithoutBreastsIcon from 'shared/components/icons/without-breasts.js'
|
2022-02-07 20:02:28 +01:00
|
|
|
import { useTranslation } from 'next-i18next'
|
2022-06-10 14:34:21 -05:00
|
|
|
import Setting from '../menu/core-settings/setting';
|
|
|
|
import {settings} from '../menu/core-settings/index';
|
2022-01-25 08:31:06 +01:00
|
|
|
|
|
|
|
const groups = {
|
|
|
|
people: {
|
|
|
|
with: withBreasts,
|
|
|
|
without: withoutBreasts,
|
|
|
|
},
|
|
|
|
dolls: {
|
|
|
|
with: nonHuman.withBreasts.dolls,
|
|
|
|
without: nonHuman.withoutBreasts.dolls,
|
|
|
|
},
|
|
|
|
giants: {
|
|
|
|
with: nonHuman.withBreasts.giants,
|
|
|
|
without: nonHuman.withoutBreasts.giants,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const icons = {
|
|
|
|
with: <WithBreastsIcon />,
|
|
|
|
without: <WithoutBreastsIcon />,
|
|
|
|
}
|
2022-01-22 17:55:03 +01:00
|
|
|
|
2022-06-17 12:02:09 +02:00
|
|
|
const WorkbenchMeasurements = ({ app, design, gist, updateGist }) => {
|
2022-02-07 20:02:28 +01:00
|
|
|
const { t } = useTranslation(['app', 'cfp'])
|
2022-01-22 17:55:03 +01:00
|
|
|
|
|
|
|
// Method to handle measurement updates
|
|
|
|
const updateMeasurements = (value, m=false) => {
|
|
|
|
if (m === false) {
|
|
|
|
// Set all measurements
|
2022-01-25 08:31:06 +01:00
|
|
|
updateGist('measurements', value)
|
2022-01-22 17:55:03 +01:00
|
|
|
} else {
|
|
|
|
// Set one measurement
|
2022-06-22 15:19:07 -05:00
|
|
|
updateGist(['measurements', m], value)
|
2022-01-22 17:55:03 +01:00
|
|
|
}
|
|
|
|
}
|
2022-06-22 15:19:07 -05:00
|
|
|
|
2022-01-22 17:55:03 +01:00
|
|
|
// Save us some typing
|
2022-06-22 15:19:07 -05:00
|
|
|
const inputProps = useMemo(() => ({ app, updateMeasurements, gist }), [app, updateMeasurements, gist])
|
2022-01-22 17:55:03 +01:00
|
|
|
|
|
|
|
return (
|
2022-02-12 14:31:17 +01:00
|
|
|
<div className="m-auto max-w-2xl">
|
2022-01-22 17:55:03 +01:00
|
|
|
<h1>
|
|
|
|
<span className='capitalize mr-4 opacity-70'>
|
2022-06-17 12:02:09 +02:00
|
|
|
{design.config.name}:
|
2022-05-15 15:12:32 +02:00
|
|
|
</span> {t('measurements')}
|
2022-01-22 17:55:03 +01:00
|
|
|
</h1>
|
2022-02-12 14:31:17 +01:00
|
|
|
<details open className="my-2">
|
|
|
|
<summary><h2 className="inline pl-1">{t('cfp:preloadMeasurements')}</h2></summary>
|
2022-01-25 08:31:06 +01:00
|
|
|
<div className="ml-2 pl-4 border-l-2">
|
|
|
|
{Object.keys(groups).map(group => (
|
2022-01-25 10:03:10 +01:00
|
|
|
<details key={group}>
|
2022-02-12 14:31:17 +01:00
|
|
|
<summary><h3 className="inline pl-1">{t(group)}</h3></summary>
|
2022-01-25 08:31:06 +01:00
|
|
|
<div className="ml-2 pl-4 border-l-2">
|
|
|
|
{Object.keys(icons).map(type => (
|
2022-01-25 10:03:10 +01:00
|
|
|
<React.Fragment key={type}>
|
2022-02-07 20:02:28 +01:00
|
|
|
<h4>{t(`${type}Breasts`)}</h4>
|
2022-01-25 08:31:06 +01:00
|
|
|
<ul className="flex flex-row flex-wrap gap-2">
|
|
|
|
{Object.keys(groups[group][type]).map((m) => (
|
|
|
|
<li key={`${m}-${type}-${group}`} className="">
|
|
|
|
<button
|
|
|
|
className="flex flex-row btn btn-outline"
|
|
|
|
onClick={() => updateMeasurements(groups[group][type][m], false)}
|
|
|
|
>
|
|
|
|
{icons[type]}
|
2022-02-07 20:02:28 +01:00
|
|
|
{t('size')}
|
2022-01-25 08:31:06 +01:00
|
|
|
{ group === 'people'
|
2022-06-10 14:34:21 -05:00
|
|
|
? m.replace('size', '')
|
2022-01-25 08:31:06 +01:00
|
|
|
: m
|
|
|
|
}
|
|
|
|
</button>
|
|
|
|
</li>
|
|
|
|
))}
|
|
|
|
</ul>
|
2022-01-25 10:03:10 +01:00
|
|
|
</React.Fragment>
|
2022-01-25 08:31:06 +01:00
|
|
|
))}
|
|
|
|
</div>
|
|
|
|
</details>
|
2022-01-22 17:55:03 +01:00
|
|
|
))}
|
2022-01-25 08:31:06 +01:00
|
|
|
</div>
|
|
|
|
</details>
|
|
|
|
|
2022-02-12 14:31:17 +01:00
|
|
|
<details className="my-2">
|
|
|
|
<summary><h2 className="inline pl-2">{t('cfp:enterMeasurements')}</h2></summary>
|
2022-06-10 14:34:21 -05:00
|
|
|
<Setting key={'units'} setting={'units'} config={settings.units} updateGist={updateGist} {...inputProps} />
|
2022-01-25 08:31:06 +01:00
|
|
|
<div className="ml-2 pl-4 border-l-2">
|
2022-06-17 12:02:09 +02:00
|
|
|
{design.config.measurements && (
|
2022-01-25 08:31:06 +01:00
|
|
|
<>
|
2022-02-07 20:02:28 +01:00
|
|
|
<h3>{t('requiredMeasurements')}</h3>
|
2022-06-17 12:02:09 +02:00
|
|
|
{design.config.measurements.map(m => (
|
2022-01-25 08:31:06 +01:00
|
|
|
<MeasurementInput key={m} m={m} {...inputProps} />
|
|
|
|
))}
|
|
|
|
</>
|
|
|
|
)}
|
2022-06-17 12:02:09 +02:00
|
|
|
{design.config.optionalMeasurements && (
|
2022-01-25 08:31:06 +01:00
|
|
|
<>
|
2022-02-07 20:02:28 +01:00
|
|
|
<h3>{t('optionalMeasurements')}</h3>
|
2022-06-17 12:02:09 +02:00
|
|
|
{design.config.optionalMeasurements.map(m => (
|
2022-01-25 08:31:06 +01:00
|
|
|
<MeasurementInput key={m} m={m} {...inputProps} />
|
|
|
|
))}
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
</details>
|
|
|
|
|
2022-01-22 17:55:03 +01:00
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
export default WorkbenchMeasurements
|
|
|
|
|