import { trpc } from "@rallly/backend"; import { DotsHorizontalIcon, TrashIcon } from "@rallly/icons"; import clsx from "clsx"; import { useTranslation } from "next-i18next"; import * as React from "react"; import { Controller, useForm } from "react-hook-form"; import { usePostHog } from "@/utils/posthog"; import { useDayjs } from "../../utils/dayjs"; import { requiredString } from "../../utils/form-validation"; import { Button } from "../button"; import CompactButton from "../compact-button"; import Dropdown, { DropdownItem } from "../dropdown"; 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 { t } = useTranslation("app"); const { poll, admin } = usePoll(); const pollId = poll.id; const { data: comments } = trpc.polls.comments.list.useQuery({ pollId }); const posthog = usePostHog(); const queryClient = trpc.useContext(); const addComment = trpc.polls.comments.add.useMutation({ onSuccess: () => { queryClient.polls.comments.invalidate(); posthog?.capture("created comment"); }, }); 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, }); }} /> )}
{comment.content}
); })}
{ await addComment.mutateAsync({ authorName, content, pollId }); reset({ authorName, content: "" }); })} >