// New Generation Docking HUD // Purpose: Provides a single low-friction transition between docked, driving, and manual docking. // Scope: Owns presentation and the existing manual-assist lifecycle for the current driver HUD; // the archived desktop layout retains its previous DriveDockAction behavior. import { useCallback, useEffect, useRef, useState } from 'react'; import { FaChargingStation } from 'react-icons/fa'; import { useControlActions } from '../../../../controls/index.js'; import ControlHint from '../../../ControlHint/index.jsx'; import { useTelemetrySelector } from '../../../../context/TelemetryContext.jsx'; import { dockTelemetryEqual, selectDockTelemetry } from '../../../../context/telemetryViews.js'; import { useManualDockAssist } from '../../../../features/manualDockAssist/useManualDockAssist.js'; import { useSettingsNamespace } from '../../../../settings/index.js'; import useCanControlRover from '../../../../hooks/useCanControlRover.js'; import { useDriverLayout } from '../../../../layouts/driver/DriverLayoutContext.jsx'; import { useSessionSelector } from '../../../../context/SessionContext.jsx'; import KeyPill from '../../../vip/VipAudioUploadCard/KeyPill.jsx'; import ExpansionPanel from '../CornerPods/ExpansionPanel.jsx'; import usePodVisibility from '../CornerPods/usePodVisibility.js'; function DockedAction({ driveKeyLabel, pending, controlsDisabled, error, onUndock }) { const [hidden, setHidden] = useState(false); const waitingForTurn = controlsDisabled && !pending; /* The dismissal belongs to this mounted docked episode. DockingHud unmounts this component when the rover leaves the base, and its roverId key remounts it for a different assignment, so no persistence or reset effect is needed. */ if (hidden && !pending) return null; const mainToneClass = waitingForTurn ? 'cursor-not-allowed bg-slate-950/95 ring-slate-400/70' : 'bg-emerald-950/90 ring-emerald-300/80 hover:bg-emerald-900/95 focus-visible:ring-emerald-200 disabled:cursor-wait disabled:opacity-75'; const hideToneClass = waitingForTurn ? 'bg-slate-950/95 ring-slate-400/70 hover:bg-slate-900' : 'bg-emerald-950/90 ring-emerald-300/80 hover:bg-emerald-900/95 focus-visible:ring-emerald-200'; return ( <> {/* The docked shield is owned by the dismissible action so hiding the prompt also reveals the video and ordinary HUD instead of leaving an unexplained dark, input-blocking layer behind. */}