import { ExpandMoreRounded } from "@mui/icons-material"; import { LoadingButton } from "@mui/lab"; import { AccordionDetails, Box, FormControl, FormControlLabel, InputAdornment, Typography } from "@mui/material"; import { useSnackbar } from "notistack"; import * as React from "react"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { sendTestThumbGeneratorExecutable } from "../../../../api/api.ts"; import { useAppDispatch } from "../../../../redux/hooks.ts"; import { isTrueVal } from "../../../../session/utils.ts"; import SizeInput from "../../../Common/SizeInput.tsx"; import { DefaultCloseAction } from "../../../Common/Snackbar/snackbar.tsx"; import { DenseFilledTextField, StyledCheckbox } from "../../../Common/StyledComponents.tsx"; import SettingForm from "../../../Pages/Setting/SettingForm.tsx"; import { NoMarginHelperText, SettingSectionContent } from "../Settings.tsx"; import { AccordionSummary, StyledAccordion } from "../UserSession/SSOSettings.tsx"; export interface GeneratorsProps { values: { [key: string]: any; }; setSetting: (v: { [key: string]: any }) => void; } interface GeneratorRenderProps { name: string; des: string; enableFlag?: string; executableSetting?: string; maxSizeSetting?: string; readOnly?: boolean; inputs?: { name: string; label: string; des: string; required?: boolean; }[]; } const generators: GeneratorRenderProps[] = [ { name: "policyBuiltin", des: "policyBuiltinDes", readOnly: true, }, { name: "musicCover", des: "musicCoverDes", enableFlag: "thumb_music_cover_enabled", maxSizeSetting: "thumb_music_cover_max_size", inputs: [ { name: "thumb_music_cover_exts", label: "generatorExts", des: "generatorExtsDes", }, ], }, { name: "libreOffice", des: "libreOfficeDes", enableFlag: "thumb_libreoffice_enabled", maxSizeSetting: "thumb_libreoffice_max_size", executableSetting: "thumb_libreoffice_path", inputs: [ { name: "thumb_libreoffice_exts", label: "generatorExts", des: "generatorExtsDes", }, ], }, { name: "libraw", des: "librawDes", enableFlag: "thumb_libraw_enabled", maxSizeSetting: "thumb_libraw_max_size", executableSetting: "thumb_libraw_path", inputs: [ { name: "thumb_libraw_exts", label: "generatorExts", des: "generatorExtsDes", }, ], }, { name: "vips", des: "vipsDes", enableFlag: "thumb_vips_enabled", maxSizeSetting: "thumb_vips_max_size", executableSetting: "thumb_vips_path", inputs: [ { name: "thumb_vips_exts", label: "generatorExts", des: "generatorExtsDes", }, ], }, { name: "ffmpeg", des: "ffmpegDes", enableFlag: "thumb_ffmpeg_enabled", maxSizeSetting: "thumb_ffmpeg_max_size", executableSetting: "thumb_ffmpeg_path", inputs: [ { name: "thumb_ffmpeg_exts", label: "generatorExts", des: "generatorExtsDes", }, { name: "thumb_ffmpeg_seek", label: "ffmpegSeek", des: "ffmpegSeekDes", required: true, }, { name: "thumb_ffmpeg_extra_args", label: "ffmpegExtraArgs", des: "ffmpegExtraArgsDes", }, ], }, { name: "cloudreveBuiltin", maxSizeSetting: "thumb_builtin_max_size", des: "cloudreveBuiltinDes", enableFlag: "thumb_builtin_enabled", }, ]; const Generators = ({ values, setSetting }: GeneratorsProps) => { const { t } = useTranslation("dashboard"); const dispatch = useAppDispatch(); const [testing, setTesting] = useState(false); const { enqueueSnackbar } = useSnackbar(); const handleEnableChange = (name: string) => (e: React.ChangeEvent) => { setSetting({ [name]: e.target.checked ? "1" : "0", }); const newValues = { ...values, [name]: e.target.checked ? "1" : "0" }; if ( (newValues["thumb_libreoffice_enabled"] === "1" || newValues["thumb_music_cover_enabled"] === "1") && newValues["thumb_builtin_enabled"] === "0" && newValues["thumb_vips_enabled"] === "0" ) { enqueueSnackbar({ message: t("settings.thumbDependencyWarning"), variant: "warning", action: DefaultCloseAction, }); } }; const doTest = (name: string, executable: string) => { setTesting(true); dispatch( sendTestThumbGeneratorExecutable({ name, executable, }), ) .then((res) => { enqueueSnackbar({ message: t("settings.executableTestSuccess", { version: res }), variant: "success", action: DefaultCloseAction, }); }) .finally(() => { setTesting(false); }); }; return ( {generators.map((g) => ( }> event.stopPropagation()} onFocus={(event) => event.stopPropagation()} control={ } label={t(`settings.${g.name}`)} disabled={g.readOnly} /> {t(`settings.${g.des}`)} {g.executableSetting && ( doTest(g.name, values[g.executableSetting ?? ""])} loading={testing} color="primary" > {t("settings.executableTest")} ), }} onChange={(e) => setSetting({ [g.executableSetting ?? ""]: e.target.value, }) } /> {t("settings.executableDes")} )} {g.maxSizeSetting && ( setSetting({ [g.maxSizeSetting ?? ""]: e.toString(), }) } /> {t("settings.thumbMaxSizeDes")} )} {g.inputs?.map((input) => ( setSetting({ [input.name]: e.target.value, }) } required={!!input.required} /> {t(`settings.${input.des}`)} ))} ))} ); }; export default Generators;