fix(recept): bakverk ur mellanmal + sub-kategorier, bladdra pa forstasidan, relevantare forslag

Kategorisering (din notis - bakverk hor till Baka, inte mellanmal):
- Sub-typer bread/bun/pie/cake/cookie i RECIPE_TAGS.
- Bullar/kakor/pajer/chokladbollar -> dessert (inte snack) + sub-tagg; brod
  -> breakfast. Befintliga lussekatter/saffransbullar taggas 'bun'.
- Browse: sub-chips under Baka (Brod/Bullar/Paj/Tartor & kakor/Smakakor).

Bladdra pa forstasidan (din onskan):
- Kategori-genvagar pa 'Vad ska vi ata' -> oppnar bladdraren forvald
  (/recipes?cat=). recipes.tsx laser ?cat=.

Relevantare 'Vad ska vi ata' (snurrar samma triviala):
- view=pantry -> view=default (tackning vager tungt men inte allenaradande,
  ger variation), limit 15 -> 30 (storre pool sa 'Visa fler' upprepar senare).

Felsokning inkopslista:
- Tydligare felmeddelande (HTTP-status vs natverksfel) sa root cause syns.

Full typecheck 20/20, invariant-test gront.
This commit is contained in:
Claude
2026-08-19 00:20:30 +00:00
parent 654174e188
commit 242e09d59b
6 changed files with 129 additions and 29 deletions
+15 -4
View File
@@ -2,7 +2,7 @@ import { useState } from "react";
import { Alert, Pressable, View } from "react-native";
import { router, useLocalSearchParams } from "expo-router";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { api } from "@/lib/api";
import { api, ApiError } from "@/lib/api";
import { t } from "@/lib/i18n";
import { formatMinor } from "@/lib/money";
import {
@@ -162,8 +162,16 @@ export default function RecipeScreen() {
`${count} ${count === 1 ? "vara" : "varor"} lades till.`,
);
},
onError: (err) =>
Alert.alert(t("common.oops"), err instanceof Error ? err.message : t("common.error")),
onError: (err) => {
// Visa tydlig diagnostik: HTTP-status vs nätverksfel (hjälper felsökning).
const detail =
err instanceof ApiError
? `[${err.status}] ${err.message}`
: err instanceof Error
? err.message
: t("common.error");
Alert.alert(t("common.oops"), detail);
},
});
if (query.isLoading) return <LoadingView />;
@@ -269,7 +277,10 @@ export default function RecipeScreen() {
</Row>
</Row>
{ingredients.map((ing) => (
<Row key={ing.id ?? (ing.displayName ?? ing.displayNameSv)} style={{ justifyContent: "space-between" }}>
<Row
key={ing.id ?? ing.displayName ?? ing.displayNameSv}
style={{ justifyContent: "space-between" }}
>
<Body>
{ing.displayName ?? ing.displayNameSv}
{ing.optional ? " (valfritt)" : ""}