From 6340c5ad031f2c286dbb6202932fc259d0bd4343 Mon Sep 17 00:00:00 2001 From: glax Date: Wed, 2 Apr 2025 00:06:57 +0200 Subject: [PATCH] Image Processing Settings --- .../Components/Settings/ImageProcessing.tsx | 114 ++++++++++++++++++ tranga-website/src/Settings.tsx | 2 + 2 files changed, 116 insertions(+) create mode 100644 tranga-website/src/Components/Settings/ImageProcessing.tsx diff --git a/tranga-website/src/Components/Settings/ImageProcessing.tsx b/tranga-website/src/Components/Settings/ImageProcessing.tsx new file mode 100644 index 0000000..b40335b --- /dev/null +++ b/tranga-website/src/Components/Settings/ImageProcessing.tsx @@ -0,0 +1,114 @@ +import IBackendSettings from "../../api/types/IBackendSettings.ts"; +import {useCallback, useContext, useState} from "react"; +import {ApiUriContext} from "../../api/fetchApi.tsx"; +import { + Accordion, + AccordionDetails, + AccordionSummary, + ColorPaletteProp, + Input, + Switch, + Typography +} from "@mui/joy"; +import * as React from "react"; +import {UpdateBWImageToggle, UpdateImageCompressionValue} from "../../api/BackendSettings.tsx"; + +export default function ImageProcessing({backendSettings}: {backendSettings?: IBackendSettings}) { + const apiUri = useContext(ApiUriContext); + + const [loadingBw, setLoadingBw] = useState(false); + const [bwInputColor, setBwInputcolor] = useState("neutral"); + + const timerRefBw = React.useRef>(undefined); + const bwChanged = (e : React.ChangeEvent) => { + setBwInputcolor("warning"); + clearTimeout(timerRefBw.current); + console.log(e); + timerRefBw.current = setTimeout(() => { + UpdateBw(e.target.checked); + }, 1000); + } + + const UpdateBw = useCallback((value: boolean) => { + UpdateBWImageToggle(apiUri, value) + .then(() => setBwInputcolor("success")) + .catch(() => setBwInputcolor("danger")) + .finally(() => setLoadingBw(false)); + }, [apiUri]); + + const [loadingCompression, setLoadingCompression] = useState(false); + const [compressionInputColor, setCompressionInputColor] = useState("neutral"); + const [compressionEnabled, setCompressionEnabled] = useState((backendSettings?.compression??100) < 100); + const [compressionValue, setCompressionValue] = useState(backendSettings?.compression); + + const timerRefCompression = React.useRef>(undefined); + const compressionLevelChanged = (e : React.ChangeEvent) => { + setCompressionInputColor("warning"); + setCompressionValue(Number.parseInt(e.target.value)); + clearTimeout(timerRefCompression.current); + + console.log(e); + timerRefCompression.current = setTimeout(() => { + UpdateCompressionLevel(Number.parseInt(e.target.value)); + }, 1000); + } + + const compressionEnableChanged = (e : React.ChangeEvent) => { + setCompressionInputColor("warning"); + setCompressionEnabled(e.target.checked); + clearTimeout(timerRefCompression.current); + timerRefCompression.current = setTimeout(() => { + UpdateCompressionLevel(e.target.checked ? compressionValue! : 100); + }, 1000); + } + + const UpdateCompressionLevel = useCallback((value: number)=> { + setLoadingCompression(true); + UpdateImageCompressionValue(apiUri, value) + .then(() => { + setCompressionInputColor("success"); + setCompressionValue(value); + }) + .catch(() => setCompressionInputColor("danger")) + .finally(() => setLoadingCompression(false)); + }, [apiUri]); + + return ( + + Image Processing + + + }> + Black and White Images + + { + if(e.key === "Enter") { + clearTimeout(timerRefCompression.current); + // @ts-ignore + UpdateCompressionLevel(Number.parseInt(e.target.value)); + } + }} + sx={{width:"70px"}} + /> + } /> + }> + Image Compression + + + + ); +} \ No newline at end of file diff --git a/tranga-website/src/Settings.tsx b/tranga-website/src/Settings.tsx index f05634a..909c527 100644 --- a/tranga-website/src/Settings.tsx +++ b/tranga-website/src/Settings.tsx @@ -15,6 +15,7 @@ import {ApiUriContext} from "./api/fetchApi.tsx"; import IBackendSettings from "./api/types/IBackendSettings.ts"; import { GetSettings } from './api/BackendSettings.tsx'; import UserAgent from "./Components/Settings/UserAgent.tsx"; +import ImageProcessing from "./Components/Settings/ImageProcessing.tsx"; const checkConnection = async (apiUri: string): Promise =>{ return fetch(`${apiUri}/swagger/v2/swagger.json`, @@ -101,6 +102,7 @@ export default function Settings({open, setOpen, setApiUri, setConnected}:{open: +