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 PlusCircle from "../icons/plus-circle.svg"; 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"; import { PollProps } from "./types"; if (typeof window !== "undefined") { smoothscroll.polyfill(); } const MotionButton = motion(Button); const minSidebarWidth = 180; const Poll: React.VoidFunctionComponent = ({ pollId }) => { const { t } = useTranslation("app"); const { poll, targetTimeZone, setTargetTimeZone, options } = usePoll(); const { timeZone, participants, role } = poll; const [ref, { width }] = useMeasure(); const [editingParticipantId, setEditingParticipantId] = React.useState(null); const actionColumnWidth = 160; const columnWidth = Math.min( 100, Math.max( 95, (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 numberOfInvisibleColumns = options.length - numberOfVisibleColumns; const [didUsePagination, setDidUsePagination] = React.useState(false); const [shouldShowNewParticipantForm, setShouldShowNewParticipantForm] = React.useState(participants.length === 0); const pollWidth = sidebarWidth + options.length * columnWidth + actionColumnWidth; const { mutate: addParticipant } = useAddParticipantMutation(pollId); const goToNextPage = () => { setScrollPosition( Math.min( maxScrollPosition, scrollPosition + numberOfVisibleColumns * columnWidth, ), ); }; const goToPreviousPage = () => { setScrollPosition( Math.max(0, scrollPosition - numberOfVisibleColumns * columnWidth), ); }; return (
{timeZone ? (
{t("timeZone")}
) : null}
{!shouldShowNewParticipantForm && !poll.closed ? ( ) : null}
{t("participantCount", { count: participants.length })}
{scrollPosition > 0 ? ( ) : null}
{maxScrollPosition > 0 ? ( {scrollPosition < maxScrollPosition ? ( { setDidUsePagination(true); goToNextPage(); }} > {didUsePagination ? ( ) : ( `+${numberOfInvisibleColumns} more…` )} ) : null} ) : null}
{shouldShowNewParticipantForm ? ( { return new Promise((resolve, reject) => { addParticipant(data, { onSuccess: () => { setShouldShowNewParticipantForm(false); resolve(); }, onError: reject, }); }); }} options={poll.options} onCancel={() => { setShouldShowNewParticipantForm(false); }} /> ) : null}
{participants.map((participant, i) => { return ( { setEditingParticipantId(isEditing ? participant.id : null); }} /> ); })}
); }; export default React.memo(Poll);