import IFrontendSettings from "./interfaces/IFrontendSettings"; import '../styles/settings.css'; import '../styles/react-toggle.css'; import React, {useEffect, useRef, useState} from "react"; import INotificationConnector, {NotificationConnectorItem} from "./interfaces/INotificationConnector"; import NotificationConnectorFunctions from "./NotificationConnectorFunctions"; import ILocalLibrary, {LocalLibraryItem} from "./interfaces/ILocalLibrary"; import LocalLibraryFunctions from "./LocalLibraryFunctions"; import IBackendSettings from "./interfaces/IBackendSettings"; import BackendSettings from "./BackendSettingsFunctions"; import Toggle from "react-toggle"; import Loader from "./Loader"; import {RequestType} from "./interfaces/IRequestLimits"; import IMangaConnector from "./interfaces/IMangaConnector"; import {MangaConnectorFunctions} from "./MangaConnectorFunctions"; export default function Settings({ backendConnected, apiUri, frontendSettings, setFrontendSettings } : { backendConnected: boolean, apiUri: string, frontendSettings: IFrontendSettings, setFrontendSettings: (settings: IFrontendSettings) => void }) { const [showSettings, setShowSettings] = useState(false); const [loadingBackend, setLoadingBackend] = useState(false); const [backendSettings, setBackendSettings] = useState(null); const [notificationConnectors, setNotificationConnectors] = useState([]); const [mangaConnectors,setMangaConnectors] = useState([]); const [localLibraries, setLocalLibraries] = useState([]); const [chapterNamingScheme, setChapterNamingScheme] = useState(""); useEffect(() => { if(!backendConnected) return; NotificationConnectorFunctions.GetNotificationConnectors(apiUri).then(setNotificationConnectors); LocalLibraryFunctions.GetLibraries(apiUri).then(setLocalLibraries); BackendSettings.GetSettings(apiUri).then(setBackendSettings); MangaConnectorFunctions.GetAllConnectors(apiUri).then(setMangaConnectors); }, [backendConnected, showSettings]); const dateToStr = (x: Date) => { const ret = (x.getHours() < 10 ? "0" + x.getHours() : x.getHours()) + ":" + (x.getMinutes() < 10 ? "0" + x.getMinutes() : x.getMinutes()); return ret; } const ChangeRequestLimit = (requestType: RequestType, limit: number) => { if(backendSettings === null) return; setLoadingBackend(true); BackendSettings.UpdateRequestLimit(apiUri, requestType, limit) .then(() => setBackendSettings({...backendSettings, [requestType]: requestType})) .finally(() => setLoadingBackend(false)); } const ref : React.LegacyRef | undefined = useRef(null); return (
setShowSettings(true)}> settings-cogwheel
{showSettings ?

Settings

Close Settings setShowSettings(false)}/>

ApiUri

setFrontendSettings({...frontendSettings, apiUri:e.currentTarget.value})} id="ApiUri" />

Default Job-Interval

setFrontendSettings({...frontendSettings, jobInterval: new Date(e.currentTarget.valueAsNumber-60*60*1000) ?? frontendSettings.jobInterval})}/>

Chapter Naming-Scheme

setChapterNamingScheme(e.target.value)} />

B/W Images

{ if(backendSettings === null) return; setLoadingBackend(true); BackendSettings.UpdateBWImageToggle(apiUri, e.target.checked) .then(() => setBackendSettings({...backendSettings, bwImages: e.target.checked})) .finally(() => setLoadingBackend(false)); }} />

April Fools Mode

{ if(backendSettings === null) return; setLoadingBackend(true); BackendSettings.UpdateAprilFoolsToggle(apiUri, e.target.checked) .then(() => setBackendSettings({...backendSettings, aprilFoolsMode: e.target.checked})) .finally(() => setLoadingBackend(false)); }} />

Image Compression

{ if(backendSettings === null) return; setLoadingBackend(true); BackendSettings.UpdateImageCompressionValue(apiUri, e.target.checked ? 40 : 100) .then(() => setBackendSettings({...backendSettings, compression: e.target.checked ? 40 : 100})) .then(() => { if(ref.current != null){ ref.current.value = e.target.checked ? "40" : "100"; ref.current.disabled = !e.target.checked; } }) .finally(() => setLoadingBackend(false)); }} /> { if(backendSettings === null) return; setLoadingBackend(true); BackendSettings.UpdateImageCompressionValue(apiUri, e.currentTarget.valueAsNumber) .then(() => setBackendSettings({...backendSettings, compression: e.currentTarget.valueAsNumber})) .finally(() => setLoadingBackend(false)); }} />

User Agent

{ if(backendSettings === null) return; setLoadingBackend(true); BackendSettings.UpdateUserAgent(apiUri, e.currentTarget.value) .then(() => setBackendSettings({...backendSettings, userAgent: e.currentTarget.value})) .finally(() => setLoadingBackend(false)); }} />

Request Limits:

ChangeRequestLimit(RequestType.Default, e.currentTarget.valueAsNumber)} /> ChangeRequestLimit(RequestType.MangaInfo, e.currentTarget.valueAsNumber)} /> ChangeRequestLimit(RequestType.MangaDexFeed, e.currentTarget.valueAsNumber)} /> ChangeRequestLimit(RequestType.MangaDexImage, e.currentTarget.valueAsNumber)} /> ChangeRequestLimit(RequestType.MangaImage, e.currentTarget.valueAsNumber)} /> ChangeRequestLimit(RequestType.MangaCover, e.currentTarget.valueAsNumber)} />
{mangaConnectors.map(mc => { return (
{mc.name} { MangaConnectorFunctions.SetConnectorEnabled(apiUri, mc.name, e.currentTarget.checked); }} />
); })}

Notification Connectors:

{notificationConnectors.map(c => )}

Local Libraries:

{localLibraries.map(l => )}
: null }
); }