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:
@@ -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>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user