import React from 'react'; import useSWR from 'swr'; import LoadingSpinner from '../Common/LoadingSpinner'; import type { MainSettings } from '../../../server/lib/settings'; import CopyButton from './CopyButton'; import { Form, Formik, Field } from 'formik'; import axios from 'axios'; import Button from '../Common/Button'; import { defineMessages, useIntl } from 'react-intl'; import { useUser, Permission } from '../../hooks/useUser'; import { useToasts } from 'react-toast-notifications'; import { messages as permissionMessages } from '../UserEdit'; import PermissionOption, { PermissionItem } from '../PermissionOption'; import Badge from '../Common/Badge'; import globalMessages from '../../i18n/globalMessages'; const messages = defineMessages({ generalsettings: 'General Settings', generalsettingsDescription: 'These are settings related to general Overseerr configuration.', save: 'Save Changes', saving: 'Saving...', apikey: 'API Key', applicationurl: 'Application URL', toastApiKeySuccess: 'New API Key generated!', toastApiKeyFailure: 'Something went wrong generating a new API Key.', toastSettingsSuccess: 'Settings saved.', toastSettingsFailure: 'Something went wrong saving settings.', defaultPermissions: 'Default User Permissions', hideAvailable: 'Hide available media', }); const SettingsMain: React.FC = () => { const { addToast } = useToasts(); const { hasPermission: userHasPermission } = useUser(); const intl = useIntl(); const { data, error, revalidate } = useSWR( '/api/v1/settings/main' ); const regenerate = async () => { try { await axios.get('/api/v1/settings/main/regenerate'); revalidate(); addToast(intl.formatMessage(messages.toastApiKeySuccess), { autoDismiss: true, appearance: 'success', }); } catch (e) { addToast(intl.formatMessage(messages.toastApiKeyFailure), { autoDismiss: true, appearance: 'error', }); } }; if (!data && !error) { return ; } const permissionList: PermissionItem[] = [ { id: 'admin', name: intl.formatMessage(permissionMessages.admin), description: intl.formatMessage(permissionMessages.adminDescription), permission: Permission.ADMIN, }, { id: 'settings', name: intl.formatMessage(permissionMessages.settings), description: intl.formatMessage(permissionMessages.settingsDescription), permission: Permission.MANAGE_SETTINGS, }, { id: 'users', name: intl.formatMessage(permissionMessages.users), description: intl.formatMessage(permissionMessages.usersDescription), permission: Permission.MANAGE_USERS, }, { id: 'managerequest', name: intl.formatMessage(permissionMessages.managerequests), description: intl.formatMessage( permissionMessages.managerequestsDescription ), permission: Permission.MANAGE_REQUESTS, children: [ { id: 'advancedrequest', name: intl.formatMessage(permissionMessages.advancedrequest), description: intl.formatMessage( permissionMessages.advancedrequestDescription ), permission: Permission.REQUEST_ADVANCED, }, ], }, { id: 'request', name: intl.formatMessage(permissionMessages.request), description: intl.formatMessage(permissionMessages.requestDescription), permission: Permission.REQUEST, }, { id: 'request4k', name: intl.formatMessage(permissionMessages.request4k), description: intl.formatMessage(permissionMessages.request4kDescription), permission: Permission.REQUEST_4K, children: [ { id: 'request4k-movies', name: intl.formatMessage(permissionMessages.request4kMovies), description: intl.formatMessage( permissionMessages.request4kMoviesDescription ), permission: Permission.REQUEST_4K_MOVIE, }, { id: 'request4k-tv', name: intl.formatMessage(permissionMessages.request4kTv), description: intl.formatMessage( permissionMessages.request4kTvDescription ), permission: Permission.REQUEST_4K_TV, }, ], }, { id: 'autoapprove', name: intl.formatMessage(permissionMessages.autoapprove), description: intl.formatMessage( permissionMessages.autoapproveDescription ), permission: Permission.AUTO_APPROVE, children: [ { id: 'autoapprovemovies', name: intl.formatMessage(permissionMessages.autoapproveMovies), description: intl.formatMessage( permissionMessages.autoapproveMoviesDescription ), permission: Permission.AUTO_APPROVE_MOVIE, }, { id: 'autoapprovetv', name: intl.formatMessage(permissionMessages.autoapproveSeries), description: intl.formatMessage( permissionMessages.autoapproveSeriesDescription ), permission: Permission.AUTO_APPROVE_TV, }, ], }, ]; return ( <>

{intl.formatMessage(messages.generalsettings)}

{intl.formatMessage(messages.generalsettingsDescription)}

{ try { await axios.post('/api/v1/settings/main', { applicationUrl: values.applicationUrl, defaultPermissions: values.defaultPermissions, hideAvailable: values.hideAvailable, }); addToast(intl.formatMessage(messages.toastSettingsSuccess), { autoDismiss: true, appearance: 'success', }); } catch (e) { addToast(intl.formatMessage(messages.toastSettingsFailure), { autoDismiss: true, appearance: 'error', }); } finally { revalidate(); } }} > {({ isSubmitting, values, setFieldValue }) => { return (
{userHasPermission(Permission.ADMIN) && (
)}
{ setFieldValue('hideAvailable', !values.hideAvailable); }} className="w-6 h-6 text-indigo-600 transition duration-150 ease-in-out rounded-md form-checkbox" />
{intl.formatMessage(messages.defaultPermissions)}
{permissionList.map((permissionItem) => ( setFieldValue( 'defaultPermissions', newPermissions ) } /> ))}
); }}
); }; export default SettingsMain;