mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-04-11 15:35:36 -04:00
chore: Nuxt 4 upgrade (#7426)
This commit is contained in:
98
frontend/app/composables/use-group-recipe-actions.ts
Normal file
98
frontend/app/composables/use-group-recipe-actions.ts
Normal file
@@ -0,0 +1,98 @@
|
||||
import { useStoreActions } from "./partials/use-actions-factory";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
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 || "", recipeScale);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
if (!groupRecipeActions.value && !loading.value) {
|
||||
refreshGroupRecipeActions();
|
||||
};
|
||||
|
||||
const actions = {
|
||||
...useStoreActions<GroupRecipeActionOut>(
|
||||
"group-recipe-actions",
|
||||
api.groupRecipeActions,
|
||||
groupRecipeActions,
|
||||
loading,
|
||||
{ orderBy: orderBy },
|
||||
),
|
||||
flushStore() {
|
||||
groupRecipeActions.value = [];
|
||||
},
|
||||
};
|
||||
|
||||
return {
|
||||
actions,
|
||||
execute,
|
||||
recipeActions,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user