File size: 2,406 Bytes
fc9bd9f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | import React from "react";
import { useNavigate } from "react-router-dom";
import { useApi } from "@/contexts/ApiContext";
import { useToast } from "@/hooks/use-toast";
import { RobotRecord } from "@/hooks/useRobots";
import RobotTile from "./RobotTile";
interface RobotConfigManagerProps {
selectedName: string | null;
selectedRecord: RobotRecord | null;
availableNames: string[];
isLoading: boolean;
selectRobot: (name: string) => void;
createRobot: (name: string) => Promise<boolean>;
deleteRobot: (name: string) => Promise<boolean>;
}
const RobotConfigManager: React.FC<RobotConfigManagerProps> = ({
selectedName,
selectedRecord,
availableNames,
isLoading,
selectRobot,
createRobot,
deleteRobot,
}) => {
const navigate = useNavigate();
const { baseUrl, fetchWithHeaders } = useApi();
const { toast } = useToast();
const handleConfigure = (name: string) => {
navigate("/calibration", { state: { robot_name: name } });
};
const handleTeleop = async (robot: RobotRecord) => {
try {
const res = await fetchWithHeaders(`${baseUrl}/move-arm`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
leader_port: robot.leader_port,
follower_port: robot.follower_port,
leader_config: robot.leader_config,
follower_config: robot.follower_config,
}),
});
const data = await res.json();
if (res.ok) {
toast({
title: "Teleoperation Started",
description: data.message || `Started teleoperation for ${robot.name}.`,
});
navigate("/teleoperation");
} else {
toast({
title: "Error Starting Teleoperation",
description: data.message || "Failed to start.",
variant: "destructive",
});
}
} catch (e) {
toast({
title: "Connection Error",
description: "Could not connect to the backend server.",
variant: "destructive",
});
}
};
return (
<RobotTile
robot={selectedRecord}
selectedName={selectedName}
availableNames={availableNames}
isLoading={isLoading}
onSelect={selectRobot}
onCreateNew={createRobot}
onConfigure={handleConfigure}
onTeleop={handleTeleop}
onDelete={deleteRobot}
/>
);
};
export default RobotConfigManager;
|