import { useEffect, useState } from "react"; import { useSearchParams, useNavigate } from "react-router-dom"; import { Alert, Button, Card, Group, Loader, Stack, Text } from "@mantine/core"; import { useTranslation } from "react-i18next"; import { useAtomValue } from "jotai"; import { decodeSlackLinkState, confirmSlackLink, SlackLinkStateInfo, } from "../services/slack-link-service"; import { currentUserAtom } from "@/features/user/atoms/current-user-atom"; import APP_ROUTE from "@/lib/app-route"; export default function SlackLinkPage() { const { t } = useTranslation(); const [searchParams] = useSearchParams(); const navigate = useNavigate(); const state = searchParams.get("state"); const currentUser = useAtomValue(currentUserAtom); const [info, setInfo] = useState(null); const [error, setError] = useState(null); const [submitting, setSubmitting] = useState(false); const [done, setDone] = useState(false); useEffect(() => { if (!currentUser) { const redirectPath = window.location.pathname + window.location.search; navigate(`${APP_ROUTE.AUTH.LOGIN}?redirect=${encodeURIComponent(redirectPath)}`); return; } if (!state) { setError(t("Missing state parameter")); return; } decodeSlackLinkState(state) .then(setInfo) .catch((e) => setError(e?.response?.data?.message ?? e.message)); }, [state, t, currentUser, navigate]); async function onConfirm() { if (!state) return; setSubmitting(true); try { await confirmSlackLink(state); setDone(true); } catch (e: any) { setError(e?.response?.data?.message ?? e.message); } finally { setSubmitting(false); } } if (done) { return ( {t("Connected")} {t("You can close this tab and return to Slack.")} ); } if (error) { return ( {error} ); } if (!info || !currentUser) { return (
); } return ( {t("Link your Docmost account to Slack")} {t("Connect Docmost account")}{" "} {currentUser.user.email}{" "} {t("to Slack user")} @{info.slackUserName} {info.slackTeamName && ( <> {" "} {t("in")} {info.slackTeamName} )} ? ); }