import { useState, useEffect } from 'react'; import { GrowingRecipe } from '../../lib/vertical-farming/types'; interface RecipeSelectorProps { onSelect: (recipe: GrowingRecipe) => void; selectedRecipeId?: string; } export default function RecipeSelector({ onSelect, selectedRecipeId }: RecipeSelectorProps) { const [recipes, setRecipes] = useState([]); const [loading, setLoading] = useState(true); const [filter, setFilter] = useState(''); useEffect(() => { fetchRecipes(); }, []); const fetchRecipes = async () => { try { const response = await fetch('/api/vertical-farm/recipes'); const data = await response.json(); if (data.success) { setRecipes(data.recipes); } } catch (error) { console.error('Error fetching recipes:', error); } finally { setLoading(false); } }; const filteredRecipes = recipes.filter( r => r.name.toLowerCase().includes(filter.toLowerCase()) || r.cropType.toLowerCase().includes(filter.toLowerCase()) ); if (loading) { return (

Loading recipes...

); } return (
setFilter(e.target.value)} className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500" />
{filteredRecipes.map(recipe => (
onSelect(recipe)} className={`p-4 rounded-lg border-2 cursor-pointer transition ${ selectedRecipeId === recipe.id ? 'border-green-500 bg-green-50' : 'border-gray-200 hover:border-green-300' }`} >

{recipe.name}

{recipe.rating && ( {'*'.repeat(Math.round(recipe.rating))} {recipe.rating.toFixed(1)} )}
Crop: {recipe.cropType}
Days: {recipe.expectedDays}
Yield: {recipe.expectedYieldGrams}g
Uses: {recipe.timesUsed}
{recipe.stages.map(stage => ( {stage.name} ))}
Source: {recipe.source} | Zone: {recipe.requirements.zoneType}
))}
{filteredRecipes.length === 0 && (

No recipes found matching "{filter}"

)}
); }