frontend/app/components/profiles/profile-actions.vue

142 lines
4.6 KiB
Vue
Raw Normal View History

2024-12-02 16:07:52 +01:00
<template>
<DropdownMenu>
<DropdownMenuTrigger as-child>
2026-01-09 21:47:12 +01:00
<slot />
2024-12-02 16:07:52 +01:00
</DropdownMenuTrigger>
<DropdownMenuContent class="min-w-56">
2024-12-02 16:07:52 +01:00
<DropdownMenuGroup>
2025-12-09 22:32:22 +01:00
<DropdownMenuItem
as="button"
@click="copyText(account.username)"
>
2026-01-09 21:47:12 +01:00
<AtSign />
{{ m.cool_dark_tapir_belong() }}
2024-12-02 16:07:52 +01:00
</DropdownMenuItem>
2025-12-09 22:32:22 +01:00
<DropdownMenuItem
as="button"
@click="copyText(JSON.stringify(account, null, 4))"
>
2026-01-09 21:47:12 +01:00
<Code />
{{ m.yummy_moving_scallop_sail() }}
2024-12-02 16:07:52 +01:00
</DropdownMenuItem>
<DropdownMenuItem as="button" @click="copyText(account.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() }}
2024-12-02 16:07:52 +01:00
</DropdownMenuItem>
<DropdownMenuItem as="button" @click="copyText(account.url)">
2026-01-09 21:47:12 +01:00
<Link />
{{ m.solid_witty_zebra_walk() }}
2024-12-02 16:07:52 +01:00
</DropdownMenuItem>
2025-12-09 22:32:22 +01:00
<DropdownMenuItem
as="a"
v-if="isRemote"
target="_blank"
rel="noopener noreferrer"
:href="account.url"
>
2026-01-09 21:47:12 +01:00
<ExternalLink />
{{ m.active_trite_lark_inspire() }}
2024-12-02 16:07:52 +01:00
</DropdownMenuItem>
</DropdownMenuGroup>
2026-01-09 21:47:12 +01:00
<DropdownMenuSeparator v-if="authStore.isSignedIn && !isMe" />
<DropdownMenuGroup v-if="authStore.isSignedIn && !isMe">
2024-12-02 16:07:52 +01:00
<DropdownMenuItem as="button" @click="muteUser(account.id)">
2026-01-09 21:47:12 +01:00
<VolumeX />
{{ m.spare_wild_mole_intend() }}
2024-12-02 16:07:52 +01:00
</DropdownMenuItem>
<DropdownMenuItem as="button" @click="blockUser(account.id)">
2026-01-09 21:47:12 +01:00
<Ban />
{{ m.misty_soft_sparrow_vent() }}
2024-12-02 16:07:52 +01:00
</DropdownMenuItem>
</DropdownMenuGroup>
2026-01-09 21:47:12 +01:00
<DropdownMenuSeparator v-if="isRemote" />
2024-12-02 16:07:52 +01:00
<DropdownMenuGroup v-if="isRemote">
<DropdownMenuItem as="button" @click="refresh">
2026-01-09 21:47:12 +01:00
<RefreshCw />
{{ m.slow_chunky_chipmunk_hush() }}
2024-12-02 16:07:52 +01:00
</DropdownMenuItem>
</DropdownMenuGroup>
2026-01-09 21:47:12 +01:00
<DropdownMenuSeparator v-if="authStore.isSignedIn && !isMe" />
<DropdownMenuGroup v-if="authStore.isSignedIn && !isMe">
2024-12-02 16:07:52 +01:00
<DropdownMenuItem as="button" :disabled="true">
2026-01-09 21:47:12 +01:00
<Flag />
{{ m.great_few_jaguar_rise() }}
2024-12-02 16:07:52 +01:00
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</template>
<script lang="ts" setup>
import type { Account } from "@versia/client/schemas";
2024-12-02 16:07:52 +01:00
import {
AtSign,
Ban,
Code,
ExternalLink,
Flag,
Hash,
Link,
RefreshCw,
VolumeX,
} from "lucide-vue-next";
import { toast } from "vue-sonner";
import type { z } from "zod";
2025-06-26 22:39:02 +02:00
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
2025-07-16 07:48:39 +02:00
import * as m from "~~/paraglide/messages.js";
2024-12-02 16:07:52 +01:00
const { account } = defineProps<{
account: z.infer<typeof Account>;
2024-12-02 16:07:52 +01:00
}>();
const authStore = useAuthStore();
const isMe = authStore.account?.id === account.id;
2024-12-02 16:07:52 +01:00
const { copy } = useClipboard();
const copyText = (text: string) => {
copy(text);
toast.success(m.flat_nice_worm_dream());
2024-12-02 16:07:52 +01:00
};
const url = wrapUrl(`/@${account.acct}`);
const isRemote = account.acct.includes("@");
const muteUser = async (userId: string) => {
const id = toast.loading(m.ornate_tidy_coyote_grow());
await authStore.client.muteAccount(userId);
2024-12-02 16:07:52 +01:00
toast.dismiss(id);
toast.success("User muted");
};
const blockUser = async (userId: string) => {
const id = toast.loading(m.empty_smug_raven_bloom());
await authStore.client.blockAccount(userId);
2024-12-02 16:07:52 +01:00
toast.dismiss(id);
toast.success("User blocked");
};
const refresh = async () => {
const id = toast.loading(m.real_every_macaw_wish());
await authStore.client.refetchAccount(account.id);
2024-12-02 16:07:52 +01:00
toast.dismiss(id);
toast.success(m.many_cool_fox_love());
2024-12-02 16:07:52 +01:00
};
</script>