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] }),
|
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).
|
// Lägg de saknade ingredienserna på inköpslistan (skapar en lista om ingen finns).
|
||||||
const addMissing = useMutation({
|
const addMissing = useMutation({
|
||||||
mutationFn: async (missing: NonNullable<RecipeDetail["coverage"]>["missing"]) => {
|
mutationFn: async (missing: NonNullable<RecipeDetail["coverage"]>["missing"]) => {
|
||||||
@@ -352,6 +375,23 @@ export default function RecipeScreen() {
|
|||||||
</Small>
|
</Small>
|
||||||
)}
|
)}
|
||||||
</Card>
|
</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 />
|
<Spacer />
|
||||||
</Screen>
|
</Screen>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user