import { Signal } from "@preact/signals"; import type { Ingredient, IngredientGroup } from "@lib/recipeSchema.ts"; import { FunctionalComponent } from "preact"; function numberToString(num: number) { return (Math.floor(num * 4) / 4).toString(); } function stringToNumber(str: string) { return parseFloat(str); } const Ingredient = ( { ingredient, amount, key = "", portion = 1 }: { ingredient: Ingredient; amount: Signal; key?: string | number; portion?: number; }, ) => { const { name, quantity, unit } = ingredient; const parsedQuantity = stringToNumber(quantity); const finalAmount = (typeof parsedQuantity === "number" && amount) ? (parsedQuantity / portion) * (amount?.value || 1) : ""; return ( {numberToString(finalAmount || 0) + (typeof unit === "string" ? unit : "")} {name} ); }; export const IngredientsList: FunctionalComponent< { ingredients: (Ingredient | IngredientGroup)[]; amount: Signal; portion?: number; } > = ( { ingredients, amount, portion }, ) => { return ( {ingredients.map((item, index) => { if ("items" in item) { // Render IngredientGroup const { name, items: groupIngredients } = item as IngredientGroup; return ( <> {groupIngredients.map((item, index) => { // Render Ingredient return ( ); })} ); } else { return ( ); } })}
{name}
); };