"use client"; import { useEffect, useState } from "react"; import { redirect } from "next/navigation"; import { Icon, loadIcons } from "@iconify/react"; import { abbreviateNumber } from "@/lib/abbreviation"; interface Props { likes: number; miiId?: number | undefined; isLiked: boolean; isLoggedIn?: boolean; disabled?: boolean; abbreviate?: boolean; big?: boolean; } export default function LikeButton({ likes, isLiked, miiId, isLoggedIn, disabled, abbreviate, big }: Props) { const [isLikedState, setIsLikedState] = useState(isLiked); const [likesState, setLikesState] = useState(likes); const [isAnimating, setIsAnimating] = useState(false); const onClick = async () => { if (disabled) return; if (!isLoggedIn) redirect("/login"); setIsLikedState(!isLikedState); setLikesState(isLikedState ? likesState - 1 : likesState + 1); // Trigger animation if (!isLikedState) { setIsAnimating(true); setTimeout(() => setIsAnimating(false), 1000); // match animation duration } const response = await fetch(`/api/mii/${miiId}/like`, { method: "PATCH" }); if (response.ok) { const { liked, count } = await response.json(); setIsLikedState(liked); setLikesState(count); } else { setIsLikedState(isLikedState); setLikesState(likesState); } }; // Preload like button icons useEffect(() => { loadIcons(["icon-park-solid:like", "icon-park-outline:like"]); }, []); return ( ); }