'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; import { fetchJson } from '../../../lib/api'; import { parseErrorResponse } from '../../../lib/error-handler'; import type { Product } from '../../../features/inventory/types'; import Navigation from '../../Navigation'; const MARKDOWN_HELP = ` **Fetstil:** **text** eller __text__ *Kursiv:* *text* eller _text_ • Punktlista: - punkt eller * punkt # Rubrik 1 ## Rubrik 2 ### Rubrik 3 `; function SimpleMarkdownPreview({ text }: { text: string }) { const lines = text.split('\n'); return (
{lines.map((line, i) => { if (line.startsWith('# ')) { return

{line.slice(2)}

; } if (line.startsWith('## ')) { return

{line.slice(3)}

; } if (line.startsWith('- ') || line.startsWith('* ')) { return
• {line.slice(2)}
; } if (line.trim() === '') { return
; } return
{line}
; })}
); } export default function CreateRecipePage() { const router = useRouter(); const [recipe, setRecipe] = useState({ name: '', description: '', instructions: '', ingredients: [{ productId: 0, quantity: '', unit: '', note: '', location: '' }], }); const [products, setProducts] = useState([]); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const [showPreview, setShowPreview] = useState(false); const [showMarkdownHelp, setShowMarkdownHelp] = useState(false); useEffect(() => { fetchJson('/api/products') .then(setProducts) .catch(console.error); }, []); const handleIngredientChange = (index: number, field: string, value: string | number) => { const newIngredients = [...recipe.ingredients]; newIngredients[index] = { ...newIngredients[index], [field]: value }; setRecipe({ ...recipe, ingredients: newIngredients }); }; const addIngredient = () => { setRecipe({ ...recipe, ingredients: [...recipe.ingredients, { productId: 0, quantity: '', unit: '', note: '', location: '' }], }); }; const removeIngredient = (index: number) => { const newIngredients = [...recipe.ingredients]; newIngredients.splice(index, 1); setRecipe({ ...recipe, ingredients: newIngredients }); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); setError(null); // Konvertera quantity till number för varje ingrediens const recipeToSend = { ...recipe, ingredients: recipe.ingredients.map(({ location: _loc, ...ing }) => ({ ...ing, quantity: Number(ing.quantity), })), }; try { const response = await fetch('/api/recipes', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(recipeToSend), }); if (!response.ok) { const errorMessage = await parseErrorResponse(response); throw new Error(errorMessage); } router.push('/recipes'); } catch (err) { const message = err instanceof Error ? err.message : 'Ett okänt fel inträffade. Försök igen.'; setError(message); } finally { setIsLoading(false); } }; const UNIT_OPTIONS = [ { value: '', label: 'Välj enhet' }, { value: 'g', label: 'g (gram)' }, { value: 'kg', label: 'kg (kilogram)' }, { value: 'hg', label: 'hg (hektogram)' }, { value: 'ml', label: 'ml (milliliter)' }, { value: 'dl', label: 'dl (deciliter)' }, { value: 'l', label: 'l (liter)' }, { value: 'st', label: 'st (styck)' }, { value: 'tsk', label: 'tsk (tesked)' }, { value: 'msk', label: 'msk (matsked)' }, { value: 'krm', label: 'krm (kryddmått)' }, { value: 'port', label: 'port (portioner)' }, { value: 'efter smak', label: 'Efter smak' }, { value: 'förp', label: 'förp (förpackning)' }, { value: 'klyfta', label: 'klyfta' }, ]; const LOCATION_OPTIONS = [ { value: '', label: 'Välj plats' }, { value: 'Kyl', label: 'Kyl' }, { value: 'Frys', label: 'Frys' }, { value: 'Skafferi', label: 'Skafferi' }, { value: 'Annat', label: 'Annat' }, ]; return (

Lägg till nytt recept

Importera från Markdown
{error &&

{error}

}
{/* Receptdetaljer */}

Receptdetaljer

setRecipe({ ...recipe, name: e.target.value })} required style={{ width: '100%', padding: '0.75rem', border: '1px solid #ddd', borderRadius: '4px', fontSize: '1rem', minHeight: '44px', boxSizing: 'border-box', }} />