mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-11-03 18:53:17 -05:00 
			
		
		
		
	Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com> Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
		
			
				
	
	
		
			94 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { useStoreActions } from "./partials/use-actions-factory";
 | 
						|
import { useUserApi } from "~/composables/api";
 | 
						|
import { useScaledAmount } from "~/composables/recipes/use-scaled-amount";
 | 
						|
import type { GroupRecipeActionOut, GroupRecipeActionType } from "~/lib/api/types/household";
 | 
						|
import type { RequestResponse } from "~/lib/api/types/non-generated";
 | 
						|
import type { Recipe } from "~/lib/api/types/recipe";
 | 
						|
 | 
						|
const groupRecipeActions = ref<GroupRecipeActionOut[] | null>(null);
 | 
						|
const loading = ref(false);
 | 
						|
 | 
						|
export function useGroupRecipeActionData() {
 | 
						|
  const data = reactive({
 | 
						|
    id: "",
 | 
						|
    actionType: "link" as GroupRecipeActionType,
 | 
						|
    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, recipeScale: number): string {
 | 
						|
    const recipeServings = (recipe.recipeServings || 1) * recipeScale;
 | 
						|
    const recipeYieldQuantity = (recipe.recipeYieldQuantity || 1) * recipeScale;
 | 
						|
 | 
						|
    return url
 | 
						|
      .replace("${url}", window.location.href)
 | 
						|
      .replace("${id}", recipe.id || "")
 | 
						|
      .replace("${slug}", recipe.slug || "")
 | 
						|
      .replace("${servings}", recipeServings.toString())
 | 
						|
      .replace("${yieldQuantity}", recipeYieldQuantity.toString())
 | 
						|
      .replace("${yieldText}", recipe.recipeYield || "");
 | 
						|
  };
 | 
						|
 | 
						|
  // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
 | 
						|
  async function execute(action: GroupRecipeActionOut, recipe: Recipe, recipeScale: number): Promise<void | RequestResponse<unknown>> {
 | 
						|
    const url = parseRecipeActionUrl(action.url, recipe, recipeScale);
 | 
						|
 | 
						|
    switch (action.actionType) {
 | 
						|
      case "link":
 | 
						|
        window.open(url, "_blank")?.focus();
 | 
						|
        return;
 | 
						|
      case "post":
 | 
						|
        return await api.groupRecipeActions.triggerAction(action.id, recipe.slug || "", useScaledAmount(recipe.recipeServings || 1, recipeScale).scaledAmount);
 | 
						|
      default:
 | 
						|
        break;
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  if (!groupRecipeActions.value && !loading.value) {
 | 
						|
    refreshGroupRecipeActions();
 | 
						|
  };
 | 
						|
 | 
						|
  const actions = {
 | 
						|
    ...useStoreActions<GroupRecipeActionOut>(api.groupRecipeActions, groupRecipeActions, loading),
 | 
						|
    flushStore() {
 | 
						|
      groupRecipeActions.value = [];
 | 
						|
    },
 | 
						|
  };
 | 
						|
 | 
						|
  return {
 | 
						|
    actions,
 | 
						|
    execute,
 | 
						|
    recipeActions,
 | 
						|
  };
 | 
						|
};
 |