import clsx from "clsx"; import { useTranslation } from "next-i18next"; import posthog from "posthog-js"; import * as React from "react"; import { Controller, useForm } from "react-hook-form"; import { useDayjs } from "../../utils/dayjs"; import { requiredString } from "../../utils/form-validation"; import { trpc } from "../../utils/trpc"; import { Button } from "../button"; import CompactButton from "../compact-button"; import Dropdown, { DropdownItem } from "../dropdown"; import DotsHorizontal from "../icons/dots-horizontal.svg"; import Trash from "../icons/trash.svg"; import NameInput from "../name-input"; import TruncatedLinkify from "../poll/truncated-linkify"; import UserAvatar from "../poll/user-avatar"; import { usePoll } from "../poll-context"; import { isUnclaimed, useUser } from "../user-provider"; interface CommentForm { authorName: string; content: string; } const Discussion: React.FunctionComponent = () => { const { dayjs } = useDayjs(); const queryClient = trpc.useContext(); const { t } = useTranslation("app"); const { poll, admin } = usePoll(); const pollId = poll.id; const { data: comments } = trpc.polls.comments.list.useQuery( { pollId }, { refetchInterval: 10000, // refetch every 10 seconds trpc: {}, }, ); const addComment = trpc.polls.comments.add.useMutation({ onSuccess: (newComment) => { posthog.capture("created comment"); queryClient.polls.comments.list.setData( { pollId }, (existingComments = []) => { return [...existingComments, newComment]; }, ); }, }); const deleteComment = trpc.polls.comments.delete.useMutation({ onMutate: ({ commentId }) => { queryClient.polls.comments.list.setData( { pollId }, (existingComments = []) => { return [...existingComments].filter(({ id }) => id !== commentId); }, ); }, onSuccess: () => { posthog.capture("deleted comment"); }, }); const session = useUser(); const { register, reset, control, handleSubmit, formState } = useForm({ defaultValues: { authorName: "", content: "", }, }); if (!comments) { return null; } return (
{t("comments")}
0, })} > {comments.map((comment) => { const canDelete = admin || session.ownsObject(comment) || isUnclaimed(comment); return (
{dayjs(new Date(comment.createdAt)).fromNow()}
{canDelete && } > { deleteComment.mutate({ commentId: comment.id, pollId, }); }} /> }
{comment.content}
); })}
{ await addComment.mutateAsync({ authorName, content, pollId }); reset({ authorName, content: "" }); })} >