import { t } from "@lingui/core/macro"; import { env } from "next-runtime-env"; import { useEffect } from "react"; import { HiMiniArrowTopRightOnSquare } from "react-icons/hi2"; import Button from "~/components/Button"; import { LanguageSelector } from "~/components/LanguageSelector"; import Modal from "~/components/modal"; import { NewWorkspaceForm } from "~/components/NewWorkspaceForm"; import { PageHead } from "~/components/PageHead"; import { useModal } from "~/providers/modal"; import { usePopup } from "~/providers/popup"; import { useWorkspace } from "~/providers/workspace"; import { api } from "~/utils/api"; import Avatar from "./components/Avatar"; import CreateAPIKeyForm from "./components/CreateAPIKeyForm"; import { CustomURLConfirmation } from "./components/CustomURLConfirmation"; import { DeleteAccountConfirmation } from "./components/DeleteAccountConfirmation"; import { DeleteWorkspaceConfirmation } from "./components/DeleteWorkspaceConfirmation"; import UpdateDisplayNameForm from "./components/UpdateDisplayNameForm"; import UpdateWorkspaceDescriptionForm from "./components/UpdateWorkspaceDescriptionForm"; import UpdateWorkspaceNameForm from "./components/UpdateWorkspaceNameForm"; import UpdateWorkspaceUrlForm from "./components/UpdateWorkspaceUrlForm"; export default function SettingsPage() { const { modalContentType, openModal } = useModal(); const { workspace } = useWorkspace(); const utils = api.useUtils(); const { showPopup } = usePopup(); const { data } = api.user.getUser.useQuery(); const { data: integrations, refetch: refetchIntegrations, isLoading: integrationsLoading, } = api.integration.providers.useQuery(); const { data: trelloUrl, refetch: refetchTrelloUrl } = api.integration.getAuthorizationUrl.useQuery( { provider: "trello" }, { enabled: !integrationsLoading && !integrations?.some( (integration) => integration.provider === "trello", ), refetchOnWindowFocus: true, }, ); useEffect(() => { const handleFocus = () => { refetchIntegrations(); }; window.addEventListener("focus", handleFocus); return () => { window.removeEventListener("focus", handleFocus); }; }, [refetchIntegrations]); const { mutateAsync: disconnectTrello } = api.integration.disconnect.useMutation({ onSuccess: () => { refetchUser(); refetchIntegrations(); refetchTrelloUrl(); showPopup({ header: t`Trello disconnected`, message: t`Your Trello account has been disconnected.`, icon: "success", }); }, onError: () => { showPopup({ header: t`Error disconnecting Trello`, message: t`An error occurred while disconnecting your Trello account.`, icon: "error", }); }, }); const refetchUser = () => utils.user.getUser.refetch(); const handleOpenBillingPortal = async () => { try { const response = await fetch("/api/stripe/create_billing_session", { method: "POST", headers: { "Content-Type": "application/json", }, }); const { url } = (await response.json()) as { url: string }; if (url) { window.location.href = url; } } catch (error) { console.error("Error creating billing session:", error); } }; return ( <>
{t`Change the language of the app.`}
{t`View and manage your billing and subscription.`}
} onClick={handleOpenBillingPortal} > {t`Billing portal`}{t`Connect your Trello account to import boards.`}
} onClick={() => window.open( trelloUrl.url, "trello_auth", "height=800,width=600", ) } > {t`Connect Trello`} > ) : ( integrations?.some( (integration) => integration.provider === "trello", ) && ( <>{t`Your Trello account is connected.`}
> ) )}{t`View and manage your API keys.`}
{t`Once you delete your workspace, there is no going back. This action cannot be undone.`}
{t`Once you delete your account, there is no going back. This action cannot be undone.`}