| 
									
										
										
										
											2024-05-01 02:20:52 -05:00
										 |  |  | import { computed, reactive, ref } from "@nuxtjs/composition-api"; | 
					
						
							|  |  |  | import { useStoreActions } from "./partials/use-actions-factory"; | 
					
						
							|  |  |  | import { useUserApi } from "~/composables/api"; | 
					
						
							| 
									
										
										
										
											2024-08-22 10:14:32 -05:00
										 |  |  | import { GroupRecipeActionOut, GroupRecipeActionType } from "~/lib/api/types/household"; | 
					
						
							| 
									
										
										
										
											2024-09-14 09:59:36 -05:00
										 |  |  | import { RequestResponse } from "~/lib/api/types/non-generated"; | 
					
						
							| 
									
										
										
										
											2024-05-01 02:20:52 -05:00
										 |  |  | import { Recipe } from "~/lib/api/types/recipe"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const groupRecipeActions = ref<GroupRecipeActionOut[] | null>(null); | 
					
						
							|  |  |  | const loading = ref(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function useGroupRecipeActionData() { | 
					
						
							|  |  |  |   const data = reactive({ | 
					
						
							|  |  |  |     id: "", | 
					
						
							| 
									
										
										
										
											2024-08-22 10:14:32 -05:00
										 |  |  |     actionType: "link" as GroupRecipeActionType, | 
					
						
							| 
									
										
										
										
											2024-05-01 02:20:52 -05:00
										 |  |  |     title: "", | 
					
						
							|  |  |  |     url: "", | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function reset() { | 
					
						
							|  |  |  |     data.id = ""; | 
					
						
							|  |  |  |     data.actionType = "link"; | 
					
						
							|  |  |  |     data.title = ""; | 
					
						
							|  |  |  |     data.url = ""; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     data, | 
					
						
							|  |  |  |     reset, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export const useGroupRecipeActions = function ( | 
					
						
							|  |  |  |   orderBy: string | null = "title", | 
					
						
							|  |  |  |   orderDirection: string | null = "asc", | 
					
						
							|  |  |  | ) { | 
					
						
							|  |  |  |   const api = useUserApi(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   async function refreshGroupRecipeActions() { | 
					
						
							|  |  |  |     loading.value = true; | 
					
						
							|  |  |  |     const { data } = await api.groupRecipeActions.getAll(1, -1, { orderBy, orderDirection }); | 
					
						
							|  |  |  |     groupRecipeActions.value = data?.items || null; | 
					
						
							|  |  |  |     loading.value = false; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const recipeActions = computed<GroupRecipeActionOut[] | null>(() => { | 
					
						
							|  |  |  |     return groupRecipeActions.value; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function parseRecipeActionUrl(url: string, recipe: Recipe): string { | 
					
						
							|  |  |  |     /* eslint-disable no-template-curly-in-string */ | 
					
						
							|  |  |  |     return url | 
					
						
							|  |  |  |       .replace("${url}", window.location.href) | 
					
						
							|  |  |  |       .replace("${id}", recipe.id || "") | 
					
						
							|  |  |  |       .replace("${slug}", recipe.slug || "") | 
					
						
							|  |  |  |     /* eslint-enable no-template-curly-in-string */ | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-14 09:59:36 -05:00
										 |  |  |   async function execute(action: GroupRecipeActionOut, recipe: Recipe): Promise<void | RequestResponse<unknown>> { | 
					
						
							| 
									
										
										
										
											2024-05-01 02:20:52 -05:00
										 |  |  |     const url = parseRecipeActionUrl(action.url, recipe); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (action.actionType) { | 
					
						
							|  |  |  |       case "link": | 
					
						
							|  |  |  |         window.open(url, "_blank")?.focus(); | 
					
						
							| 
									
										
										
										
											2024-09-14 09:59:36 -05:00
										 |  |  |         return; | 
					
						
							| 
									
										
										
										
											2024-05-01 02:20:52 -05:00
										 |  |  |       case "post": | 
					
						
							| 
									
										
										
										
											2024-09-14 09:59:36 -05:00
										 |  |  |         return await api.groupRecipeActions.triggerAction(action.id, recipe.slug || ""); | 
					
						
							| 
									
										
										
										
											2024-05-01 02:20:52 -05:00
										 |  |  |       default: | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!groupRecipeActions.value && !loading.value) { | 
					
						
							|  |  |  |     refreshGroupRecipeActions(); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const actions = { | 
					
						
							|  |  |  |     ...useStoreActions<GroupRecipeActionOut>(api.groupRecipeActions, groupRecipeActions, loading), | 
					
						
							|  |  |  |     flushStore() { | 
					
						
							|  |  |  |       groupRecipeActions.value = []; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     actions, | 
					
						
							|  |  |  |     execute, | 
					
						
							|  |  |  |     recipeActions, | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }; |