import { useState } from 'react'; import { Settings, ChevronDown, ChevronUp, Flame } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import type { PrintOptionsProps, PrintOptions as PrintOptionsType, PreheatOverride } from './types'; type OptionConfig = { key: keyof PrintOptionsType; label: string; desc: string; dualNozzleOnly?: boolean; }; /** * Print options toggle panel with collapsible UI. * Shows bed levelling, flow/vibration calibration, layer inspection, timelapse, * and (for dual-nozzle printers only) nozzle offset calibration. */ export function PrintOptionsPanel({ options, onChange, defaultExpanded = false, showDualNozzleOptions = false, }: PrintOptionsProps) { const { t } = useTranslation(); const [isExpanded, setIsExpanded] = useState(defaultExpanded); // Labels/descriptions reuse the settings.default* namespace — identical strings, // already translated across all locales. Only nozzle_offset_cali is new (#1682). const printOptionsConfig: OptionConfig[] = [ { key: 'bed_levelling', label: t('settings.defaultBedLevelling'), desc: t('settings.defaultBedLevellingDesc') }, { key: 'flow_cali', label: t('settings.defaultFlowCali'), desc: t('settings.defaultFlowCaliDesc') }, { key: 'vibration_cali', label: t('settings.defaultVibrationCali'), desc: t('settings.defaultVibrationCaliDesc') }, { key: 'layer_inspect', label: t('settings.defaultLayerInspect'), desc: t('settings.defaultLayerInspectDesc') }, { key: 'timelapse', label: t('settings.defaultTimelapse'), desc: t('settings.defaultTimelapseDesc') }, { key: 'nozzle_offset_cali', label: t('settings.defaultNozzleOffsetCali'), desc: t('settings.defaultNozzleOffsetCaliDesc'), dualNozzleOnly: true }, ]; const visibleOptions = printOptionsConfig.filter(o => !o.dualNozzleOnly || showDualNozzleOptions); const handleToggle = (key: keyof PrintOptionsType) => { onChange({ ...options, [key]: !options[key] }); }; const handlePreheatOverride = (next: PreheatOverride) => { onChange({ ...options, preheat_override: next, // Clearing override→off also clears the chamber-target override so the // backend doesn't carry a stale value if the user re-enables later. ...(next === 'off' ? { preheat_chamber_target_override: null } : {}), }); }; const handlePreheatTarget = (raw: string) => { if (raw === '') { onChange({ ...options, preheat_chamber_target_override: null }); return; } const parsed = parseInt(raw, 10); if (Number.isNaN(parsed)) return; onChange({ ...options, preheat_chamber_target_override: Math.max(0, Math.min(60, parsed)), }); }; return (
{isExpanded && (
{visibleOptions.map(({ key, label, desc }) => (
); }