Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Option to automatically create share links for recipes in recipe actions #4676

Open
wants to merge 1 commit into
base: mealie-next
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 35 additions & 3 deletions frontend/composables/use-group-recipe-actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ export const useGroupRecipeActions = function (
orderDirection: string | null = "asc",
) {
const api = useUserApi();

async function refreshGroupRecipeActions() {
loading.value = true;
const { data } = await api.groupRecipeActions.getAll(1, -1, { orderBy, orderDirection });
Expand All @@ -46,8 +45,40 @@ export const useGroupRecipeActions = function (
return groupRecipeActions.value;
});

function parseRecipeActionUrl(url: string, recipe: Recipe): string {
function getTokenLink(token: string, groupSlug: string) {
return `${window.location.origin}/g/${groupSlug}/shared/r/${token}`;
}

async function parseRecipeActionUrl(url: string, recipe: Recipe): Promise<string> {
/* eslint-disable no-template-curly-in-string */
const shareLinkRegex = /\$\{share-link-expires-seconds-[0-9]+\}/g;
const group = (await api.groups.getOne(recipe.groupId || "")).data;


const shareLinkStringMatches = url.matchAll(shareLinkRegex);
if (shareLinkStringMatches) {
const shareLinkSet = new Set<string>();
for (const match of shareLinkStringMatches) {
shareLinkSet.add(match[0]);
}
const shareLinkStrings = Array.from(shareLinkSet.values());

for (let i = 0; i < shareLinkStrings.length; i++) {
const shareLinkString = shareLinkStrings[i];
const seconds = parseInt(shareLinkString.split("-")[4]);
const expires = new Date();
expires.setSeconds(expires.getSeconds() + seconds);

const shareLink = await api.recipes.share.createOne({
recipeId: recipe.id || "",
expiresAt: expires.toISOString(),
});

const groupSlug = group?.slug || "";
url = url.replace(shareLinkString, getTokenLink(shareLink.data?.id || "", groupSlug));
}
}

return url
.replace("${url}", window.location.href)
.replace("${id}", recipe.id || "")
Expand All @@ -56,10 +87,11 @@ export const useGroupRecipeActions = function (
};

async function execute(action: GroupRecipeActionOut, recipe: Recipe): Promise<void | RequestResponse<unknown>> {
const url = parseRecipeActionUrl(action.url, recipe);
const url = await parseRecipeActionUrl(action.url, recipe);

switch (action.actionType) {
case "link":

window.open(url, "_blank")?.focus();
return;
case "post":
Expand Down
Loading