import { SaveIcon } from '@heroicons/react/outline'; import axios from 'axios'; import { Field, Form, Formik } from 'formik'; import { useRouter } from 'next/router'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { useToasts } from 'react-toast-notifications'; import useSWR from 'swr'; import * as Yup from 'yup'; import { UserSettingsNotificationsResponse } from '../../../../../server/interfaces/api/userSettingsInterfaces'; import { useUser } from '../../../../hooks/useUser'; import globalMessages from '../../../../i18n/globalMessages'; import Button from '../../../Common/Button'; import LoadingSpinner from '../../../Common/LoadingSpinner'; import NotificationTypeSelector from '../../../NotificationTypeSelector'; const messages = defineMessages({ discordsettingssaved: 'Discord notification settings saved successfully!', discordsettingsfailed: 'Discord notification settings failed to save.', discordId: 'User ID', discordIdTip: 'The multi-digit ID number associated with your user account', validationDiscordId: 'You must provide a valid user ID', }); const UserNotificationsDiscord: React.FC = () => { const intl = useIntl(); const { addToast } = useToasts(); const router = useRouter(); const { user } = useUser({ id: Number(router.query.userId) }); const { user: currentUser } = useUser(); const { data, error, mutate: revalidate, } = useSWR( user ? `/api/v1/user/${user?.id}/settings/notifications` : null ); const UserNotificationsDiscordSchema = Yup.object().shape({ discordId: Yup.string() .when('types', { is: (types: number) => !!types, then: Yup.string() .nullable() .required(intl.formatMessage(messages.validationDiscordId)), otherwise: Yup.string().nullable(), }) .matches(/^\d{17,18}$/, intl.formatMessage(messages.validationDiscordId)), }); if (!data && !error) { return ; } return ( { try { await axios.post(`/api/v1/user/${user?.id}/settings/notifications`, { pgpKey: data?.pgpKey, discordId: values.discordId, pushbulletAccessToken: data?.pushbulletAccessToken, pushoverApplicationToken: data?.pushoverApplicationToken, pushoverUserKey: data?.pushoverUserKey, telegramChatId: data?.telegramChatId, telegramSendSilently: data?.telegramSendSilently, notificationTypes: { discord: values.types, }, }); addToast(intl.formatMessage(messages.discordsettingssaved), { appearance: 'success', autoDismiss: true, }); } catch (e) { addToast(intl.formatMessage(messages.discordsettingsfailed), { appearance: 'error', autoDismiss: true, }); } finally { revalidate(); } }} > {({ errors, touched, isSubmitting, isValid, values, setFieldValue, setFieldTouched, }) => { return ( {intl.formatMessage(messages.discordId)} {!!data?.discordEnabledTypes && ( * )} {currentUser?.id === user?.id && ( {intl.formatMessage(messages.discordIdTip, { FindDiscordIdLink: function FindDiscordIdLink(msg) { return ( {msg} ); }, })} )} {errors.discordId && touched.discordId && ( {errors.discordId} )} { setFieldValue('types', newTypes); setFieldTouched('types'); }} error={ errors.types && touched.types ? (errors.types as string) : undefined } /> {isSubmitting ? intl.formatMessage(globalMessages.saving) : intl.formatMessage(globalMessages.save)} ); }} ); }; export default UserNotificationsDiscord;