feat(recept): 'Har du lagat denna?' - logga + rakna av lager

Ny ruta langst ner pa receptet: registrera att man lagat ratten sa
r:knas ravarorna av fran lagret och maltiden loggas (aven utan kalender).
Saknade ravaror hoppas over utan krasch (befintlig /cook-endpoint).
This commit is contained in:
Claude
2026-08-19 23:33:32 +00:00
parent 3f0f6953bb
commit c6c82ea520
+40
View File
@@ -128,6 +128,29 @@ export default function RecipeScreen() {
onSettled: () => void queryClient.invalidateQueries({ queryKey: ["recipe", id] }),
});
// "Har du lagat denna?" snabbregistrering utan matlagningsläget: loggar
// måltiden och räknar av råvarorna från lagret. Saknade råvaror ignoreras
// (servern hoppar över dem, ingen krasch).
const logCooked = useMutation({
mutationFn: () => {
const hour = new Date().getHours();
const mealType = hour < 10 ? "breakfast" : hour < 15 ? "lunch" : "dinner";
return api(`/v1/recipes/${id}/cook`, {
method: "POST",
body: { portionsCooked: shownPortions, deductInventory: true, mealType },
});
},
onSuccess: () => {
void queryClient.invalidateQueries({ queryKey: ["inventory"] });
void queryClient.invalidateQueries({ queryKey: ["what-to-eat"] });
void queryClient.invalidateQueries({ queryKey: ["day"] });
void queryClient.invalidateQueries({ queryKey: ["recipe", id] });
Alert.alert(t("cookedLog.doneTitle"), t("cookedLog.doneBody"));
},
onError: (e) =>
Alert.alert(t("common.oops"), e instanceof ApiError ? e.message : t("common.error")),
});
// Lägg de saknade ingredienserna på inköpslistan (skapar en lista om ingen finns).
const addMissing = useMutation({
mutationFn: async (missing: NonNullable<RecipeDetail["coverage"]>["missing"]) => {
@@ -352,6 +375,23 @@ export default function RecipeScreen() {
</Small>
)}
</Card>
{/* "Har du lagat denna?" logga + räkna av lager, även utan kalender. */}
<Card>
<Heading>{t("cookedLog.title")}</Heading>
<Small>{t("cookedLog.subtitle")}</Small>
<Spacer size={spacing.sm} />
<Button
label={t("cookedLog.button")}
loading={logCooked.isPending}
onPress={() =>
Alert.alert(t("cookedLog.title"), t("cookedLog.confirm", { count: shownPortions }), [
{ text: t("common.cancel"), style: "cancel" },
{ text: t("cookedLog.button"), onPress: () => logCooked.mutate() },
])
}
/>
</Card>
<Spacer />
</Screen>
);