import { useState } from 'react'; import { useMutation } from '@tanstack/react-query'; import { api, isConfirmationRequired } from '../../api/client'; import type { PrinterStatus } from '../../api/client'; import { ChevronUp, ChevronDown } from 'lucide-react'; import { ConfirmModal } from '../ConfirmModal'; interface ExtruderControlsProps { printerId: number; status: PrinterStatus | null | undefined; nozzleCount: number; } export function ExtruderControls({ printerId, status, nozzleCount }: ExtruderControlsProps) { const isConnected = status?.connected ?? false; const isPrinting = status?.state === 'RUNNING' || status?.state === 'PAUSE'; const isDualNozzle = nozzleCount > 1; const [selectedNozzle, setSelectedNozzle] = useState<'left' | 'right'>('left'); const [confirmModal, setConfirmModal] = useState<{ token: string; warning: string; distance: number; } | null>(null); const extrudeMutation = useMutation({ mutationFn: ({ distance, token }: { distance: number; token?: string }) => { // G-code for extrusion: relative mode, extrude, back to absolute // T0/T1 selects the tool for dual nozzle const toolSelect = isDualNozzle ? `T${selectedNozzle === 'left' ? 0 : 1}\n` : ''; const gcode = `${toolSelect}G91\nG1 E${distance} F300\nG90`; return api.sendGcode(printerId, gcode, token); }, onSuccess: (result, variables) => { if (isConfirmationRequired(result)) { setConfirmModal({ token: result.token, warning: result.warning, distance: variables.distance, }); } }, }); const handleExtrude = (distance: number) => { extrudeMutation.mutate({ distance }); }; const handleConfirm = () => { if (confirmModal) { extrudeMutation.mutate({ distance: confirmModal.distance, token: confirmModal.token }); setConfirmModal(null); } }; const isDisabled = !isConnected || isPrinting || extrudeMutation.isPending; return ( <>