import { createSignal, Show } from "solid-js"; import { api } from "~/lib/api"; import LikeIcon from "~/components/icons/LikeIcon"; export interface PostLike { id: number; user_id: string; post_id: string; } export interface SessionDependantLikeProps { currentUserID: string | undefined | null; privilegeLevel: "admin" | "user" | "anonymous"; likes: PostLike[]; projectID: number; } export default function SessionDependantLike(props: SessionDependantLikeProps) { const [hovering, setHovering] = createSignal(false); const [likes, setLikes] = createSignal(props.likes); const [instantOffset, setInstantOffset] = createSignal(0); const [hasLiked, setHasLiked] = createSignal( props.likes.some((like) => like.user_id === props.currentUserID) ); const giveProjectLike = async () => { if (!props.currentUserID) return; const initialHasLiked = hasLiked(); const initialInstantOffset = initialHasLiked ? -1 : 1; setHasLiked(!hasLiked()); setInstantOffset(initialInstantOffset); try { if (initialHasLiked) { const result = await api.database.removePostLike.mutate({ user_id: props.currentUserID, post_id: props.projectID.toString(), }); setLikes(result.newLikes as PostLike[]); } else { const result = await api.database.addPostLike.mutate({ user_id: props.currentUserID, post_id: props.projectID.toString(), }); setLikes(result.newLikes as PostLike[]); } setInstantOffset(0); } catch (error) { console.error("There has been a problem with your like operation:", error); setHasLiked(initialHasLiked); setInstantOffset(0); } }; const likeCount = () => likes().length + instantOffset(); const getLikeIconColor = () => { if (hasLiked()) { return "fill-orange-400"; } if (hovering()) { return "fill-orange-400 dark:fill-orange-500"; } return "fill-black dark:fill-white"; }; return (
{likes().length} {likes().length === 1 ? "Like" : "Likes"}
Must be logged in
} >
); }