diff --git a/server/interfaces/api/userSettingsInterfaces.ts b/server/interfaces/api/userSettingsInterfaces.ts index 0f743efe..a3e132d6 100644 --- a/server/interfaces/api/userSettingsInterfaces.ts +++ b/server/interfaces/api/userSettingsInterfaces.ts @@ -2,6 +2,7 @@ import { NotificationAgentKey } from '../../lib/settings'; export interface UserSettingsGeneralResponse { username?: string; + discordId?: string; locale?: string; region?: string; originalLanguage?: string; diff --git a/server/routes/user/usersettings.ts b/server/routes/user/usersettings.ts index 22a26531..0c53c94a 100644 --- a/server/routes/user/usersettings.ts +++ b/server/routes/user/usersettings.ts @@ -51,6 +51,7 @@ userSettingsRoutes.get<{ id: string }, UserSettingsGeneralResponse>( return res.status(200).json({ username: user.username, + discordId: user.settings?.discordId, locale: user.settings?.locale, region: user.settings?.region, originalLanguage: user.settings?.originalLanguage, @@ -109,11 +110,13 @@ userSettingsRoutes.post< if (!user.settings) { user.settings = new UserSettings({ user: req.user, + discordId: req.body.discordId, locale: req.body.locale, region: req.body.region, originalLanguage: req.body.originalLanguage, }); } else { + user.settings.discordId = req.body.discordId; user.settings.locale = req.body.locale; user.settings.region = req.body.region; user.settings.originalLanguage = req.body.originalLanguage; @@ -123,8 +126,9 @@ userSettingsRoutes.post< return res.status(200).json({ username: user.username, - region: user.settings.region, + discordId: user.settings.discordId, locale: user.settings.locale, + region: user.settings.region, originalLanguage: user.settings.originalLanguage, }); } catch (e) { diff --git a/src/components/UserProfile/UserSettings/UserGeneralSettings/index.tsx b/src/components/UserProfile/UserSettings/UserGeneralSettings/index.tsx index fafb76d5..5cce3f7e 100644 --- a/src/components/UserProfile/UserSettings/UserGeneralSettings/index.tsx +++ b/src/components/UserProfile/UserSettings/UserGeneralSettings/index.tsx @@ -6,6 +6,7 @@ import React, { useEffect, useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { useToasts } from 'react-toast-notifications'; import useSWR from 'swr'; +import * as Yup from 'yup'; import { UserSettingsGeneralResponse } from '../../../../../server/interfaces/api/userSettingsInterfaces'; import { availableLanguages, @@ -46,6 +47,10 @@ const messages = defineMessages({ enableOverride: 'Override Global Limit', applanguage: 'Display Language', languageDefault: 'Default ({language})', + discordId: 'Discord User ID', + discordIdTip: + 'The multi-digit ID number associated with your Discord user account', + validationDiscordId: 'You must provide a valid Discord user ID', }); const UserGeneralSettings: React.FC = () => { @@ -72,6 +77,12 @@ const UserGeneralSettings: React.FC = () => { user ? `/api/v1/user/${user?.id}/settings/main` : null ); + const UserGeneralSettingsSchema = Yup.object().shape({ + discordId: Yup.string() + .nullable() + .matches(/^\d{17,18}$/, intl.formatMessage(messages.validationDiscordId)), + }); + useEffect(() => { setMovieQuotaEnabled( data?.movieQuotaLimit != undefined && data?.movieQuotaDays != undefined @@ -104,8 +115,9 @@ const UserGeneralSettings: React.FC = () => { { tvQuotaLimit: data?.tvQuotaLimit, tvQuotaDays: data?.tvQuotaDays, }} + validationSchema={UserGeneralSettingsSchema} enableReinitialize onSubmit={async (values) => { try { await axios.post(`/api/v1/user/${user?.id}/settings/main`, { username: values.displayName, + discordId: values.discordId, + locale: values.locale, region: values.region, originalLanguage: values.originalLanguage, movieQuotaLimit: movieQuotaEnabled @@ -126,7 +141,6 @@ const UserGeneralSettings: React.FC = () => { movieQuotaDays: movieQuotaEnabled ? values.movieQuotaDays : null, tvQuotaLimit: tvQuotaEnabled ? values.tvQuotaLimit : null, tvQuotaDays: tvQuotaEnabled ? values.tvQuotaDays : null, - locale: values.locale, }); if (currentUser?.id === user?.id && setLocale) { @@ -152,7 +166,14 @@ const UserGeneralSettings: React.FC = () => { } }} > - {({ errors, touched, isSubmitting, values, setFieldValue }) => { + {({ + errors, + touched, + isSubmitting, + isValid, + values, + setFieldValue, + }) => { return (
@@ -207,6 +228,36 @@ const UserGeneralSettings: React.FC = () => { )}
+
+ +
+
+ +
+ {errors.discordId && touched.discordId && ( +
{errors.discordId}
+ )} +
+