import { AnimatePresence, m } from "framer-motion"; import { Trans, useTranslation } from "next-i18next"; import * as React from "react"; import { useMeasure } from "react-use"; import ArrowLeft from "@/components/icons/arrow-left.svg"; import ArrowRight from "@/components/icons/arrow-right.svg"; import { Button } from "../button"; import { useNewParticipantModal } from "../new-participant-modal"; import { useParticipants } from "../participants-provider"; import { usePoll } from "../poll-context"; import TimeZonePicker from "../time-zone-picker"; import ParticipantRow from "./desktop-poll/participant-row"; import ParticipantRowForm from "./desktop-poll/participant-row-form"; import { PollContext } from "./desktop-poll/poll-context"; import PollHeader from "./desktop-poll/poll-header"; import { useAddParticipantMutation, useUpdateParticipantMutation, } from "./mutations"; const minSidebarWidth = 200; const Poll: React.VoidFunctionComponent = () => { const { t } = useTranslation("app"); const { poll, options, targetTimeZone, setTargetTimeZone, userAlreadyVoted } = usePoll(); const { participants } = useParticipants(); const [ref, { width }] = useMeasure(); const [editingParticipantId, setEditingParticipantId] = React.useState(null); const columnWidth = 80; const numberOfVisibleColumns = Math.min( options.length, Math.floor((width - minSidebarWidth) / columnWidth), ); const sidebarWidth = Math.min( width - numberOfVisibleColumns * columnWidth, 275, ); const availableSpace = Math.min( numberOfVisibleColumns * columnWidth, options.length * columnWidth, ); const [activeOptionId, setActiveOptionId] = React.useState(null); const [scrollPosition, setScrollPosition] = React.useState(0); const maxScrollPosition = columnWidth * options.length - columnWidth * numberOfVisibleColumns; const [shouldShowNewParticipantForm, setShouldShowNewParticipantForm] = React.useState(!poll.closed && !userAlreadyVoted); const pollWidth = sidebarWidth + options.length * columnWidth; const addParticipant = useAddParticipantMutation(); const goToNextPage = () => { setScrollPosition( Math.min( maxScrollPosition, scrollPosition + numberOfVisibleColumns * columnWidth, ), ); }; const goToPreviousPage = () => { setScrollPosition( Math.max(0, scrollPosition - numberOfVisibleColumns * columnWidth), ); }; const updateParticipant = useUpdateParticipantMutation(); const showNewParticipantModal = useNewParticipantModal(); return (
{shouldShowNewParticipantForm || editingParticipantId ? ( }} /> ) : (
{t("participantCount", { count: participants.length })}
{poll.closed ? null : ( )}
)}
{t("optionCount", { count: options.length })}
{maxScrollPosition > 0 ? (
) : null}
{poll.timeZone ? (
{t("timeZone")}
) : null}
{shouldShowNewParticipantForm && !poll.closed && !editingParticipantId ? ( { showNewParticipantModal({ votes, onSubmit: () => { setShouldShowNewParticipantForm(false); }, }); }} /> ) : null} {participants.map((participant, i) => { return ( { if (isEditing) { setShouldShowNewParticipantForm(false); setEditingParticipantId(participant.id); } }} onSubmit={async ({ votes }) => { await updateParticipant.mutateAsync({ participantId: participant.id, pollId: poll.id, votes, }); setEditingParticipantId(null); }} /> ); })}
{shouldShowNewParticipantForm || editingParticipantId ? (
) : null}
); }; export default React.memo(Poll);