'use client'; import { useState, useTransition } from 'react'; import Link from 'next/link'; import type { Recipe, RecipeInventoryPreview, } from '../../features/inventory/types'; type Props = { recipes: Recipe[]; }; function getStatusStyle(status: 'enough' | 'missing' | 'unit_mismatch') { if (status === 'enough') { return { label: 'Räcker', color: '#1f5f2c', background: '#ecf8ee', border: '#b9e0bf', }; } if (status === 'missing') { return { label: 'Saknas', color: '#8b0000', background: '#ffeaea', border: '#f1b5b5', }; } return { label: 'Enhetskonflikt', color: '#8a4b00', background: '#fff4e5', border: '#f0cf9b', }; } function formatDate(value: string | null) { if (!value) return null; return new Date(value).toLocaleDateString('sv-SE'); } function isWeightUnit(unit: string): boolean { return ['kg', 'g', 'mg', 'ml', 'l'].includes(unit.trim().toLowerCase()); } function isPieceUnit(unit: string): boolean { return ['st', 'stycke'].includes(unit.trim().toLowerCase()); } export default function RecipePreview({ recipes }: Props) { const [selectedRecipeId, setSelectedRecipeId] = useState(''); const [preview, setPreview] = useState(null); const [error, setError] = useState(null); const [isPending, startTransition] = useTransition(); const loadPreview = () => { setError(null); setPreview(null); if (!selectedRecipeId) { setError('Välj ett recept.'); return; } startTransition(async () => { try { const res = await fetch(`/api/recipe-preview-proxy?id=${selectedRecipeId}`, { method: 'GET', cache: 'no-store', }); if (!res.ok) { const text = await res.text(); throw new Error(text || 'Kunde inte hämta recept-preview.'); } const data: RecipeInventoryPreview = await res.json(); setPreview(data); } catch (err) { setError(err instanceof Error ? err.message : 'Okänt fel'); } }); }; return (

Recept mot hemmavaror

{selectedRecipeId && ( Redigera recept )}
{error ?

{error}

: null}
{preview ? (

{preview.recipe.name}

{preview.recipe.description ?
{preview.recipe.description}
: null}
Ingredienser: {preview.summary.totalIngredients} Räcker: {preview.summary.enoughCount} Saknas: {preview.summary.missingCount} Enhetskonflikter: {preview.summary.unitMismatchCount} {preview.summary.canCookExactly ? 'Kan lagas exakt' : 'Kan inte lagas exakt ännu'}
{preview.summary.unitMismatchCount > 0 && (
⚠️ Enhetskonflikt! {preview.summary.unitMismatchCount} ingrediens {preview.summary.unitMismatchCount !== 1 ? 'er har' : ' har'} olika enheter än vad som finns i hemmavaror.
T.ex. receptet säger "0.5 st" men du har lagrat "1.3 kg". Du kan antingen:
  • Redigera receptet för att matcha dina enheter
  • Lagra ingrediensen med samma enhet som receptet använder
)}
{preview.ingredients.map((ingredient) => { const statusStyle = getStatusStyle(ingredient.status); return (
{ingredient.productName}
Krävs: {ingredient.requiredQuantity} {ingredient.requiredUnit}
{ingredient.note ?
Notering: {ingredient.note}
: null}
{statusStyle.label}
Tillgängligt i jämförbar enhet: {ingredient.availableQuantity}{' '} {ingredient.availableUnit || ''}
{ingredient.status === 'missing' ? (
Saknas: {ingredient.missingQuantity} {ingredient.requiredUnit}
) : null} {ingredient.status === 'unit_mismatch' ? (
Enhetsproblem: Receptet kräver {ingredient.requiredUnit} men hemmavaror lagras i andra enheter. Uppdatera receptet eller lagra ingrediensen med rätt enhet.
) : null}
{ingredient.matchingInventoryItems.length > 0 ? (
Matchande inventory {ingredient.matchingInventoryItems.map((item) => (
#{item.id}: {item.quantity} {item.unit} {item.brand ? `, ${item.brand}` : ''} {item.location ? `, ${item.location}` : ''} {item.bestBeforeDate ? `, bäst före ${formatDate(item.bestBeforeDate)}` : ''}
))}
) : null} {ingredient.otherInventoryItems && ingredient.otherInventoryItems.length > 0 ? (
Andra enheter: {ingredient.otherInventoryItems.map((item) => { const weight = isWeightUnit(item.unit); const pieces = isPieceUnit(ingredient.requiredUnit); const pieces2 = isPieceUnit(item.unit); const weight2 = isWeightUnit(ingredient.requiredUnit); return (
#{item.id}: {item.quantity} {item.unit} {item.canConvert ? ( ≈ {(item.convertedQuantity || 0).toFixed(2)} {ingredient.requiredUnit} ) : ( {weight && pieces ? ' (kan inte konvertera vikt till stycken)' : pieces2 && weight2 ? ' (kan inte konvertera stycken till vikt)' : ' (kan inte konvertera)'} )}
); })}
) : null}
); })}
) : null}
); }