| 
									
										
										
										
											2021-08-31 14:39:02 -08:00
										 |  |  | import { useAsync, ref, reactive, Ref } from "@nuxtjs/composition-api"; | 
					
						
							|  |  |  | import { useAsyncKey } from "./use-utils"; | 
					
						
							|  |  |  | import { useApiSingleton } from "~/composables/use-api"; | 
					
						
							|  |  |  | import { CookBook } from "~/api/class-interfaces/cookbooks"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let cookbookStore: Ref<CookBook[] | null> | null = null; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-31 18:51:34 -08:00
										 |  |  | export const useCookbook = function () { | 
					
						
							|  |  |  |   function getOne(id: string | number) { | 
					
						
							|  |  |  |     const api = useApiSingleton(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const units = useAsync(async () => { | 
					
						
							|  |  |  |       const { data } = await api.cookbooks.getOne(id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return data; | 
					
						
							|  |  |  |     }, useAsyncKey()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return units; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { getOne }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-31 14:39:02 -08:00
										 |  |  | export const useCookbooks = function () { | 
					
						
							|  |  |  |   const api = useApiSingleton(); | 
					
						
							|  |  |  |   const loading = ref(false); | 
					
						
							|  |  |  |   const deleteTargetId = ref(0); | 
					
						
							|  |  |  |   const validForm = ref(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //  @ts-ignore
 | 
					
						
							|  |  |  |   const workingCookbookData: CookBook = reactive({ | 
					
						
							|  |  |  |     id: 0, | 
					
						
							|  |  |  |     name: "", | 
					
						
							|  |  |  |     position: 1, | 
					
						
							|  |  |  |     categories: [], | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const actions = { | 
					
						
							|  |  |  |     getAll() { | 
					
						
							|  |  |  |       loading.value = true; | 
					
						
							|  |  |  |       const units = useAsync(async () => { | 
					
						
							|  |  |  |         const { data } = await api.cookbooks.getAll(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return data; | 
					
						
							|  |  |  |       }, useAsyncKey()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       loading.value = false; | 
					
						
							|  |  |  |       return units; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     async refreshAll() { | 
					
						
							|  |  |  |       loading.value = true; | 
					
						
							|  |  |  |       const { data } = await api.cookbooks.getAll(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (data && cookbookStore) { | 
					
						
							|  |  |  |         cookbookStore.value = data; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       loading.value = false; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     async createOne() { | 
					
						
							|  |  |  |       loading.value = true; | 
					
						
							|  |  |  |       const { data } = await api.cookbooks.createOne({ | 
					
						
							|  |  |  |         // @ts-ignore. I"m thinking this will always be defined.
 | 
					
						
							| 
									
										
										
										
											2021-08-31 18:51:34 -08:00
										 |  |  |         name: "Cookbook " + String(cookbookStore?.value?.length + 1 || 1), | 
					
						
							| 
									
										
										
										
											2021-08-31 14:39:02 -08:00
										 |  |  |       }); | 
					
						
							|  |  |  |       if (data && cookbookStore?.value) { | 
					
						
							| 
									
										
										
										
											2021-08-31 18:51:34 -08:00
										 |  |  |         cookbookStore.value.push(data); | 
					
						
							| 
									
										
										
										
											2021-08-31 14:39:02 -08:00
										 |  |  |       } else { | 
					
						
							|  |  |  |         this.refreshAll(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       this.resetWorking(); | 
					
						
							|  |  |  |       loading.value = false; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     async updateOne(updateData: CookBook) { | 
					
						
							|  |  |  |       if (!updateData.id) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       loading.value = true; | 
					
						
							|  |  |  |       const { data } = await api.cookbooks.updateOne(updateData.id, updateData); | 
					
						
							|  |  |  |       if (data && cookbookStore?.value) { | 
					
						
							|  |  |  |         this.refreshAll(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       loading.value = false; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async updateOrder() { | 
					
						
							|  |  |  |       if (!cookbookStore?.value) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       loading.value = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       cookbookStore.value.forEach((element, index) => { | 
					
						
							|  |  |  |         element.position = index + 1; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const { data } = await api.cookbooks.updateAll(cookbookStore.value); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (data && cookbookStore?.value) { | 
					
						
							|  |  |  |         this.refreshAll(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       loading.value = true; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     async deleteOne(id: string | number) { | 
					
						
							|  |  |  |       loading.value = true; | 
					
						
							|  |  |  |       const { data } = await api.cookbooks.deleteOne(id); | 
					
						
							|  |  |  |       if (data && cookbookStore?.value) { | 
					
						
							|  |  |  |         this.refreshAll(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     resetWorking() { | 
					
						
							|  |  |  |       workingCookbookData.id = 0; | 
					
						
							|  |  |  |       workingCookbookData.name = ""; | 
					
						
							|  |  |  |       workingCookbookData.position = 0; | 
					
						
							|  |  |  |       workingCookbookData.categories = []; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     setWorking(item: CookBook) { | 
					
						
							|  |  |  |       workingCookbookData.id = item.id; | 
					
						
							|  |  |  |       workingCookbookData.name = item.name; | 
					
						
							|  |  |  |       workingCookbookData.position = item.position; | 
					
						
							|  |  |  |       workingCookbookData.categories = item.categories; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     flushStore() { | 
					
						
							|  |  |  |       cookbookStore = null; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!cookbookStore) { | 
					
						
							|  |  |  |     cookbookStore = actions.getAll(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { cookbooks: cookbookStore, workingCookbookData, deleteTargetId, actions, validForm }; | 
					
						
							|  |  |  | }; |