2024-12-04 15:04:08 +01:00
|
|
|
<template>
|
2024-12-07 11:13:59 +01:00
|
|
|
<DropdownMenu>
|
|
|
|
|
<Card
|
|
|
|
|
:class="cn('grid hover:cursor-pointer gap-4 items-center p-4', canEdit ? 'grid-cols-[auto,1fr,auto]' : 'grid-cols-[auto,1fr]')">
|
|
|
|
|
<Avatar shape="square">
|
|
|
|
|
<AvatarImage :src="emoji.url" />
|
|
|
|
|
</Avatar>
|
|
|
|
|
<CardHeader class="p-0 gap-0 overflow-hidden">
|
|
|
|
|
<CardTitle as="span" class="text-sm font-mono truncate">
|
|
|
|
|
{{ emoji.shortcode }}
|
|
|
|
|
</CardTitle>
|
|
|
|
|
<CardDescription>
|
2024-12-07 22:17:22 +01:00
|
|
|
{{ emoji.global ? m.real_tame_moose_greet() : m.witty_heroic_trout_cry() }}
|
2024-12-07 11:13:59 +01:00
|
|
|
</CardDescription>
|
|
|
|
|
</CardHeader>
|
|
|
|
|
<CardFooter class="p-0" v-if="canEdit">
|
|
|
|
|
<DropdownMenuTrigger :as-child="true">
|
|
|
|
|
<Button variant="ghost" size="icon">
|
|
|
|
|
<Ellipsis />
|
|
|
|
|
</Button>
|
|
|
|
|
</DropdownMenuTrigger>
|
|
|
|
|
</CardFooter>
|
|
|
|
|
</Card>
|
|
|
|
|
<DropdownMenuContent class="min-w-48">
|
|
|
|
|
<DropdownMenuLabel class="font-mono">{{ emoji.shortcode }}</DropdownMenuLabel>
|
|
|
|
|
<DropdownMenuSeparator />
|
|
|
|
|
|
|
|
|
|
<DropdownMenuItem @click="editName">
|
|
|
|
|
<TextCursorInput class="mr-2 h-4 w-4" />
|
2024-12-07 20:24:09 +01:00
|
|
|
{{ m.cuddly_such_swallow_hush() }}
|
2024-12-07 11:13:59 +01:00
|
|
|
</DropdownMenuItem>
|
|
|
|
|
<!-- <DropdownMenuItem @click="editCaption">
|
|
|
|
|
<Captions class="mr-2 h-4 w-4" />
|
|
|
|
|
<span>Add caption</span>
|
|
|
|
|
</DropdownMenuItem>
|
|
|
|
|
<DropdownMenuSeparator /> -->
|
|
|
|
|
<DropdownMenuItem @click="_delete">
|
|
|
|
|
<Delete class="mr-2 h-4 w-4" />
|
2024-12-07 20:24:09 +01:00
|
|
|
{{ m.tense_quick_cod_favor() }}
|
2024-12-07 11:13:59 +01:00
|
|
|
</DropdownMenuItem>
|
|
|
|
|
</DropdownMenuContent>
|
|
|
|
|
</DropdownMenu>
|
2024-12-04 15:04:08 +01:00
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
2024-12-07 11:13:59 +01:00
|
|
|
import { cn } from "@/lib/utils";
|
|
|
|
|
import { type Emoji, RolePermission } from "@versia/client/types";
|
|
|
|
|
import { Delete, Ellipsis, TextCursorInput } from "lucide-vue-next";
|
|
|
|
|
import { toast } from "vue-sonner";
|
|
|
|
|
import { confirmModalService } from "~/components/modals/composable";
|
2024-12-04 15:04:08 +01:00
|
|
|
import { Avatar } from "~/components/ui/avatar";
|
2024-12-07 11:13:59 +01:00
|
|
|
import { Button } from "~/components/ui/button";
|
|
|
|
|
import {
|
|
|
|
|
Card,
|
|
|
|
|
CardDescription,
|
|
|
|
|
CardFooter,
|
|
|
|
|
CardTitle,
|
|
|
|
|
} from "~/components/ui/card";
|
|
|
|
|
import {
|
|
|
|
|
DropdownMenu,
|
|
|
|
|
DropdownMenuContent,
|
|
|
|
|
DropdownMenuItem,
|
|
|
|
|
DropdownMenuLabel,
|
|
|
|
|
DropdownMenuSeparator,
|
|
|
|
|
DropdownMenuTrigger,
|
|
|
|
|
} from "~/components/ui/dropdown-menu";
|
2024-12-07 20:24:09 +01:00
|
|
|
import * as m from "~/paraglide/messages.js";
|
2024-12-04 15:04:08 +01:00
|
|
|
|
2024-12-07 11:13:59 +01:00
|
|
|
const { emoji } = defineProps<{
|
2024-12-04 15:04:08 +01:00
|
|
|
emoji: Emoji;
|
|
|
|
|
}>();
|
2024-12-07 11:13:59 +01:00
|
|
|
|
|
|
|
|
const permissions = usePermissions();
|
|
|
|
|
const canEdit =
|
2024-12-09 13:12:46 +01:00
|
|
|
(!emoji.global &&
|
|
|
|
|
permissions.value.includes(RolePermission.ManageOwnEmojis)) ||
|
|
|
|
|
permissions.value.includes(RolePermission.ManageEmojis);
|
2024-12-07 11:13:59 +01:00
|
|
|
|
|
|
|
|
const editName = async () => {
|
2024-12-09 13:12:46 +01:00
|
|
|
if (!identity.value) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-07 11:13:59 +01:00
|
|
|
const result = await confirmModalService.confirm({
|
2024-12-07 20:24:09 +01:00
|
|
|
title: m.slimy_awful_florian_sail(),
|
2024-12-07 11:13:59 +01:00
|
|
|
defaultValue: emoji.shortcode,
|
2024-12-07 20:24:09 +01:00
|
|
|
confirmText: m.teary_antsy_panda_aid(),
|
2024-12-07 11:13:59 +01:00
|
|
|
inputType: "text",
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (result.confirmed) {
|
2024-12-07 20:24:09 +01:00
|
|
|
const id = toast.loading(m.teary_tame_gull_bless());
|
2024-12-07 11:13:59 +01:00
|
|
|
try {
|
2024-12-09 13:12:46 +01:00
|
|
|
const { data } = await client.value.updateEmoji(emoji.id, {
|
2024-12-07 11:13:59 +01:00
|
|
|
shortcode: result.value,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
toast.dismiss(id);
|
2024-12-07 20:24:09 +01:00
|
|
|
toast.success(m.gaudy_lime_bison_adore());
|
2024-12-09 13:12:46 +01:00
|
|
|
|
|
|
|
|
identity.value.emojis = identity.value.emojis.map((e) =>
|
|
|
|
|
e.id === emoji.id ? data : e,
|
|
|
|
|
);
|
2024-12-07 11:13:59 +01:00
|
|
|
} catch {
|
|
|
|
|
toast.dismiss(id);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const _delete = async () => {
|
2024-12-09 13:12:46 +01:00
|
|
|
if (!identity.value) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const { confirmed } = await confirmModalService.confirm({
|
|
|
|
|
title: m.tense_quick_cod_favor(),
|
|
|
|
|
message: m.honest_factual_carp_aspire(),
|
|
|
|
|
confirmText: m.tense_quick_cod_favor(),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (confirmed) {
|
|
|
|
|
const id = toast.loading(m.weary_away_liger_zip());
|
|
|
|
|
try {
|
|
|
|
|
await client.value.deleteEmoji(emoji.id);
|
|
|
|
|
toast.dismiss(id);
|
|
|
|
|
toast.success(m.crisp_whole_canary_tear());
|
|
|
|
|
|
|
|
|
|
identity.value.emojis = identity.value.emojis.filter(
|
|
|
|
|
(e) => e.id !== emoji.id,
|
|
|
|
|
);
|
|
|
|
|
} catch {
|
|
|
|
|
toast.dismiss(id);
|
|
|
|
|
}
|
2024-12-07 11:13:59 +01:00
|
|
|
}
|
|
|
|
|
};
|
2024-12-04 15:04:08 +01:00
|
|
|
</script>
|