import React, { useId } from "react"; import { Checkbox } from "@mui/material"; import { FaChevronDown, FaDotCircle, FaPause, FaPlay, FaStop, } from "react-icons/fa"; import { DropdownOptionsInterface } from "../../utils/start-end-rules/start-end-options"; import Dropdown from "../Dropdown"; import styles from "./styles.module.css"; export type GraphRecordingState = | "choose-signals" | "ready" | "recording" | "paused"; interface GraphControlsProps { onClickPlay: () => void; onClickPause: () => void; onClickStop: () => void; onAutoScrollToggle: () => void; autoScrollEnabled: boolean; onStartOptionChange: ( selectedOption: DropdownOptionsInterface, rule: "start" | "end" ) => void; onEndOptionChange: ( selectedOption: DropdownOptionsInterface, rule: "start" | "end" ) => void; startSelectedOption: DropdownOptionsInterface | undefined; endSelectedOption: DropdownOptionsInterface | undefined; startOptions: DropdownOptionsInterface[]; endOptions: DropdownOptionsInterface[]; recordingState: GraphRecordingState; hasData: boolean; endConditionReached?: boolean; mode?: "all" | "primary" | "advanced"; } const getStatusCopy = ( recordingState: GraphRecordingState, endConditionReached: boolean ) => { if (recordingState === "choose-signals") { return { title: "Choose signals", description: "Select at least one signal to enable recording.", }; } if (recordingState === "ready") { return { title: "Ready to record", description: "Your signals are selected. Start when you’re ready.", }; } if (recordingState === "recording") { return { title: "Recording active", description: "Data appears as readings arrive and the start condition is met.", }; } if (endConditionReached) { return { title: "Recording ended", description: "The end condition was met. Reset the graph to record again.", }; } return { title: "Recording paused", description: "Resume to continue this recording, or reset to start over.", }; }; function GraphControls({ onClickPlay, onClickPause, onClickStop, onAutoScrollToggle, autoScrollEnabled, onStartOptionChange, onEndOptionChange, startSelectedOption, endSelectedOption, startOptions, endOptions, recordingState, hasData, endConditionReached = false, mode = "all", }: GraphControlsProps) { const reactId = useId(); const isRecording = recordingState === "recording"; const canRecord = recordingState !== "choose-signals" && !isRecording && !endConditionReached; const canPause = isRecording; const canReset = hasData || recordingState === "recording" || recordingState === "paused"; const statusCopy = getStatusCopy(recordingState, endConditionReached); const recordLabel = recordingState === "paused" ? "Resume" : "Record"; const statusDescriptionId = `recording-status-${reactId.replace(/:/g, "")}`; const showPrimaryControls = mode !== "advanced"; const showAdvancedSettings = mode !== "primary"; const sectionLabel = mode === "primary" ? "Recording controls" : mode === "advanced" ? "Advanced graph settings" : "Recording controls and graph settings"; return (
{showPrimaryControls && (

{statusCopy.title}

{statusCopy.description}

)} {showAdvancedSettings && (
Advanced settings Trigger conditions and chart scrolling

Trigger conditions

{isRecording && (

Pause recording to edit trigger conditions.

)}
)}
); } export default React.memo(GraphControls);