import find from "lodash/find"; import { observer } from "mobx-react"; import { BuildingBlocksIcon } from "outline-icons"; import * as React from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { IntegrationService, IntegrationType } from "@shared/types"; import Integration from "~/models/Integration"; import Button from "~/components/Button"; import Heading from "~/components/Heading"; import Input from "~/components/Input"; import Scene from "~/components/Scene"; import useStores from "~/hooks/useStores"; import SettingRow from "./components/SettingRow"; type FormData = { drawIoUrl: string; gristUrl: string; }; function SelfHosted() { const { integrations } = useStores(); const { t } = useTranslation(); const integrationDiagrams = find(integrations.orderedData, { type: IntegrationType.Embed, service: IntegrationService.Diagrams, }) as Integration | undefined; const integrationGrist = find(integrations.orderedData, { type: IntegrationType.Embed, service: IntegrationService.Grist, }) as Integration | undefined; const { register, reset, handleSubmit: formHandleSubmit, formState, } = useForm({ mode: "all", defaultValues: { drawIoUrl: integrationDiagrams?.settings.url, gristUrl: integrationGrist?.settings.url, }, }); React.useEffect(() => { void integrations.fetchPage({ type: IntegrationType.Embed, }); }, [integrations]); React.useEffect(() => { reset({ drawIoUrl: integrationDiagrams?.settings.url, gristUrl: integrationGrist?.settings.url, }); }, [integrationDiagrams, integrationGrist, reset]); const handleSubmit = React.useCallback( async (data: FormData) => { try { if (data.drawIoUrl) { await integrations.save({ id: integrationDiagrams?.id, type: IntegrationType.Embed, service: IntegrationService.Diagrams, settings: { url: data.drawIoUrl, }, }); } else { await integrationDiagrams?.delete(); } if (data.gristUrl) { await integrations.save({ id: integrationGrist?.id, type: IntegrationType.Embed, service: IntegrationService.Grist, settings: { url: data.gristUrl, }, }); } else { await integrationGrist?.delete(); } toast.success(t("Settings saved")); } catch (err) { toast.error(err.message); } }, [integrations, integrationDiagrams, integrationGrist, t] ); return ( }> {t("Self Hosted")}
); } export default observer(SelfHosted);