mirror of
https://github.com/sct/overseerr.git
synced 2025-09-17 17:24:35 +02:00
fix: add Discord ID setting to general user settings page (#2406)
This commit is contained in:
@@ -2,6 +2,7 @@ import { NotificationAgentKey } from '../../lib/settings';
|
|||||||
|
|
||||||
export interface UserSettingsGeneralResponse {
|
export interface UserSettingsGeneralResponse {
|
||||||
username?: string;
|
username?: string;
|
||||||
|
discordId?: string;
|
||||||
locale?: string;
|
locale?: string;
|
||||||
region?: string;
|
region?: string;
|
||||||
originalLanguage?: string;
|
originalLanguage?: string;
|
||||||
|
@@ -51,6 +51,7 @@ userSettingsRoutes.get<{ id: string }, UserSettingsGeneralResponse>(
|
|||||||
|
|
||||||
return res.status(200).json({
|
return res.status(200).json({
|
||||||
username: user.username,
|
username: user.username,
|
||||||
|
discordId: user.settings?.discordId,
|
||||||
locale: user.settings?.locale,
|
locale: user.settings?.locale,
|
||||||
region: user.settings?.region,
|
region: user.settings?.region,
|
||||||
originalLanguage: user.settings?.originalLanguage,
|
originalLanguage: user.settings?.originalLanguage,
|
||||||
@@ -109,11 +110,13 @@ userSettingsRoutes.post<
|
|||||||
if (!user.settings) {
|
if (!user.settings) {
|
||||||
user.settings = new UserSettings({
|
user.settings = new UserSettings({
|
||||||
user: req.user,
|
user: req.user,
|
||||||
|
discordId: req.body.discordId,
|
||||||
locale: req.body.locale,
|
locale: req.body.locale,
|
||||||
region: req.body.region,
|
region: req.body.region,
|
||||||
originalLanguage: req.body.originalLanguage,
|
originalLanguage: req.body.originalLanguage,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
user.settings.discordId = req.body.discordId;
|
||||||
user.settings.locale = req.body.locale;
|
user.settings.locale = req.body.locale;
|
||||||
user.settings.region = req.body.region;
|
user.settings.region = req.body.region;
|
||||||
user.settings.originalLanguage = req.body.originalLanguage;
|
user.settings.originalLanguage = req.body.originalLanguage;
|
||||||
@@ -123,8 +126,9 @@ userSettingsRoutes.post<
|
|||||||
|
|
||||||
return res.status(200).json({
|
return res.status(200).json({
|
||||||
username: user.username,
|
username: user.username,
|
||||||
region: user.settings.region,
|
discordId: user.settings.discordId,
|
||||||
locale: user.settings.locale,
|
locale: user.settings.locale,
|
||||||
|
region: user.settings.region,
|
||||||
originalLanguage: user.settings.originalLanguage,
|
originalLanguage: user.settings.originalLanguage,
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@@ -6,6 +6,7 @@ import React, { useEffect, useState } from 'react';
|
|||||||
import { defineMessages, useIntl } from 'react-intl';
|
import { defineMessages, useIntl } from 'react-intl';
|
||||||
import { useToasts } from 'react-toast-notifications';
|
import { useToasts } from 'react-toast-notifications';
|
||||||
import useSWR from 'swr';
|
import useSWR from 'swr';
|
||||||
|
import * as Yup from 'yup';
|
||||||
import { UserSettingsGeneralResponse } from '../../../../../server/interfaces/api/userSettingsInterfaces';
|
import { UserSettingsGeneralResponse } from '../../../../../server/interfaces/api/userSettingsInterfaces';
|
||||||
import {
|
import {
|
||||||
availableLanguages,
|
availableLanguages,
|
||||||
@@ -46,6 +47,10 @@ const messages = defineMessages({
|
|||||||
enableOverride: 'Override Global Limit',
|
enableOverride: 'Override Global Limit',
|
||||||
applanguage: 'Display Language',
|
applanguage: 'Display Language',
|
||||||
languageDefault: 'Default ({language})',
|
languageDefault: 'Default ({language})',
|
||||||
|
discordId: 'Discord User ID',
|
||||||
|
discordIdTip:
|
||||||
|
'The <FindDiscordIdLink>multi-digit ID number</FindDiscordIdLink> associated with your Discord user account',
|
||||||
|
validationDiscordId: 'You must provide a valid Discord user ID',
|
||||||
});
|
});
|
||||||
|
|
||||||
const UserGeneralSettings: React.FC = () => {
|
const UserGeneralSettings: React.FC = () => {
|
||||||
@@ -72,6 +77,12 @@ const UserGeneralSettings: React.FC = () => {
|
|||||||
user ? `/api/v1/user/${user?.id}/settings/main` : null
|
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(() => {
|
useEffect(() => {
|
||||||
setMovieQuotaEnabled(
|
setMovieQuotaEnabled(
|
||||||
data?.movieQuotaLimit != undefined && data?.movieQuotaDays != undefined
|
data?.movieQuotaLimit != undefined && data?.movieQuotaDays != undefined
|
||||||
@@ -104,8 +115,9 @@ const UserGeneralSettings: React.FC = () => {
|
|||||||
</div>
|
</div>
|
||||||
<Formik
|
<Formik
|
||||||
initialValues={{
|
initialValues={{
|
||||||
locale: data?.locale,
|
|
||||||
displayName: data?.username,
|
displayName: data?.username,
|
||||||
|
discordId: data?.discordId,
|
||||||
|
locale: data?.locale,
|
||||||
region: data?.region,
|
region: data?.region,
|
||||||
originalLanguage: data?.originalLanguage,
|
originalLanguage: data?.originalLanguage,
|
||||||
movieQuotaLimit: data?.movieQuotaLimit,
|
movieQuotaLimit: data?.movieQuotaLimit,
|
||||||
@@ -113,11 +125,14 @@ const UserGeneralSettings: React.FC = () => {
|
|||||||
tvQuotaLimit: data?.tvQuotaLimit,
|
tvQuotaLimit: data?.tvQuotaLimit,
|
||||||
tvQuotaDays: data?.tvQuotaDays,
|
tvQuotaDays: data?.tvQuotaDays,
|
||||||
}}
|
}}
|
||||||
|
validationSchema={UserGeneralSettingsSchema}
|
||||||
enableReinitialize
|
enableReinitialize
|
||||||
onSubmit={async (values) => {
|
onSubmit={async (values) => {
|
||||||
try {
|
try {
|
||||||
await axios.post(`/api/v1/user/${user?.id}/settings/main`, {
|
await axios.post(`/api/v1/user/${user?.id}/settings/main`, {
|
||||||
username: values.displayName,
|
username: values.displayName,
|
||||||
|
discordId: values.discordId,
|
||||||
|
locale: values.locale,
|
||||||
region: values.region,
|
region: values.region,
|
||||||
originalLanguage: values.originalLanguage,
|
originalLanguage: values.originalLanguage,
|
||||||
movieQuotaLimit: movieQuotaEnabled
|
movieQuotaLimit: movieQuotaEnabled
|
||||||
@@ -126,7 +141,6 @@ const UserGeneralSettings: React.FC = () => {
|
|||||||
movieQuotaDays: movieQuotaEnabled ? values.movieQuotaDays : null,
|
movieQuotaDays: movieQuotaEnabled ? values.movieQuotaDays : null,
|
||||||
tvQuotaLimit: tvQuotaEnabled ? values.tvQuotaLimit : null,
|
tvQuotaLimit: tvQuotaEnabled ? values.tvQuotaLimit : null,
|
||||||
tvQuotaDays: tvQuotaEnabled ? values.tvQuotaDays : null,
|
tvQuotaDays: tvQuotaEnabled ? values.tvQuotaDays : null,
|
||||||
locale: values.locale,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (currentUser?.id === user?.id && setLocale) {
|
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 (
|
return (
|
||||||
<Form className="section">
|
<Form className="section">
|
||||||
<div className="form-row">
|
<div className="form-row">
|
||||||
@@ -207,6 +228,36 @@ const UserGeneralSettings: React.FC = () => {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="form-row">
|
||||||
|
<label htmlFor="discordId" className="text-label">
|
||||||
|
{intl.formatMessage(messages.discordId)}
|
||||||
|
{currentUser?.id === user?.id && (
|
||||||
|
<span className="label-tip">
|
||||||
|
{intl.formatMessage(messages.discordIdTip, {
|
||||||
|
FindDiscordIdLink: function FindDiscordIdLink(msg) {
|
||||||
|
return (
|
||||||
|
<a
|
||||||
|
href="https://support.discord.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID-"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
>
|
||||||
|
{msg}
|
||||||
|
</a>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
})}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</label>
|
||||||
|
<div className="form-input">
|
||||||
|
<div className="form-input-field">
|
||||||
|
<Field id="discordId" name="discordId" type="text" />
|
||||||
|
</div>
|
||||||
|
{errors.discordId && touched.discordId && (
|
||||||
|
<div className="error">{errors.discordId}</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div className="form-row">
|
<div className="form-row">
|
||||||
<label htmlFor="locale" className="text-label">
|
<label htmlFor="locale" className="text-label">
|
||||||
{intl.formatMessage(messages.applanguage)}
|
{intl.formatMessage(messages.applanguage)}
|
||||||
@@ -364,7 +415,7 @@ const UserGeneralSettings: React.FC = () => {
|
|||||||
<Button
|
<Button
|
||||||
buttonType="primary"
|
buttonType="primary"
|
||||||
type="submit"
|
type="submit"
|
||||||
disabled={isSubmitting}
|
disabled={isSubmitting || !isValid}
|
||||||
>
|
>
|
||||||
<SaveIcon />
|
<SaveIcon />
|
||||||
<span>
|
<span>
|
||||||
|
@@ -19,7 +19,7 @@ const messages = defineMessages({
|
|||||||
discordsettingsfailed: 'Discord notification settings failed to save.',
|
discordsettingsfailed: 'Discord notification settings failed to save.',
|
||||||
discordId: 'User ID',
|
discordId: 'User ID',
|
||||||
discordIdTip:
|
discordIdTip:
|
||||||
'The <FindDiscordIdLink>ID number</FindDiscordIdLink> for your user account',
|
'The <FindDiscordIdLink>multi-digit ID number</FindDiscordIdLink> associated with your user account',
|
||||||
validationDiscordId: 'You must provide a valid user ID',
|
validationDiscordId: 'You must provide a valid user ID',
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -28,6 +28,7 @@ const UserNotificationsDiscord: React.FC = () => {
|
|||||||
const { addToast } = useToasts();
|
const { addToast } = useToasts();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { user } = useUser({ id: Number(router.query.userId) });
|
const { user } = useUser({ id: Number(router.query.userId) });
|
||||||
|
const { user: currentUser } = useUser();
|
||||||
const {
|
const {
|
||||||
data,
|
data,
|
||||||
error,
|
error,
|
||||||
@@ -107,21 +108,23 @@ const UserNotificationsDiscord: React.FC = () => {
|
|||||||
{!!data?.discordEnabledTypes && (
|
{!!data?.discordEnabledTypes && (
|
||||||
<span className="label-required">*</span>
|
<span className="label-required">*</span>
|
||||||
)}
|
)}
|
||||||
<span className="label-tip">
|
{currentUser?.id === user?.id && (
|
||||||
{intl.formatMessage(messages.discordIdTip, {
|
<span className="label-tip">
|
||||||
FindDiscordIdLink: function FindDiscordIdLink(msg) {
|
{intl.formatMessage(messages.discordIdTip, {
|
||||||
return (
|
FindDiscordIdLink: function FindDiscordIdLink(msg) {
|
||||||
<a
|
return (
|
||||||
href="https://support.discord.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID-"
|
<a
|
||||||
target="_blank"
|
href="https://support.discord.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID-"
|
||||||
rel="noreferrer"
|
target="_blank"
|
||||||
>
|
rel="noreferrer"
|
||||||
{msg}
|
>
|
||||||
</a>
|
{msg}
|
||||||
);
|
</a>
|
||||||
},
|
);
|
||||||
})}
|
},
|
||||||
</span>
|
})}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
</label>
|
</label>
|
||||||
<div className="form-input">
|
<div className="form-input">
|
||||||
<div className="form-input-field">
|
<div className="form-input-field">
|
||||||
|
@@ -65,6 +65,7 @@ const UserNotificationSettings: React.FC = ({ children }) => {
|
|||||||
),
|
),
|
||||||
route: '/settings/notifications/discord',
|
route: '/settings/notifications/discord',
|
||||||
regex: /\/settings\/notifications\/discord/,
|
regex: /\/settings\/notifications\/discord/,
|
||||||
|
hidden: !data?.discordEnabled,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: 'Pushbullet',
|
text: 'Pushbullet',
|
||||||
|
@@ -67,7 +67,9 @@ const UserSettings: React.FC = ({ children }) => {
|
|||||||
? '/settings/notifications/email'
|
? '/settings/notifications/email'
|
||||||
: data?.webPushEnabled
|
: data?.webPushEnabled
|
||||||
? '/settings/notifications/webpush'
|
? '/settings/notifications/webpush'
|
||||||
: '/settings/notifications/discord',
|
: data?.discordEnabled
|
||||||
|
? '/settings/notifications/discord'
|
||||||
|
: '/settings/notifications/pushbullet',
|
||||||
regex: /\/settings\/notifications/,
|
regex: /\/settings\/notifications/,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@@ -891,6 +891,8 @@
|
|||||||
"components.UserProfile.UserSettings.UserGeneralSettings.accounttype": "Account Type",
|
"components.UserProfile.UserSettings.UserGeneralSettings.accounttype": "Account Type",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.admin": "Admin",
|
"components.UserProfile.UserSettings.UserGeneralSettings.admin": "Admin",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.applanguage": "Display Language",
|
"components.UserProfile.UserSettings.UserGeneralSettings.applanguage": "Display Language",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.discordId": "Discord User ID",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.discordIdTip": "The <FindDiscordIdLink>multi-digit ID number</FindDiscordIdLink> associated with your Discord user account",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.displayName": "Display Name",
|
"components.UserProfile.UserSettings.UserGeneralSettings.displayName": "Display Name",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.enableOverride": "Override Global Limit",
|
"components.UserProfile.UserSettings.UserGeneralSettings.enableOverride": "Override Global Limit",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.general": "General",
|
"components.UserProfile.UserSettings.UserGeneralSettings.general": "General",
|
||||||
@@ -909,8 +911,9 @@
|
|||||||
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsFailure": "Something went wrong while saving settings.",
|
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsFailure": "Something went wrong while saving settings.",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsSuccess": "Settings saved successfully!",
|
"components.UserProfile.UserSettings.UserGeneralSettings.toastSettingsSuccess": "Settings saved successfully!",
|
||||||
"components.UserProfile.UserSettings.UserGeneralSettings.user": "User",
|
"components.UserProfile.UserSettings.UserGeneralSettings.user": "User",
|
||||||
|
"components.UserProfile.UserSettings.UserGeneralSettings.validationDiscordId": "You must provide a valid Discord user ID",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.discordId": "User ID",
|
"components.UserProfile.UserSettings.UserNotificationSettings.discordId": "User ID",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.discordIdTip": "The <FindDiscordIdLink>ID number</FindDiscordIdLink> for your user account",
|
"components.UserProfile.UserSettings.UserNotificationSettings.discordIdTip": "The <FindDiscordIdLink>multi-digit ID number</FindDiscordIdLink> associated with your user account",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.discordsettingsfailed": "Discord notification settings failed to save.",
|
"components.UserProfile.UserSettings.UserNotificationSettings.discordsettingsfailed": "Discord notification settings failed to save.",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.discordsettingssaved": "Discord notification settings saved successfully!",
|
"components.UserProfile.UserSettings.UserNotificationSettings.discordsettingssaved": "Discord notification settings saved successfully!",
|
||||||
"components.UserProfile.UserSettings.UserNotificationSettings.email": "Email",
|
"components.UserProfile.UserSettings.UserNotificationSettings.email": "Email",
|
||||||
|
Reference in New Issue
Block a user