mirror of
https://github.com/outline/outline.git
synced 2026-06-13 11:25:03 +03:00
f50bb00b29
* Refactor of OAuth account linking flows * PR feedback
107 lines
2.8 KiB
TypeScript
107 lines
2.8 KiB
TypeScript
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: (
|
|
<ImportDialog integrationId={integrationId} onSubmit={handleSubmit} />
|
|
),
|
|
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 (
|
|
<Button
|
|
type="submit"
|
|
onClick={handleConnect}
|
|
disabled={!env.NOTION_CLIENT_ID}
|
|
neutral
|
|
>
|
|
{t("Import")}…
|
|
</Button>
|
|
);
|
|
});
|