import { clsx } from 'clsx' import { createMemo, Show } from 'solid-js' import { useLocalize } from '../../context/localize' import { useReactions } from '../../context/reactions' import { useSession } from '../../context/session' import { ReactionKind, Shout } from '../../graphql/schema/core.gen' import { loadShout } from '../../stores/zine/articles' import { Icon } from '../_shared/Icon' import { Popup } from '../_shared/Popup' import { VotersList } from '../_shared/VotersList' import styles from './ShoutRatingControl.module.scss' interface ShoutRatingControlProps { shout: Shout class?: string } export const ShoutRatingControl = (props: ShoutRatingControlProps) => { const { t } = useLocalize() const { author, actions: { requireAuthentication }, } = useSession() const { reactionEntities, actions: { createReaction, loadReactionsBy }, } = useReactions() const checkReaction = (reactionKind: ReactionKind) => Object.values(reactionEntities).some( (r) => r.kind === reactionKind && r.created_by.slug === author()?.slug && r.shout.id === props.shout.id && !r.reply_to, ) const isUpvoted = createMemo(() => checkReaction(ReactionKind.Like)) const isDownvoted = createMemo(() => checkReaction(ReactionKind.Dislike)) const shoutRatingReactions = createMemo(() => Object.values(reactionEntities).filter( (r) => [ReactionKind.Like, ReactionKind.Dislike].includes(r.kind) && r.shout.id === props.shout.id && !r.reply_to, ), ) const handleRatingChange = async (isUpvote: boolean) => { requireAuthentication(async () => { await createReaction({ kind: isUpvote ? ReactionKind.Like : ReactionKind.Dislike, shout: props.shout.id, }) loadShout(props.shout.slug) loadReactionsBy({ by: { shout: props.shout.slug }, }) }, 'vote') } return (
) }