| 
									
										
										
										
											2022-01-05 22:20:57 +01:00
										 |  |  | import { format } from "date-fns"; | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  | import { useAsyncKey } from "./use-utils"; | 
					
						
							| 
									
										
										
										
											2021-11-06 11:28:47 -08:00
										 |  |  | import { useUserApi } from "~/composables/api"; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  | import type { CreatePlanEntry, PlanEntryType, UpdatePlanEntry } from "~/lib/api/types/meal-plan"; | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-27 11:01:56 -09:00
										 |  |  | type PlanOption = { | 
					
						
							|  |  |  |   text: string; | 
					
						
							|  |  |  |   value: PlanEntryType; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2023-03-21 20:45:27 +01:00
										 |  |  | export function usePlanTypeOptions() { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |   const i18n = useI18n(); | 
					
						
							| 
									
										
										
										
											2022-11-27 11:01:56 -09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-21 20:45:27 +01:00
										 |  |  |   return [ | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     { text: i18n.t("meal-plan.breakfast"), value: "breakfast" }, | 
					
						
							|  |  |  |     { text: i18n.t("meal-plan.lunch"), value: "lunch" }, | 
					
						
							|  |  |  |     { text: i18n.t("meal-plan.dinner"), value: "dinner" }, | 
					
						
							|  |  |  |     { text: i18n.t("meal-plan.side"), value: "side" }, | 
					
						
							| 
									
										
										
										
											2023-03-21 20:45:27 +01:00
										 |  |  |   ] as PlanOption[]; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-21 20:45:27 +01:00
										 |  |  | export function getEntryTypeText(value: PlanEntryType) { | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |   const i18n = useI18n(); | 
					
						
							|  |  |  |   return i18n.t("meal-plan." + value); | 
					
						
							| 
									
										
										
										
											2023-03-21 20:45:27 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-01-05 22:20:57 +01:00
										 |  |  | export interface DateRange { | 
					
						
							|  |  |  |   start: Date; | 
					
						
							|  |  |  |   end: Date; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export const useMealplans = function (range: Ref<DateRange>) { | 
					
						
							| 
									
										
										
										
											2021-11-06 11:28:47 -08:00
										 |  |  |   const api = useUserApi(); | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  |   const loading = ref(false); | 
					
						
							|  |  |  |   const validForm = ref(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const actions = { | 
					
						
							|  |  |  |     getAll() { | 
					
						
							|  |  |  |       loading.value = true; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       const { data: units } = useAsyncData(useAsyncKey(), async () => { | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  |         const query = { | 
					
						
							| 
									
										
										
										
											2022-07-02 12:44:01 -05:00
										 |  |  |           start_date: format(range.value.start, "yyyy-MM-dd"), | 
					
						
							|  |  |  |           end_date: format(range.value.end, "yyyy-MM-dd"), | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  |         }; | 
					
						
							| 
									
										
										
										
											2022-07-02 12:44:01 -05:00
										 |  |  |         const { data } = await api.mealplans.getAll(1, -1, { start_date: query.start_date, end_date: query.end_date }); | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-25 14:39:38 -05:00
										 |  |  |         if (data) { | 
					
						
							|  |  |  |           return data.items; | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							| 
									
										
										
										
											2022-06-25 14:39:38 -05:00
										 |  |  |           return null; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       loading.value = false; | 
					
						
							|  |  |  |       return units; | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2025-06-20 00:09:12 +07:00
										 |  |  |     async refreshAll() { | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  |       loading.value = true; | 
					
						
							|  |  |  |       const query = { | 
					
						
							| 
									
										
										
										
											2022-07-02 12:44:01 -05:00
										 |  |  |         start_date: format(range.value.start, "yyyy-MM-dd"), | 
					
						
							|  |  |  |         end_date: format(range.value.end, "yyyy-MM-dd"), | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2022-07-02 12:44:01 -05:00
										 |  |  |       const { data } = await api.mealplans.getAll(1, -1, { start_date: query.start_date, end_date: query.end_date }); | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-25 14:39:38 -05:00
										 |  |  |       if (data && data.items) { | 
					
						
							|  |  |  |         mealplans.value = data.items; | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       loading.value = false; | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2022-05-21 21:22:02 +02:00
										 |  |  |     async createOne(payload: CreatePlanEntry) { | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  |       loading.value = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const { data } = await api.mealplans.createOne(payload); | 
					
						
							|  |  |  |       if (data) { | 
					
						
							|  |  |  |         this.refreshAll(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       loading.value = false; | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2022-05-21 21:22:02 +02:00
										 |  |  |     async updateOne(updateData: UpdatePlanEntry) { | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  |       if (!updateData.id) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       loading.value = true; | 
					
						
							|  |  |  |       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(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-21 21:22:02 +02:00
										 |  |  |     async setType(payload: UpdatePlanEntry, type: PlanEntryType) { | 
					
						
							|  |  |  |       payload.entryType = type; | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  |       await this.updateOne(payload); | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const mealplans = actions.getAll(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-05 22:20:57 +01:00
										 |  |  |   watch(range, actions.refreshAll); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-20 14:30:38 -09:00
										 |  |  |   return { mealplans, actions, validForm, loading }; | 
					
						
							| 
									
										
										
										
											2021-09-12 11:05:09 -08:00
										 |  |  | }; |