frontend/app/components/notes/menu.vue

156 lines
4.9 KiB
Vue
Raw Normal View History

<script setup lang="tsx">
import {
Ban,
Code,
Delete,
ExternalLink,
2024-12-02 16:07:52 +01:00
Flag,
Hash,
Link,
Pencil,
Trash,
} from "lucide-vue-next";
import { toast } from "vue-sonner";
2025-06-26 22:39:02 +02:00
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { confirmModalService } from "~/components/modals/composable.ts";
2025-07-16 07:48:39 +02:00
import * as m from "~~/paraglide/messages.js";
import { key } from "./provider";
// biome-ignore lint/style/noNonNullAssertion: We want an error if not provided
const { note, isRemote } = inject(key)!;
const emit = defineEmits<{
edit: [];
delete: [];
}>();
const { copy } = useClipboard();
const authStore = useAuthStore();
const url = wrapUrl(`/@${note.account.acct}/${note.id}`);
const authorIsMe =
authStore.isSignedIn && note.account.id === authStore.account?.id;
const copyText = (text: string) => {
copy(text);
toast.success(m.flat_nice_worm_dream());
};
const blockUser = async (userId: string) => {
const id = toast.loading(m.top_cute_bison_nudge());
await authStore.client.blockAccount(userId);
toast.dismiss(id);
toast.success(m.main_weary_racoon_peek());
};
const _delete = async () => {
if (preferences.confirm_actions.value.includes("delete")) {
2024-12-02 22:01:04 +01:00
const confirmation = await confirmModalService.confirm({
title: m.calm_icy_weasel_twirl(),
message: m.gray_fun_toucan_slide(),
confirmText: m.royal_best_tern_transform(),
2024-12-02 22:01:04 +01:00
inputType: "none",
});
2024-12-02 22:01:04 +01:00
if (!confirmation.confirmed) {
return;
}
}
const id = toast.loading(m.new_funny_fox_boil());
await authStore.client.deleteStatus(note.id);
toast.dismiss(id);
toast.success(m.green_tasty_bumblebee_beam());
emit("delete");
};
</script>
<template>
<DropdownMenu>
<DropdownMenuTrigger as-child>
2026-01-09 21:47:12 +01:00
<slot />
</DropdownMenuTrigger>
<DropdownMenuContent class="min-w-56">
<DropdownMenuGroup>
2025-12-09 22:32:22 +01:00
<DropdownMenuItem
v-if="authorIsMe"
as="button"
@click="emit('edit')"
>
2026-01-09 21:47:12 +01:00
<Pencil />
{{ m.front_lime_grizzly_persist() }}
</DropdownMenuItem>
<DropdownMenuItem
as="button"
@click="copyText(JSON.stringify(note, null, 4))"
>
2026-01-09 21:47:12 +01:00
<Code />
{{ m.yummy_moving_scallop_sail() }}
</DropdownMenuItem>
<DropdownMenuItem as="button" @click="copyText(note.id)">
2026-01-09 21:47:12 +01:00
<Hash />
{{ m.sunny_zany_jellyfish_pop() }}
2024-12-02 16:07:52 +01:00
</DropdownMenuItem>
</DropdownMenuGroup>
2026-01-09 21:47:12 +01:00
<DropdownMenuSeparator />
2024-12-02 16:07:52 +01:00
<DropdownMenuGroup>
<DropdownMenuItem as="button" @click="copyText(url)">
2026-01-09 21:47:12 +01:00
<Link />
{{ m.ago_new_pelican_drip() }}
</DropdownMenuItem>
2025-12-09 22:32:22 +01:00
<DropdownMenuItem
as="button"
v-if="isRemote && note.url"
@click="copyText(note.url)"
2025-12-09 22:32:22 +01:00
>
2026-01-09 21:47:12 +01:00
<Link />
{{ m.solid_witty_zebra_walk() }}
</DropdownMenuItem>
2025-12-09 22:32:22 +01:00
<DropdownMenuItem
as="a"
v-if="isRemote"
target="_blank"
rel="noopener noreferrer"
:href="note.url"
2025-12-09 22:32:22 +01:00
>
2026-01-09 21:47:12 +01:00
<ExternalLink />
{{ m.active_trite_lark_inspire() }}
</DropdownMenuItem>
</DropdownMenuGroup>
2026-01-09 21:47:12 +01:00
<DropdownMenuSeparator v-if="authorIsMe" />
<DropdownMenuGroup v-if="authorIsMe">
<DropdownMenuItem as="button" :disabled="true">
2026-01-09 21:47:12 +01:00
<Delete />
{{ m.real_green_clownfish_pet() }}
</DropdownMenuItem>
<DropdownMenuItem as="button" @click="_delete">
2026-01-09 21:47:12 +01:00
<Trash />
{{ m.tense_quick_cod_favor() }}
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator v-if="authorIsMe" />
<DropdownMenuGroup v-if="authorIsMe">
<DropdownMenuItem as="button" :disabled="true">
2026-01-09 21:47:12 +01:00
<Flag />
{{ m.great_few_jaguar_rise() }}
</DropdownMenuItem>
<DropdownMenuItem
as="button"
@click="blockUser(note.account.id)"
>
2026-01-09 21:47:12 +01:00
<Ban />
{{ m.misty_soft_sparrow_vent() }}
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</template>