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)} /> ))}
)}
); }