import React, { useState, useCallback } from 'react';
import { useTurtleStore } from '../store/turtleStore';
import './ControlPanel.css';
function TurtleCard({ turtle, isSelected, onSelect }) {
const activeState = turtle.state || turtle.mode || 'idle';
const fuel = turtle.fuel === 'unlimited' ? 'â' : (turtle.fuel || '?');
const inventoryCount = turtle.inventory?.length || 0;
const displayName = turtle.label || `Turtle ${turtle.turtleID}`;
const modeColors = {
mining: '#4ade80',
exploring: '#60a5fa',
returning: '#f59e0b',
goHome: '#f59e0b',
idle: '#9ca3af',
manual: '#a78bfa',
refueling: '#ef4444',
farming: '#22c55e',
dumpInventory: '#a855f7',
dumping: '#a855f7',
moving: '#06b6d4',
scan: '#8b5cf6',
extraction: '#f97316',
building: '#14b8a6',
autocraft: '#ec4899',
unknown: '#6b7280'
};
return (
{displayName}
{activeState}
Position:
{turtle.position
? `${turtle.position.x}, ${turtle.position.y}, ${turtle.position.z}`
: 'No GPS'
}
Fuel:
{fuel}
Inventory:
{inventoryCount} items
{turtle.position && turtle.homePosition && (
Home Distance:
{Math.abs(turtle.position.x - turtle.homePosition.x) +
Math.abs(turtle.position.y - turtle.homePosition.y) +
Math.abs(turtle.position.z - turtle.homePosition.z)} blocks
)}
);
}
function TurtleDetails({ turtle }) {
const sendCommand = useTurtleStore((state) => state.sendCommand);
const setTurtleState = useTurtleStore((state) => state.setTurtleState);
if (!turtle) {
return (
Select a turtle to view details and control it
);
}
const handleCommand = (command, param = null) => {
sendCommand(turtle.turtleID, command, param);
};
const handleStateChange = (stateName, data = {}) => {
setTurtleState(turtle.turtleID, stateName, data);
};
const activeState = turtle.state || turtle.mode || 'idle';
return (
Turtle {turtle.turtleID} Control
Status
State:
{activeState}
{turtle.stateDescription && (
Activity:
{turtle.stateDescription}
)}
Fuel:
{turtle.fuel === 'unlimited' ? 'Unlimited' : turtle.fuel}
Position:
{turtle.position
? `X: ${turtle.position.x}, Y: ${turtle.position.y}, Z: ${turtle.position.z}`
: 'No GPS'
}
Home:
{turtle.homePosition
? `X: ${turtle.homePosition.x}, Y: ${turtle.homePosition.y}, Z: ${turtle.homePosition.z}`
: 'Not set'
}
{turtle.error && (
Error:
{turtle.error}
)}
{turtle.warning && (
Warning:
{turtle.warning}
)}
{/* Peripherals section */}
{turtle.peripherals && Object.keys(turtle.peripherals).length > 0 && (
Peripherals
{Object.entries(turtle.peripherals).map(([side, type]) => (
{side}:
{type}
))}
)}
State Machine
Legacy Commands
Movement
Actions
{turtle.inventory && turtle.inventory.length > 0 && (
Inventory ({turtle.inventoryCount || turtle.inventory.length}/16)
{Array.from({ length: 16 }, (_, slotIndex) => {
const item = turtle.inventory[slotIndex];
return (
{item ? (
<>
{item.name.includes('diamond') ? 'đ' :
item.name.includes('gold') ? 'īŋŊ' :
item.name.includes('iron') ? 'âĒ' :
item.name.includes('coal') ? 'âĢ' :
item.name.includes('emerald') ? 'đĸ' :
item.name.includes('redstone') ? 'đ´' :
item.name.includes('lapis') ? 'đĩ' :
item.name.includes('stone') ? 'đŋ' :
item.name.includes('dirt') ? 'đ¤' :
item.name.includes('wood') || item.name.includes('log') ? 'đĒĩ' :
item.name.includes('cobble') ? 'đǍ' : 'īŋŊđĻ'}
{item.count}
{item.name.replace('minecraft:', '').replace(/_/g, ' ').split(' ').slice(0, 2).join(' ')}
>
) : (
{slotIndex + 1}
)}
);
})}
)}
);
}
export default function ControlPanel() {
const turtles = useTurtleStore((state) => state.getTurtleArray());
const selectedTurtleId = useTurtleStore((state) => state.selectedTurtleId);
const selectTurtle = useTurtleStore((state) => state.selectTurtle);
const selectedTurtle = useTurtleStore((state) => state.getSelectedTurtle());
const connected = useTurtleStore((state) => state.connected);
return (
đĸ Turtle Control Center
{connected ? 'Connected' : 'Disconnected'}
Turtles ({turtles.length})
{turtles.length === 0 ? (
No turtles connected
Waiting for turtles to come online...
) : (
{turtles.map((turtle) => (
selectTurtle(turtle.turtleID)}
/>
))}
)}
);
}