frontend/app/components/notifications/follow-request.vue

106 lines
3 KiB
Vue
Raw Normal View History

<template>
2025-12-09 22:32:22 +01:00
<div
v-if="relationship?.requested_by !== false"
class="flex flex-row items-center gap-3 p-4"
>
2024-12-02 17:25:27 +01:00
<NuxtLink :href="followerUrl" class="relative size-10">
2025-12-09 22:32:22 +01:00
<Avatar
class="size-10 border border-border"
:src="follower.avatar"
:name="follower.display_name"
/>
</NuxtLink>
2025-12-09 22:32:22 +01:00
<div
class="flex flex-col gap-0.5 justify-center flex-1 text-left leading-tight text-sm"
>
<span
class="truncate font-semibold"
v-render-emojis="follower.emojis"
2026-01-09 21:47:12 +01:00
>{{ follower.display_name }}</span
2025-12-09 22:32:22 +01:00
>
<span class="truncate tracking-tight">
2026-01-09 21:47:12 +01:00
<Address :username="username" :domain="domain" />
</span>
</div>
</div>
<div v-if="loading" class="flex p-2 items-center justify-center h-12">
2026-01-09 21:47:12 +01:00
<Loader class="size-4 animate-spin" />
</div>
2025-12-09 22:32:22 +01:00
<div
v-else-if="relationship?.requested_by === false"
class="flex p-2 items-center justify-center h-12"
>
2026-01-09 21:47:12 +01:00
<Check class="size-4" />
</div>
<div v-else class="grid grid-cols-2 p-2 gap-2">
2025-12-09 22:32:22 +01:00
<Button
variant="secondary"
size="sm"
@click="accept"
:title="m.slow_these_kestrel_sail()"
>
2026-01-09 21:47:12 +01:00
<Check />
</Button>
2025-12-09 22:32:22 +01:00
<Button
variant="ghost"
size="sm"
@click="reject"
:title="m.weary_steep_yak_embrace()"
>
2026-01-09 21:47:12 +01:00
<X />
</Button>
</div>
</template>
<script lang="ts" setup>
import type { Account } from "@versia/client/schemas";
import { Check, Loader, X } from "lucide-vue-next";
import { toast } from "vue-sonner";
import type { z } from "zod";
import { Button } from "~/components/ui/button";
2025-07-16 07:48:39 +02:00
import * as m from "~~/paraglide/messages.js";
import Address from "../profiles/address.vue";
import Avatar from "../profiles/avatar.vue";
const { follower } = defineProps<{
follower: z.infer<typeof Account>;
}>();
const loading = ref(true);
2024-12-02 17:25:27 +01:00
const followerUrl = `/@${follower.acct}`;
const [username, domain] = follower.acct.split("@");
const { relationship } = useRelationship(follower.id);
const authStore = useAuthStore();
// TODO: Add "followed" notification
watch(relationship, () => {
if (relationship.value) {
loading.value = false;
}
});
const accept = async () => {
const id = toast.loading(m.cool_slimy_coyote_affirm());
loading.value = true;
const { data } = await authStore.client.acceptFollowRequest(follower.id);
toast.dismiss(id);
toast.success(m.busy_awful_mouse_jump());
relationship.value = data;
loading.value = false;
};
const reject = async () => {
const id = toast.loading(m.front_sunny_penguin_flip());
loading.value = true;
const { data } = await authStore.client.rejectFollowRequest(follower.id);
toast.dismiss(id);
toast.success(m.green_flat_mayfly_trust());
relationship.value = data;
loading.value = false;
};
</script>