import { gql, useMutation } from '@apollo/client' import Button from 'react-bootstrap/Button' import { fixedDecimal, numWithUnits } from '@/lib/format' import { timeLeft } from '@/lib/time' import { useMe } from './me' import styles from './poll.module.css' import { signIn } from 'next-auth/react' import ActionTooltip from './action-tooltip' import { POLL_COST } from '@/lib/constants' import { InvoiceCanceledError, usePayment } from './payment' import { useToast } from './toast' import { Types as ClientNotification, useClientNotifications } from './client-notifications' export default function Poll ({ item }) { const me = useMe() const POLL_VOTE_MUTATION = gql` mutation pollVote($id: ID!, $hash: String, $hmac: String) { pollVote(id: $id, hash: $hash, hmac: $hmac) }` const [pollVote] = useMutation(POLL_VOTE_MUTATION) const toaster = useToast() const { notify, unnotify } = useClientNotifications() const update = (cache, { data: { pollVote } }) => { cache.modify({ id: `Item:${item.id}`, fields: { poll (existingPoll) { const poll = { ...existingPoll } poll.meVoted = true poll.count += 1 return poll } } }) cache.modify({ id: `PollOption:${pollVote}`, fields: { count (existingCount) { return existingCount + 1 } } }) } const PollButton = ({ v }) => { const payment = usePayment() return ( ) } const hasExpiration = !!item.pollExpiresAt const timeRemaining = timeLeft(new Date(item.pollExpiresAt)) const mine = item.user.id === me?.id const showPollButton = (!hasExpiration || timeRemaining) && !item.poll.meVoted && !mine return (
{item.poll.options.map(v => showPollButton ? : )}
{numWithUnits(item.poll.count, { unitSingular: 'vote', unitPlural: 'votes' })} {hasExpiration && ` \\ ${timeRemaining ? `${timeRemaining} left` : 'poll ended'}`}
) } function PollResult ({ v, progress }) { return (
{v.option} {progress}%
) }