Files
outline/app/scenes/Settings/Notifications.tsx
2022-06-05 11:47:40 +02:00

159 lines
4.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { debounce } from "lodash";
import { observer } from "mobx-react";
import { EmailIcon } from "outline-icons";
import * as React from "react";
import { useTranslation, Trans } from "react-i18next";
import Heading from "~/components/Heading";
import Input from "~/components/Input";
import Notice from "~/components/Notice";
import Scene from "~/components/Scene";
import Switch from "~/components/Switch";
import Text from "~/components/Text";
import env from "~/env";
import useCurrentUser from "~/hooks/useCurrentUser";
import useStores from "~/hooks/useStores";
import useToasts from "~/hooks/useToasts";
import isCloudHosted from "~/utils/isCloudHosted";
import SettingRow from "./components/SettingRow";
function Notifications() {
const { notificationSettings } = useStores();
const { showToast } = useToasts();
const user = useCurrentUser();
const { t } = useTranslation();
const options = [
{
event: "documents.publish",
title: t("Document published"),
description: t(
"Receive a notification whenever a new document is published"
),
},
{
event: "documents.update",
title: t("Document updated"),
description: t(
"Receive a notification when a document you created is edited"
),
},
{
event: "collections.create",
title: t("Collection created"),
description: t(
"Receive a notification whenever a new collection is created"
),
},
{
visible: isCloudHosted,
event: "emails.onboarding",
title: t("Getting started"),
description: t(
"Tips on getting started with Outlines features and functionality"
),
},
{
visible: isCloudHosted,
event: "emails.features",
title: t("New features"),
description: t("Receive an email when new features of note are added"),
},
];
React.useEffect(() => {
notificationSettings.fetchPage({});
}, [notificationSettings]);
const showSuccessMessage = debounce(() => {
showToast(t("Notifications saved"), {
type: "success",
});
}, 500);
const handleChange = React.useCallback(
async (ev: React.ChangeEvent<HTMLInputElement>) => {
const setting = notificationSettings.getByEvent(ev.target.name);
if (ev.target.checked) {
await notificationSettings.save({
event: ev.target.name,
});
} else if (setting) {
await notificationSettings.delete(setting);
}
showSuccessMessage();
},
[notificationSettings, showSuccessMessage]
);
const showSuccessNotice = window.location.search === "?success";
return (
<Scene title={t("Notifications")} icon={<EmailIcon color="currentColor" />}>
<Heading>{t("Notifications")}</Heading>
{showSuccessNotice && (
<Notice>
<Trans>
Unsubscription successful. Your notification settings were updated
</Trans>
</Notice>
)}
<Text type="secondary">
<Trans>Manage when and where you receive email notifications.</Trans>
</Text>
{env.EMAIL_ENABLED ? (
<>
<SettingRow
label={t("Email address")}
name="email"
description={t(
"Your email address should be updated in your SSO provider."
)}
>
<Input type="email" value={user.email} readOnly />
</SettingRow>
<h2>{t("Notifications")}</h2>
{options.map((option) => {
const setting = notificationSettings.getByEvent(option.event);
return (
<SettingRow
visible={option.visible}
label={option.title}
name={option.event}
description={option.description}
>
<Switch
key={option.event}
id={option.event}
name={option.event}
checked={!!setting}
onChange={handleChange}
disabled={
(setting && setting.isSaving) ||
notificationSettings.isFetching
}
/>
</SettingRow>
);
})}
</>
) : (
<Notice>
<Trans>
The email integration is currently disabled. Please set the
associated environment variables and restart the server to enable
notifications.
</Trans>
</Notice>
)}
</Scene>
);
}
export default observer(Notifications);