import { AnimatePresence, m } from "framer-motion"; import { useRouter } from "next/router"; import { useTranslation } from "next-i18next"; import posthog from "posthog-js"; import React from "react"; import toast from "react-hot-toast"; import { useMount } from "react-use"; import { Button } from "@/components/button"; import Share from "@/components/icons/share.svg"; import { trpc, trpcNext } from "../utils/trpc"; import { useParticipants } from "./participants-provider"; import ManagePoll from "./poll/manage-poll"; import { useUpdatePollMutation } from "./poll/mutations"; import NotificationsToggle from "./poll/notifications-toggle"; import { UnverifiedPollNotice } from "./poll/unverified-poll-notice"; import { usePoll } from "./poll-context"; import Sharing from "./sharing"; import { useUser } from "./user-provider"; export const AdminControls = (props: { children?: React.ReactNode }) => { const { poll, urlId } = usePoll(); const { t } = useTranslation("app"); const router = useRouter(); const queryClient = trpcNext.useContext(); const session = useUser(); const { mutate: updatePollMutation } = useUpdatePollMutation(); React.useEffect(() => { if (router.query.unsubscribe) { updatePollMutation( { urlId: urlId, notifications: false }, { onSuccess: () => { toast.success(t("notificationsDisabled")); posthog.capture("unsubscribed from notifications"); }, }, ); router.replace(`/admin/${router.query.urlId}`, undefined, { shallow: true, }); } }, [urlId, router, updatePollMutation, t]); const verifyEmail = trpc.useMutation(["polls.verification.verify"], { onSuccess: () => { toast.success(t("pollHasBeenVerified")); queryClient.poll.invalidate(); session.refresh(); posthog.capture("verified email"); }, onError: () => { toast.error(t("linkHasExpired")); }, onSettled: () => { router.replace(`/admin/${router.query.urlId}`, undefined, { shallow: true, }); }, }); const { participants } = useParticipants(); const [isSharingVisible, setIsSharingVisible] = React.useState( participants.length === 0, ); useMount(() => { const { code } = router.query; if (typeof code === "string" && !poll.verified) { verifyEmail.mutate({ code, pollId: poll.id }); } }); return (
{isSharingVisible ? ( { setIsSharingVisible(false); }} /> ) : null} {poll.verified === false ? : null} {props.children}
); };