Fix ImageProcessing

This commit is contained in:
glax 2025-05-19 20:24:30 +02:00
parent dcf596df84
commit 7cdc31fedb
3 changed files with 80 additions and 93 deletions

View File

@ -23,7 +23,6 @@ export default function ImageProcessing({backendSettings}: {backendSettings?: IB
const valueChanged = (e : React.ChangeEvent<HTMLInputElement>) => { const valueChanged = (e : React.ChangeEvent<HTMLInputElement>) => {
setColor("warning"); setColor("warning");
clearTimeout(timerRef.current); clearTimeout(timerRef.current);
console.log(e);
timerRef.current = setTimeout(() => { timerRef.current = setTimeout(() => {
UpdateAprilFoolsMode(e.target.checked); UpdateAprilFoolsMode(e.target.checked);
}, 1000); }, 1000);
@ -33,14 +32,14 @@ export default function ImageProcessing({backendSettings}: {backendSettings?: IB
setValue(backendSettings?.aprilFoolsMode??false); setValue(backendSettings?.aprilFoolsMode??false);
}, [backendSettings]); }, [backendSettings]);
const UpdateAprilFoolsMode = useCallback((value: boolean) => { const UpdateAprilFoolsMode = useCallback((val: boolean) => {
UpdateAprilFoolsToggle(apiUri, value) UpdateAprilFoolsToggle(apiUri, val)
.then(() => GetAprilFoolsToggle(apiUri)) .then(() => GetAprilFoolsToggle(apiUri))
.then((val) => setValue(val)) .then((val) => setValue(val))
.then(() => setColor("success")) .then(() => setColor("success"))
.catch(() => setColor("danger")) .catch(() => setColor("danger"))
.finally(() => setLoading(false)); .finally(() => setLoading(false));
}, [apiUri, value]); }, [apiUri]);
return ( return (
<Accordion> <Accordion>

View File

@ -1,113 +1,101 @@
import IBackendSettings from "../../api/types/IBackendSettings.ts"; import IBackendSettings from "../../api/types/IBackendSettings.ts";
import {useCallback, useContext, useState} from "react"; import {ChangeEvent, useCallback, useContext, useEffect, useRef, useState} from "react";
import {ApiUriContext} from "../../api/fetchApi.tsx"; import {ApiUriContext} from "../../api/fetchApi.tsx";
import { import {
Accordion, Accordion,
AccordionDetails, AccordionDetails,
AccordionSummary, AccordionSummary, ColorPaletteProp, Input, Stack, Switch, Typography,
ColorPaletteProp,
Input,
Switch,
Typography
} from "@mui/joy"; } from "@mui/joy";
import * as React from "react"; import {
import {UpdateBWImageToggle, UpdateImageCompressionValue} from "../../api/BackendSettings.tsx"; GetBWImageToggle,
GetImageCompressionValue,
UpdateBWImageToggle,
UpdateImageCompressionValue
} from "../../api/BackendSettings.tsx";
export default function ImageProcessing({backendSettings}: {backendSettings?: IBackendSettings}) { export default function ImageProcessing ({backendSettings}: { backendSettings?: IBackendSettings }) {
const apiUri = useContext(ApiUriContext); const apiUri = useContext(ApiUriContext);
const [loadingBw, setLoadingBw] = useState<boolean>(false); useEffect(() => {
const [bwInputColor, setBwInputcolor] = useState<ColorPaletteProp>("neutral"); setBwImages(backendSettings?.bwImages??false);
setCompression(backendSettings?.compression??100);
}, [backendSettings]);
const timerRefBw = React.useRef<ReturnType<typeof setTimeout>>(undefined); const [bwImages, setBwImages] = useState<boolean>(backendSettings?.bwImages??false);
const bwChanged = (e : React.ChangeEvent<HTMLInputElement>) => { const [bwImagesLoading, setBwImagesLoading] = useState(false);
setBwInputcolor("warning"); const [bwImagesColor, setBwImagesColor] = useState<ColorPaletteProp>("neutral");
clearTimeout(timerRefBw.current); const bwTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);
console.log(e); const bwValueChanged = (e : ChangeEvent<HTMLInputElement>) => {
timerRefBw.current = setTimeout(() => { setBwImages(e.target.checked);
UpdateBw(e.target.checked); setBwImagesColor("warning");
clearTimeout(bwTimerRef.current);
bwTimerRef.current = setTimeout(() => {
UpdateBwImages(e.target.checked);
}, 1000); }, 1000);
} }
const UpdateBwImages = useCallback((val : boolean) => {
setBwImagesLoading(true);
UpdateBWImageToggle(apiUri, val)
.then(() => GetBWImageToggle(apiUri))
.then(setBwImages)
.then(() => setBwImagesColor("success"))
.catch(() => setBwImagesColor("danger"))
.finally(() => setBwImagesLoading(false));
},[apiUri]);
const UpdateBw = useCallback((value: boolean) => { const [compression, setCompression] = useState<number>(backendSettings?.compression??100);
UpdateBWImageToggle(apiUri, value) const [compressionLoading, setCompressionLoading] = useState(false);
.then(() => setBwInputcolor("success")) const [compressionColor, setCompressionColor] = useState<ColorPaletteProp>("neutral");
.catch(() => setBwInputcolor("danger")) const compressionTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);
.finally(() => setLoadingBw(false)); const compressionCheckedChanged = (e : ChangeEvent<HTMLInputElement>) => {
}, [apiUri]); setCompressionColor("warning");
if(!e.target.checked)
const [loadingCompression, setLoadingCompression] = useState<boolean>(false); setCompression(100);
const [compressionInputColor, setCompressionInputColor] = useState<ColorPaletteProp>("neutral"); else
const [compressionEnabled, setCompressionEnabled] = useState<boolean>((backendSettings?.compression??100) < 100); setCompression(50);
const [compressionValue, setCompressionValue] = useState<number|undefined>(backendSettings?.compression); clearTimeout(compressionTimerRef.current);
bwTimerRef.current = setTimeout(() => {
const timerRefCompression = React.useRef<ReturnType<typeof setTimeout>>(undefined); UpdateImageCompression(e.target.checked ? 50 : 100);
const compressionLevelChanged = (e : React.ChangeEvent<HTMLInputElement>) => {
setCompressionInputColor("warning");
setCompressionValue(Number.parseInt(e.target.value));
clearTimeout(timerRefCompression.current);
console.log(e);
timerRefCompression.current = setTimeout(() => {
UpdateCompressionLevel(Number.parseInt(e.target.value));
}, 1000); }, 1000);
} }
const compressionValueChanged = (e : ChangeEvent<HTMLInputElement>) => {
const compressionEnableChanged = (e : React.ChangeEvent<HTMLInputElement>) => { setCompressionColor("warning");
setCompressionInputColor("warning"); setCompression(parseInt(e.target.value));
setCompressionEnabled(e.target.checked); clearTimeout(compressionTimerRef.current);
clearTimeout(timerRefCompression.current); bwTimerRef.current = setTimeout(() => {
timerRefCompression.current = setTimeout(() => { UpdateImageCompression(parseInt(e.target.value));
UpdateCompressionLevel(e.target.checked ? compressionValue! : 100);
}, 1000); }, 1000);
} }
const UpdateImageCompression = useCallback((val : number) => {
const UpdateCompressionLevel = useCallback((value: number)=> { setCompressionLoading(true);
setLoadingCompression(true); UpdateImageCompressionValue(apiUri, val)
UpdateImageCompressionValue(apiUri, value) .then(() => GetImageCompressionValue(apiUri))
.then(() => { .then(setCompression)
setCompressionInputColor("success"); .then(() => setCompressionColor("success"))
setCompressionValue(value); .catch(() => setCompressionColor("danger"))
}) .finally(() => setCompressionLoading(false));
.catch(() => setCompressionInputColor("danger")) },[apiUri]);
.finally(() => setLoadingCompression(false));
}, [apiUri]);
return ( return (
<Accordion> <Accordion>
<AccordionSummary>Image Processing</AccordionSummary> <AccordionSummary>Image Processing</AccordionSummary>
<AccordionDetails> <AccordionDetails>
<Typography endDecorator={ <Stack>
<Switch disabled={backendSettings === undefined || loadingBw} <Typography endDecorator={
onChange={bwChanged} <Switch disabled={backendSettings === undefined || bwImagesLoading}
color={bwInputColor} onChange={bwValueChanged}
defaultChecked={backendSettings?.bwImages} /> color={bwImagesColor}
}> checked={bwImages} />
Black and White Images }>B/W Images</Typography>
</Typography> <Typography endDecorator={
<Typography endDecorator={ <Input type={"number"} value={compression} onChange={compressionValueChanged} startDecorator={
<Switch disabled={backendSettings === undefined || loadingCompression} <Switch disabled={backendSettings === undefined || compressionLoading}
onChange={compressionEnableChanged} onChange={compressionCheckedChanged}
color={compressionInputColor} color={compressionColor}
defaultChecked={compressionEnabled} endDecorator={ checked={compression < 100} />
<Input } />
defaultValue={backendSettings?.compression} }>Compression</Typography>
disabled={!compressionEnabled || loadingCompression} </Stack>
onChange={compressionLevelChanged}
color={compressionInputColor}
onKeyDown={(e) => {
if(e.key === "Enter") {
clearTimeout(timerRefCompression.current);
// @ts-ignore
UpdateCompressionLevel(Number.parseInt(e.target.value));
}
}}
sx={{width:"70px"}}
/>
} />
}>
Image Compression
</Typography>
</AccordionDetails> </AccordionDetails>
</Accordion> </Accordion>
); );

View File

@ -84,7 +84,7 @@ export default function Settings({open, setOpen, setApiUri, setConnected}:{open:
}, [checking]); }, [checking]);
return ( return (
<Drawer size={"md"} open={open} onClose={() => setOpen(false)}> <Drawer size={"lg"} open={open} onClose={() => setOpen(false)}>
<ModalClose /> <ModalClose />
<DialogTitle>Settings</DialogTitle> <DialogTitle>Settings</DialogTitle>
<DialogContent> <DialogContent>