import { observer } from "mobx-react"; import React from "react"; import { useTranslation } from "react-i18next"; import { useHistory, useLocation } from "react-router-dom"; import { toast } from "sonner"; import env from "@shared/env"; import { IntegrationService } from "@shared/types"; import Button from "~/components/Button"; import useCurrentTeam from "~/hooks/useCurrentTeam"; import useQuery from "~/hooks/useQuery"; import useStores from "~/hooks/useStores"; import { generateOAuthStateNonce } from "~/utils/oauth"; import { redirectTo } from "~/utils/urls"; import { NotionOAuthNonceCookie, NotionUtils } from "../shared/NotionUtils"; import { ImportDialog } from "./components/ImportDialog"; export const Notion = observer(() => { const { t } = useTranslation(); const { dialogs } = useStores(); const team = useCurrentTeam(); const history = useHistory(); const location = useLocation(); const queryParams = useQuery(); const appName = env.APP_NAME; const service = queryParams.get("service"); const oauthSuccess = queryParams.get("success") === ""; const oauthError = queryParams.get("error"); const integrationId = queryParams.get("integrationId"); const clearQueryParams = React.useCallback(() => { history.replace({ pathname: location.pathname, search: "", }); }, [history, location]); const handleSubmit = React.useCallback(() => { dialogs.closeAllModals(); clearQueryParams(); }, [dialogs, clearQueryParams]); React.useEffect(() => { if ( integrationId && oauthSuccess && service === IntegrationService.Notion ) { dialogs.openModal({ title: t("Import data"), content: ( ), onClose: clearQueryParams, }); } }, [ t, dialogs, oauthSuccess, service, clearQueryParams, handleSubmit, integrationId, ]); React.useEffect(() => { if (!oauthError) { return; } if (oauthError === "access_denied") { toast.error( t( "Whoops, you need to accept the permissions in Notion to connect {{ appName }} to your workspace. Try again?", { appName, } ) ); } else { toast.error( t( "Something went wrong while authenticating your request. Please try logging in again." ) ); } }, [t, appName, oauthError]); const handleConnect = React.useCallback(() => { const nonce = generateOAuthStateNonce(NotionOAuthNonceCookie); redirectTo(NotionUtils.authUrl({ state: { teamId: team.id, nonce } })); }, [team.id]); return ( ); });