mirror of
https://github.com/emailerfacu-spec/minix-front.git
synced 2026-04-04 13:40:43 -03:00
101 lines
2.8 KiB
Svelte
101 lines
2.8 KiB
Svelte
<script lang="ts">
|
|
import { sesionStore } from '@/stores/usuario';
|
|
import { Tooltip } from './ui/tooltip';
|
|
import TooltipTrigger from './ui/tooltip/tooltip-trigger.svelte';
|
|
import Button from './ui/button/button.svelte';
|
|
import UserX from '@lucide/svelte/icons/user-x';
|
|
import UserPlus from '@lucide/svelte/icons/user-plus';
|
|
import Spinner from './ui/spinner/spinner.svelte';
|
|
import TooltipContent from './ui/tooltip/tooltip-content.svelte';
|
|
import { esSeguido } from '@/hooks/esSeguido';
|
|
import { seguirUsuario } from '@/hooks/seguirUsuario';
|
|
import type { Post } from '../../types';
|
|
import CardError from './CardError.svelte';
|
|
import { cacheSeguidos } from '@/stores/cacheSeguidos.js';
|
|
|
|
let {
|
|
post,
|
|
variant = 'icon-lg'
|
|
}: {
|
|
post: Omit<Partial<Post>, 'authorId'> & { authorId: string; id: string };
|
|
variant?: 'icon-lg' | 'default' | 'sm' | 'lg' | 'icon' | 'icon-sm';
|
|
} = $props();
|
|
|
|
let seguido: boolean | null = $state(null);
|
|
|
|
if (typeof window !== 'undefined') {
|
|
window.addEventListener('followCacheUpdated', ((
|
|
event: CustomEvent<{ userId: string; isFollowed: boolean } | { clearAll: true }>
|
|
) => {
|
|
if ('clearAll' in event.detail && event.detail.clearAll === true) {
|
|
} else if ('userId' in event.detail && event.detail.userId === post.authorId) {
|
|
seguido = event.detail.isFollowed;
|
|
}
|
|
}) as EventListener);
|
|
}
|
|
|
|
$effect(() => {
|
|
(async () => {
|
|
await cargarSeguido();
|
|
})();
|
|
});
|
|
|
|
async function cargarSeguido() {
|
|
seguido = await cacheSeguidos.getOrFetch(
|
|
post.authorId,
|
|
async () => {
|
|
const seguidoStatus = await esSeguido(post as Post);
|
|
return seguidoStatus?.isFollowing || false;
|
|
}
|
|
);
|
|
}
|
|
|
|
let mensajeError: string | null = $state(null);
|
|
</script>
|
|
|
|
{#if mensajeError}
|
|
<CardError {mensajeError} />
|
|
{/if}
|
|
|
|
{#if post.authorName !== $sesionStore?.username && post.authorName !== '[deleted]'}
|
|
<Tooltip>
|
|
<TooltipTrigger>
|
|
<Button
|
|
variant={seguido == true ? 'destructive' : 'outline'}
|
|
disabled={seguido == null}
|
|
size={variant}
|
|
onclick={async () => {
|
|
if (seguido == null) return;
|
|
const anteriorEstado = seguido;
|
|
let ret = seguirUsuario(post.authorId, seguido);
|
|
seguido = null;
|
|
|
|
let [res] = await Promise.all([
|
|
await ret,
|
|
new Promise((resolve) => setTimeout(resolve, 300))
|
|
]);
|
|
|
|
if (res === null) mensajeError = 'Fallo al intentar seguir el usuario';
|
|
if (res === true) seguido = !anteriorEstado;
|
|
cacheSeguidos.set(post.authorId, seguido == null ? false : Boolean(seguido));
|
|
}}
|
|
>
|
|
{#if seguido == true}
|
|
<UserX />
|
|
{:else if seguido == false}
|
|
<UserPlus />
|
|
{:else}
|
|
<Spinner />
|
|
{/if}
|
|
</Button>
|
|
</TooltipTrigger>
|
|
<TooltipContent>
|
|
{#if seguido == true}
|
|
Dejar de seguir
|
|
{:else}
|
|
Seguir
|
|
{/if}
|
|
</TooltipContent>
|
|
</Tooltip>
|
|
{/if}
|