104 lines
3.5 KiB
TypeScript
104 lines
3.5 KiB
TypeScript
/**
|
||
* Copyright (c) 2023-present Plane Software, Inc. and contributors
|
||
* SPDX-License-Identifier: AGPL-3.0-only
|
||
* See the LICENSE file for details.
|
||
*/
|
||
|
||
import { useEffect, useState } from "react";
|
||
import { observer } from "mobx-react";
|
||
import useSWR from "swr";
|
||
import { TOAST_TYPE, setToast } from "@plane/propel/toast";
|
||
import { Loader, ToggleSwitch } from "@plane/ui";
|
||
// components
|
||
import { PageWrapper } from "@/components/common/page-wrapper";
|
||
// hooks
|
||
import { useInstance } from "@/hooks/store";
|
||
// types
|
||
import type { Route } from "./+types/page";
|
||
// local
|
||
import { InstanceEmailForm } from "./email-config-form";
|
||
|
||
const InstanceEmailPage = observer(function InstanceEmailPage(_props: Route.ComponentProps) {
|
||
// store
|
||
const { fetchInstanceConfigurations, formattedConfig, disableEmail } = useInstance();
|
||
|
||
const { isLoading } = useSWR("INSTANCE_CONFIGURATIONS", () => fetchInstanceConfigurations());
|
||
|
||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||
const [isSMTPEnabled, setIsSMTPEnabled] = useState(false);
|
||
|
||
const handleToggle = async () => {
|
||
if (isSMTPEnabled) {
|
||
setIsSubmitting(true);
|
||
try {
|
||
await disableEmail();
|
||
setIsSMTPEnabled(false);
|
||
setToast({
|
||
title: "Почта отключена",
|
||
message: "Отправка писем через SMTP отключена",
|
||
type: TOAST_TYPE.SUCCESS,
|
||
});
|
||
} catch (_error) {
|
||
setToast({
|
||
title: "Не удалось отключить почту",
|
||
message: "Повторите попытку.",
|
||
type: TOAST_TYPE.ERROR,
|
||
});
|
||
} finally {
|
||
setIsSubmitting(false);
|
||
}
|
||
return;
|
||
}
|
||
setIsSMTPEnabled(true);
|
||
};
|
||
useEffect(() => {
|
||
if (formattedConfig) {
|
||
setIsSMTPEnabled(formattedConfig.ENABLE_SMTP === "1");
|
||
}
|
||
}, [formattedConfig]);
|
||
|
||
return (
|
||
<PageWrapper
|
||
header={{
|
||
title: "Письма от вашего инстанса",
|
||
description: (
|
||
<>
|
||
NODE.DC может отправлять системные письма пользователям через ваш SMTP-сервер.
|
||
<div className="text-13 font-regular text-tertiary">
|
||
Заполните параметры ниже и проверьте отправку перед сохранением.
|
||
<span className="text-danger-primary">Ошибки в конфигурации приводят к отказам доставки.</span>
|
||
</div>
|
||
</>
|
||
),
|
||
actions: isLoading ? (
|
||
<Loader>
|
||
<Loader.Item width="24px" height="16px" className="rounded-full" />
|
||
</Loader>
|
||
) : (
|
||
<ToggleSwitch value={isSMTPEnabled} onChange={handleToggle} size="sm" disabled={isSubmitting} />
|
||
),
|
||
}}
|
||
>
|
||
{isSMTPEnabled && !isLoading && (
|
||
<>
|
||
{formattedConfig ? (
|
||
<InstanceEmailForm config={formattedConfig} />
|
||
) : (
|
||
<Loader className="space-y-10">
|
||
<Loader.Item height="50px" width="75%" />
|
||
<Loader.Item height="50px" width="75%" />
|
||
<Loader.Item height="50px" width="40%" />
|
||
<Loader.Item height="50px" width="40%" />
|
||
<Loader.Item height="50px" width="20%" />
|
||
</Loader>
|
||
)}
|
||
</>
|
||
)}
|
||
</PageWrapper>
|
||
);
|
||
});
|
||
|
||
export const meta: Route.MetaFunction = () => [{ title: "Настройки почты - NODE.DC" }];
|
||
|
||
export default InstanceEmailPage;
|