import { useAsync, ref, Ref, watch } from "@nuxtjs/composition-api"; import { format } from "date-fns"; import { useAsyncKey } from "./use-utils"; import { useUserApi } from "~/composables/api"; import { CreateMealPlan, UpdateMealPlan } from "~/api/class-interfaces/group-mealplan"; export type MealType = "breakfast" | "lunch" | "dinner" | "side"; export const planTypeOptions = [ { text: "Breakfast", value: "breakfast" }, { text: "Lunch", value: "lunch" }, { text: "Dinner", value: "dinner" }, { text: "Side", value: "side" }, ]; export interface DateRange { start: Date; end: Date; } export const useMealplans = function (range: Ref) { const api = useUserApi(); const loading = ref(false); const validForm = ref(true); const actions = { getAll() { loading.value = true; const units = useAsync(async () => { const query = { start: format(range.value.start, "yyyy-MM-dd"), limit: format(range.value.end, "yyyy-MM-dd"), }; // @ts-ignore TODO Modify typing to allow for string start+limit for mealplans const { data } = await api.mealplans.getAll(query.start, query.limit); return data; }, useAsyncKey()); loading.value = false; return units; }, async refreshAll(this: void) { loading.value = true; const query = { start: format(range.value.start, "yyyy-MM-dd"), limit: format(range.value.end, "yyyy-MM-dd"), }; // @ts-ignore TODO Modify typing to allow for string start+limit for mealplans const { data } = await api.mealplans.getAll(query.start, query.limit); if (data) { mealplans.value = data; } loading.value = false; }, async createOne(payload: CreateMealPlan) { loading.value = true; const { data } = await api.mealplans.createOne(payload); if (data) { this.refreshAll(); } loading.value = false; }, async updateOne(updateData: UpdateMealPlan) { if (!updateData.id) { return; } loading.value = true; // @ts-ignore TODO Modify mealpan types to be from auto-generated files const { data } = await api.mealplans.updateOne(updateData.id, updateData); if (data) { this.refreshAll(); } loading.value = false; }, async deleteOne(id: string | number) { loading.value = true; const { data } = await api.mealplans.deleteOne(id); if (data) { this.refreshAll(); } }, async setType(payload: UpdateMealPlan, typ: MealType) { payload.entryType = typ; await this.updateOne(payload); }, }; const mealplans = actions.getAll(); watch(range, actions.refreshAll); return { mealplans, actions, validForm, loading }; };