// Dependencies import { capitalize, shortDate } from 'shared/utils.mjs' // Hooks import { useContext, useMemo } from 'react' import { useMobileAction } from 'shared/context/mobile-menubar-context.mjs' import { useTranslation } from 'next-i18next' import { useBackend } from 'shared/hooks/use-backend.mjs' // Context import { LoadingStatusContext } from 'shared/context/loading-status-context.mjs' // Components import { PanZoomContext } from 'shared/components/workbench/pattern/pan-zoom-context.mjs' import { PaperlessIcon, SaIcon, RocketIcon, BulletIcon, UnitsIcon, DetailIcon, ResetIcon, UploadIcon, BookmarkIcon, ZoomInIcon, ZoomOutIcon, ExpandIcon, KioskIcon, } from 'shared/components/icons.mjs' export const ns = ['common', 'core-settings', 'ui-settings'] const IconButton = ({ Icon, onClick, dflt = true, title, hide = false, extraClasses = '' }) => (
) const smZoomClasses = '[.mobile-menubar_&]:btn [.mobile-menubar_&]:btn-secondary [.mobile-menubar_&]:btn-circle [.mobile-menubar_&]:my-1' const ZoomButtons = ({ t, zoomFunctions, zoomed }) => { if (!zoomFunctions) return null return (
zoomFunctions.zoomOut()} title={t('zoomOut')} dflt extraClasses={smZoomClasses} /> zoomFunctions.zoomIn()} title={t('zoomIn')} dflt extraClasses={smZoomClasses} />
) } const Spacer = () => | export const DraftHeader = ({ update, settings, ui, control, account, design, setSettings }) => { const { t, i18n } = useTranslation(ns) const { zoomFunctions, zoomed } = useContext(PanZoomContext) const backend = useBackend() const { setLoadingStatus } = useContext(LoadingStatusContext) // make the zoom buttons so we can pass them to the mobile menubar const headerZoomButtons = useMemo( () => , [zoomed, t, zoomFunctions] ) // add the zoom buttons as an action on the mobile menubar useMobileAction('zoom', { order: 0, actionContent: headerZoomButtons }) const savePattern = async () => { setLoadingStatus([true, 'savingPattern']) const name = `${capitalize(design)} / ${shortDate(i18n.language)}` const patternData = { design, name, public: false, settings, data: {} } const result = await backend.createPattern(patternData) if (result.success) { const id = result.data.pattern.id setLoadingStatus([ true, <> {t('status:patternSaved')} [#{id}] , true, true, ]) } else setLoadingStatus([true, 'backendError', true, false]) } const bookmarkPattern = async () => { setLoadingStatus([true, 'creatingBookmark']) const result = await backend.createBookmark({ type: 'pattern', title: `${capitalize(design)} / ${shortDate(i18n.language)}`, url: window.location.pathname + window.location.search + window.location.hash, }) if (result.success) { const id = result.data.bookmark.id setLoadingStatus([ true, <> {t('status:bookmarkCreated')} [#{id}] , true, true, ]) } else setLoadingStatus([true, 'backendError', true, false]) } return (
{headerZoomButtons}
update.toggleSa()} title={t('core-settings:sabool.t')} /> update.settings(['paperless'], !settings.paperless)} title={t('core-settings:paperless.t')} /> update.settings( ['complete'], typeof settings.complete === 'undefined' ? 0 : settings.complete ? 0 : 1 ) } title={t('core-settings:complete.t')} /> update.settings( ['expand'], typeof settings.expand === 'undefined' ? 1 : settings.expand ? 0 : 1 ) } title={t('core-settings:expand.t')} /> } dflt={settings.units !== 'imperial'} onClick={() => update.settings(['units'], settings.units === 'imperial' ? 'metric' : 'imperial') } title={t('core-settings:units.t')} />
{[1, 2, 3, 4, 5].map((score) => ( ))}
update.ui(['kiosk'], ui.kiosk ? 0 : 1)} title={t('ui-settings:kiosk.t')} />
update.ui(['renderer'], ui.renderer === 'react' ? 'svg' : 'react')} title={t('ui-settings:renderer.t')} />
) }