import { AnimatePresence, motion } from "framer-motion"; import { useTranslation } from "next-i18next"; import * as React from "react"; import { useMeasure } from "react-use"; import smoothscroll from "smoothscroll-polyfill"; import { Button } from "../button"; import ArrowLeft from "../icons/arrow-left.svg"; import ArrowRight from "../icons/arrow-right.svg"; 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 } from "./mutations"; if (typeof window !== "undefined") { smoothscroll.polyfill(); } const MotionButton = motion(Button); const minSidebarWidth = 200; const Poll: React.VoidFunctionComponent = () => { const { t } = useTranslation("app"); const { poll, options, userAlreadyVoted, targetTimeZone, setTargetTimeZone } = usePoll(); const { participants } = useParticipants(); const [ref, { width }] = useMeasure(); const [editingParticipantId, setEditingParticipantId] = React.useState(null); const actionColumnWidth = 140; const columnWidth = Math.min( 130, Math.max( 90, (width - minSidebarWidth - actionColumnWidth) / options.length, ), ); const numberOfVisibleColumns = Math.min( options.length, Math.floor((width - (minSidebarWidth + actionColumnWidth)) / columnWidth), ); const sidebarWidth = width - (numberOfVisibleColumns * columnWidth + actionColumnWidth); 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 = !userAlreadyVoted && !poll.closed; const pollWidth = sidebarWidth + options.length * columnWidth + actionColumnWidth; const addParticipant = useAddParticipantMutation(); const goToNextPage = () => { setScrollPosition( Math.min( maxScrollPosition, scrollPosition + numberOfVisibleColumns * columnWidth, ), ); }; const goToPreviousPage = () => { setScrollPosition( Math.max(0, scrollPosition - numberOfVisibleColumns * columnWidth), ); }; const participantListContainerRef = React.useRef(null); return (
{poll.timeZone ? (
{t("timeZone")}
) : null}
{t("participantCount", { count: participants.length })}
{scrollPosition > 0 ? ( ) : null}
{maxScrollPosition > 0 ? ( {scrollPosition < maxScrollPosition ? ( { goToNextPage(); }} > ) : null} ) : null}
{participants.length > 0 ? (
{participants.map((participant, i) => { return ( { setEditingParticipantId( isEditing ? participant.id : null, ); }} /> ); })}
) : null} {shouldShowNewParticipantForm ? ( { const participant = await addParticipant.mutateAsync({ name, votes, pollId: poll.id, }); setTimeout(() => { participantListContainerRef.current ?.querySelector(`[data-participantid=${participant.id}]`) ?.scrollIntoView(); }, 100); }} /> ) : null}
); }; export default React.memo(Poll);