import '../styles/settings.css'; import '../styles/react-toggle.css'; import React, {useEffect, useRef, useState} from "react"; import NotificationConnector from "./api/NotificationConnector"; import IBackendSettings from "./types/IBackendSettings"; import BackendSettings from "./api/BackendSettings"; import Toggle from "react-toggle"; import Loader from "./Loader"; import IMangaConnector from "./types/IMangaConnector"; import {MangaConnector} from "./api/MangaConnector"; import IFrontendSettings from "./types/IFrontendSettings"; import INotificationConnector from "./types/INotificationConnector"; import ILocalLibrary from "./types/ILocalLibrary"; import LocalLibrary from "./api/LocalLibrary"; import {RequestLimitType} from "./types/EnumRequestLimitType"; import NotificationConnectorItem from "./Elements/NotificationConnector"; import LocalLibraryItem from "./Elements/LocalLibrary"; 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; NotificationConnector.GetNotificationConnectors(apiUri).then(setNotificationConnectors); LocalLibrary.GetLibraries(apiUri).then(setLocalLibraries); BackendSettings.GetSettings(apiUri).then(setBackendSettings); MangaConnector.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: RequestLimitType, 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(RequestLimitType.Default, e.currentTarget.valueAsNumber)} /> ChangeRequestLimit(RequestLimitType.MangaInfo, e.currentTarget.valueAsNumber)} /> ChangeRequestLimit(RequestLimitType.MangaDexFeed, e.currentTarget.valueAsNumber)} /> ChangeRequestLimit(RequestLimitType.MangaDexImage, e.currentTarget.valueAsNumber)} /> ChangeRequestLimit(RequestLimitType.MangaImage, e.currentTarget.valueAsNumber)} /> ChangeRequestLimit(RequestLimitType.MangaCover, e.currentTarget.valueAsNumber)} />
{mangaConnectors.map(mc => { return (
{mc.name} { MangaConnector.SetConnectorEnabled(apiUri, mc.name, e.currentTarget.checked); }} />
); })}

Notification Connectors:

{notificationConnectors.map(c => )}

Local Libraries:

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