@@ -201,11 +348,28 @@ const TvDetails: React.FC
= ({ tv }) => {
{data.mediaInfo && data.mediaInfo.status !== MediaStatus.UNKNOWN && (
-
+ 0}
+ plexUrl={data.mediaInfo?.plexUrl}
+ plexUrl4k={data.mediaInfo?.plexUrl4k}
+ />
)}
-
+ 0}
+ plexUrl={data.mediaInfo?.plexUrl}
+ plexUrl4k={
+ data.mediaInfo?.plexUrl4k &&
+ (hasPermission(Permission.REQUEST_4K) ||
+ hasPermission(Permission.REQUEST_4K_TV))
+ ? data.mediaInfo.plexUrl4k
+ : undefined
+ }
+ />
@@ -221,37 +385,86 @@ const TvDetails: React.FC = ({ tv }) => {
diff --git a/src/components/UserEdit/index.tsx b/src/components/UserEdit/index.tsx
index d1ee8720..5c90eb76 100644
--- a/src/components/UserEdit/index.tsx
+++ b/src/components/UserEdit/index.tsx
@@ -1,66 +1,34 @@
import React, { useState, useEffect } from 'react';
import { useRouter } from 'next/router';
import LoadingSpinner from '../Common/LoadingSpinner';
-import { Permission, useUser } from '../../hooks/useUser';
+import { useUser } from '../../hooks/useUser';
import Button from '../Common/Button';
import { useIntl, defineMessages, FormattedMessage } from 'react-intl';
import axios from 'axios';
import { useToasts } from 'react-toast-notifications';
import Header from '../Common/Header';
-import PermissionOption, { PermissionItem } from '../PermissionOption';
+import PermissionEdit from '../PermissionEdit';
+import { Field, Form, Formik } from 'formik';
+import * as Yup from 'yup';
+import { UserType } from '../../../server/constants/user';
export const messages = defineMessages({
edituser: 'Edit User',
- username: 'Username',
+ plexUsername: 'Plex Username',
+ username: 'Display Name',
avatar: 'Avatar',
email: 'Email',
permissions: 'Permissions',
- admin: 'Admin',
- adminDescription:
- 'Full administrator access. Bypasses all permission checks.',
- users: 'Manage Users',
- usersDescription:
- 'Grants permission to manage Overseerr users. Users with this permission cannot modify users with Administrator privilege, or grant it.',
- settings: 'Manage Settings',
- settingsDescription:
- 'Grants permission to modify all Overseerr settings. A user must have this permission to grant it to others.',
- managerequests: 'Manage Requests',
- managerequestsDescription:
- 'Grants permission to manage Overseerr requests. This includes approving and denying requests.',
- request: 'Request',
- requestDescription: 'Grants permission to request movies and series.',
- vote: 'Vote',
- voteDescription:
- 'Grants permission to vote on requests (voting not yet implemented)',
- autoapprove: 'Auto Approve',
- autoapproveDescription:
- 'Grants auto approval for any requests made by this user.',
- autoapproveMovies: 'Auto Approve Movies',
- autoapproveMoviesDescription:
- 'Grants auto approve for movie requests made by this user.',
- autoapproveSeries: 'Auto Approve Series',
- autoapproveSeriesDescription:
- 'Grants auto approve for series requests made by this user.',
- request4k: 'Request 4K',
- request4kDescription: 'Grants permission to request 4K movies and series.',
- request4kMovies: 'Request 4K Movies',
- request4kMoviesDescription: 'Grants permission to request 4K movies.',
- request4kTv: 'Request 4K Series',
- request4kTvDescription: 'Grants permission to request 4K Series.',
- advancedrequest: 'Advanced Requests',
- advancedrequestDescription:
- 'Grants permission to use advanced request options. (Ex. Changing servers/profiles/paths)',
save: 'Save',
- saving: 'Saving...',
+ saving: 'Saving…',
usersaved: 'User saved',
- userfail: 'Something went wrong saving the user.',
+ userfail: 'Something went wrong while saving the user.',
});
const UserEdit: React.FC = () => {
const router = useRouter();
const intl = useIntl();
const { addToast } = useToasts();
- const [isUpdating, setIsUpdating] = useState(false);
const { user: currentUser } = useUser();
const { user, error, revalidate } = useUser({
id: Number(router.query.userId),
@@ -75,244 +43,186 @@ const UserEdit: React.FC = () => {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [user]);
- const updateUser = async () => {
- try {
- setIsUpdating(true);
-
- await axios.put(`/api/v1/user/${user?.id}`, {
- permissions: currentPermission,
- email: user?.email,
- });
-
- addToast(intl.formatMessage(messages.usersaved), {
- appearance: 'success',
- autoDismiss: true,
- });
- } catch (e) {
- addToast(intl.formatMessage(messages.userfail), {
- appearance: 'error',
- autoDismiss: true,
- });
- throw new Error(`Something went wrong saving the user: ${e.message}`);
- } finally {
- revalidate();
- setIsUpdating(false);
- }
- };
-
if (!user && !error) {
return
;
}
- const permissionList: PermissionItem[] = [
- {
- id: 'admin',
- name: intl.formatMessage(messages.admin),
- description: intl.formatMessage(messages.adminDescription),
- permission: Permission.ADMIN,
- },
- {
- id: 'settings',
- name: intl.formatMessage(messages.settings),
- description: intl.formatMessage(messages.settingsDescription),
- permission: Permission.MANAGE_SETTINGS,
- },
- {
- id: 'users',
- name: intl.formatMessage(messages.users),
- description: intl.formatMessage(messages.usersDescription),
- permission: Permission.MANAGE_USERS,
- },
- {
- id: 'managerequest',
- name: intl.formatMessage(messages.managerequests),
- description: intl.formatMessage(messages.managerequestsDescription),
- permission: Permission.MANAGE_REQUESTS,
- children: [
- {
- id: 'advancedrequest',
- name: intl.formatMessage(messages.advancedrequest),
- description: intl.formatMessage(messages.advancedrequestDescription),
- permission: Permission.REQUEST_ADVANCED,
- },
- ],
- },
- {
- id: 'request',
- name: intl.formatMessage(messages.request),
- description: intl.formatMessage(messages.requestDescription),
- permission: Permission.REQUEST,
- },
- {
- id: 'request4k',
- name: intl.formatMessage(messages.request4k),
- description: intl.formatMessage(messages.request4kDescription),
- permission: Permission.REQUEST_4K,
- children: [
- {
- id: 'request4k-movies',
- name: intl.formatMessage(messages.request4kMovies),
- description: intl.formatMessage(messages.request4kMoviesDescription),
- permission: Permission.REQUEST_4K_MOVIE,
- },
- {
- id: 'request4k-tv',
- name: intl.formatMessage(messages.request4kTv),
- description: intl.formatMessage(messages.request4kTvDescription),
- permission: Permission.REQUEST_4K_TV,
- },
- ],
- },
- {
- id: 'autoapprove',
- name: intl.formatMessage(messages.autoapprove),
- description: intl.formatMessage(messages.autoapproveDescription),
- permission: Permission.AUTO_APPROVE,
- children: [
- {
- id: 'autoapprovemovies',
- name: intl.formatMessage(messages.autoapproveMovies),
- description: intl.formatMessage(
- messages.autoapproveMoviesDescription
- ),
- permission: Permission.AUTO_APPROVE_MOVIE,
- },
- {
- id: 'autoapprovetv',
- name: intl.formatMessage(messages.autoapproveSeries),
- description: intl.formatMessage(
- messages.autoapproveSeriesDescription
- ),
- permission: Permission.AUTO_APPROVE_TV,
- },
- ],
- },
- ];
+ const UserEditSchema = Yup.object().shape({
+ username: Yup.string(),
+ });
return (
- <>
-
-
-
-
-
-
-
-
-
-
+
{
+ try {
+ await axios.put(`/api/v1/user/${user?.id}`, {
+ permissions: currentPermission,
+ email: user?.email,
+ username: values.username,
+ });
+ addToast(intl.formatMessage(messages.usersaved), {
+ appearance: 'success',
+ autoDismiss: true,
+ });
+ } catch (e) {
+ addToast(intl.formatMessage(messages.userfail), {
+ appearance: 'error',
+ autoDismiss: true,
+ });
+ throw new Error(
+ `Something went wrong while saving the user: ${e.message}`
+ );
+ } finally {
+ revalidate();
+ }
+ }}
+ >
+ {({ isSubmitting, handleSubmit }) => (
+