Files
kiss-translator/src/views/Options/Setting.js

294 lines
7.3 KiB
JavaScript
Raw Normal View History

2023-07-20 13:45:41 +08:00
import Box from "@mui/material/Box";
import Stack from "@mui/material/Stack";
import InputLabel from "@mui/material/InputLabel";
import TextField from "@mui/material/TextField";
import MenuItem from "@mui/material/MenuItem";
import FormControl from "@mui/material/FormControl";
import Select from "@mui/material/Select";
2023-09-01 11:03:53 +08:00
import Link from "@mui/material/Link";
2023-09-03 13:11:04 +08:00
import FormHelperText from "@mui/material/FormHelperText";
2023-08-30 18:05:37 +08:00
import { useSetting } from "../../hooks/Setting";
2023-08-31 00:18:57 +08:00
import { limitNumber } from "../../libs/utils";
2023-07-20 13:45:41 +08:00
import { useI18n } from "../../hooks/I18n";
2023-09-03 13:11:04 +08:00
import { apiTranslate } from "../../apis";
import { useAlert } from "../../hooks/Alert";
2023-09-03 22:18:33 +08:00
import CircularProgress from "@mui/material/CircularProgress";
2023-09-03 13:11:04 +08:00
import {
UI_LANGS,
URL_KISS_PROXY,
TRANS_NEWLINE_LENGTH,
CACHE_NAME,
OPT_TRANS_GOOGLE,
OPT_TRANS_DEEPL,
OPT_TRANS_OPENAI,
} from "../../config";
2023-09-03 22:18:33 +08:00
import { useState } from "react";
function TestLink({ translator, setting }) {
const i18n = useI18n();
const alert = useAlert();
const [loading, setLoading] = useState(false);
const handleApiTest = async () => {
try {
setLoading(true);
const [text] = await apiTranslate({
translator,
q: "hello world",
fromLang: "en",
toLang: "zh-CN",
setting,
});
if (!text) {
throw new Error("empty reault");
}
alert.success(i18n("test_success"));
} catch (err) {
alert.error(`${i18n("test_failed")}: ${err.message}`);
} finally {
setLoading(false);
}
};
if (loading) {
return <CircularProgress sx={{ marginLeft: "2em" }} size={12} />;
}
return (
<Link sx={{ marginLeft: "1em" }} component="button" onClick={handleApiTest}>
{i18n("click_test")}
</Link>
);
}
2023-07-20 13:45:41 +08:00
export default function Settings() {
const i18n = useI18n();
2023-08-30 18:05:37 +08:00
const { setting, updateSetting } = useSetting();
2023-09-03 13:11:04 +08:00
const alert = useAlert();
2023-07-20 13:45:41 +08:00
2023-08-31 00:18:57 +08:00
const handleChange = (e) => {
e.preventDefault();
let { name, value } = e.target;
switch (name) {
case "fetchLimit":
value = limitNumber(value, 1, 100);
break;
case "fetchInterval":
value = limitNumber(value, 0, 5000);
break;
case "minLength":
value = limitNumber(value, 1, 100);
break;
case "maxLength":
value = limitNumber(value, 100, 10000);
break;
2023-09-01 11:21:06 +08:00
case "newlineLength":
value = limitNumber(value, 1, 1000);
break;
2023-08-31 00:18:57 +08:00
default:
}
updateSetting({
[name]: value,
});
};
2023-08-17 13:27:22 +08:00
2023-09-03 13:11:04 +08:00
const handleClearCache = () => {
try {
caches.delete(CACHE_NAME);
alert.success(i18n("clear_success"));
} catch (err) {
console.log("[clear cache]", err);
}
};
2023-07-20 13:45:41 +08:00
const {
uiLang,
googleUrl,
fetchLimit,
2023-08-04 16:05:14 +08:00
fetchInterval,
2023-08-22 21:45:23 +08:00
minLength,
maxLength,
2023-07-20 13:45:41 +08:00
openaiUrl,
2023-09-02 16:57:09 +08:00
deeplUrl = "",
deeplKey = "",
2023-07-20 13:45:41 +08:00
openaiKey,
openaiModel,
openaiPrompt,
clearCache,
2023-09-01 11:21:06 +08:00
newlineLength = TRANS_NEWLINE_LENGTH,
2023-07-20 13:45:41 +08:00
} = setting;
return (
<Box>
<Stack spacing={3}>
<FormControl size="small">
<InputLabel>{i18n("ui_lang")}</InputLabel>
<Select
2023-08-17 13:27:22 +08:00
name="uiLang"
2023-07-20 13:45:41 +08:00
value={uiLang}
label={i18n("ui_lang")}
2023-08-17 13:27:22 +08:00
onChange={handleChange}
2023-07-20 13:45:41 +08:00
>
{UI_LANGS.map(([lang, name]) => (
2023-08-04 10:08:54 +08:00
<MenuItem key={lang} value={lang}>
{name}
</MenuItem>
2023-07-20 13:45:41 +08:00
))}
</Select>
</FormControl>
<TextField
size="small"
label={i18n("fetch_limit")}
type="number"
2023-08-17 13:27:22 +08:00
name="fetchLimit"
2023-08-31 00:18:57 +08:00
value={fetchLimit}
2023-08-17 13:27:22 +08:00
onChange={handleChange}
2023-08-04 16:05:14 +08:00
/>
<TextField
size="small"
label={i18n("fetch_interval")}
type="number"
2023-08-17 13:27:22 +08:00
name="fetchInterval"
2023-08-31 00:18:57 +08:00
value={fetchInterval}
2023-08-17 13:27:22 +08:00
onChange={handleChange}
2023-07-20 13:45:41 +08:00
/>
2023-08-22 21:45:23 +08:00
<TextField
size="small"
label={i18n("min_translate_length")}
type="number"
name="minLength"
2023-08-31 00:18:57 +08:00
value={minLength}
2023-08-22 21:45:23 +08:00
onChange={handleChange}
/>
<TextField
size="small"
label={i18n("max_translate_length")}
type="number"
name="maxLength"
2023-08-31 00:18:57 +08:00
value={maxLength}
2023-08-22 21:45:23 +08:00
onChange={handleChange}
/>
2023-09-01 11:21:06 +08:00
<TextField
size="small"
label={i18n("num_of_newline_characters")}
type="number"
name="newlineLength"
value={newlineLength}
onChange={handleChange}
/>
2023-07-20 13:45:41 +08:00
<FormControl size="small">
2023-09-03 13:11:04 +08:00
<InputLabel>{i18n("if_clear_cache")}</InputLabel>
2023-07-20 13:45:41 +08:00
<Select
2023-08-17 13:27:22 +08:00
name="clearCache"
2023-07-20 13:45:41 +08:00
value={clearCache}
2023-09-03 13:11:04 +08:00
label={i18n("if_clear_cache")}
2023-08-17 13:27:22 +08:00
onChange={handleChange}
2023-07-20 13:45:41 +08:00
>
<MenuItem value={false}>{i18n("clear_cache_never")}</MenuItem>
<MenuItem value={true}>{i18n("clear_cache_restart")}</MenuItem>
</Select>
2023-09-03 13:11:04 +08:00
<FormHelperText>
<Link component="button" onClick={handleClearCache}>
{i18n("clear_all_cache_now")}
</Link>
</FormHelperText>
2023-07-20 13:45:41 +08:00
</FormControl>
<TextField
size="small"
2023-09-03 13:11:04 +08:00
label={
<>
{i18n("google_api")}
{googleUrl && (
2023-09-03 22:18:33 +08:00
<TestLink translator={OPT_TRANS_GOOGLE} setting={setting} />
2023-09-03 13:11:04 +08:00
)}
</>
}
2023-08-17 13:27:22 +08:00
name="googleUrl"
2023-08-31 00:18:57 +08:00
value={googleUrl}
2023-08-17 13:27:22 +08:00
onChange={handleChange}
2023-09-01 11:03:53 +08:00
helperText={
2023-09-04 22:29:39 +08:00
<Link href={URL_KISS_PROXY} target="_blank">
{i18n("about_api_proxy")}
</Link>
2023-09-01 11:03:53 +08:00
}
2023-07-20 13:45:41 +08:00
/>
2023-09-02 16:57:09 +08:00
<TextField
size="small"
2023-09-03 13:11:04 +08:00
label={
<>
{i18n("deepl_api")}
{deeplUrl && (
2023-09-03 22:18:33 +08:00
<TestLink translator={OPT_TRANS_DEEPL} setting={setting} />
2023-09-03 13:11:04 +08:00
)}
</>
}
2023-09-02 16:57:09 +08:00
name="deeplUrl"
value={deeplUrl}
onChange={handleChange}
/>
<TextField
size="small"
label={i18n("deepl_key")}
name="deeplKey"
value={deeplKey}
onChange={handleChange}
/>
2023-07-20 13:45:41 +08:00
<TextField
size="small"
2023-09-03 13:11:04 +08:00
label={
<>
{i18n("openai_api")}
{openaiUrl && openaiPrompt && (
2023-09-03 22:18:33 +08:00
<TestLink translator={OPT_TRANS_OPENAI} setting={setting} />
2023-09-03 13:11:04 +08:00
)}
</>
}
2023-08-17 13:27:22 +08:00
name="openaiUrl"
2023-08-31 00:18:57 +08:00
value={openaiUrl}
2023-08-17 13:27:22 +08:00
onChange={handleChange}
2023-09-01 11:03:53 +08:00
helperText={
2023-09-04 22:29:39 +08:00
<Link href={URL_KISS_PROXY} target="_blank">
{i18n("about_api_proxy")}
</Link>
2023-09-01 11:03:53 +08:00
}
2023-07-20 13:45:41 +08:00
/>
<TextField
size="small"
2023-07-31 03:10:09 +08:00
type="password"
2023-07-20 13:45:41 +08:00
label={i18n("openai_key")}
2023-08-17 13:27:22 +08:00
name="openaiKey"
2023-08-31 00:18:57 +08:00
value={openaiKey}
2023-08-17 13:27:22 +08:00
onChange={handleChange}
2023-07-20 13:45:41 +08:00
/>
<TextField
size="small"
label={i18n("openai_model")}
2023-08-17 13:27:22 +08:00
name="openaiModel"
2023-08-31 00:18:57 +08:00
value={openaiModel}
2023-08-17 13:27:22 +08:00
onChange={handleChange}
2023-07-20 13:45:41 +08:00
/>
<TextField
size="small"
label={i18n("openai_prompt")}
2023-08-17 13:27:22 +08:00
name="openaiPrompt"
2023-08-31 00:18:57 +08:00
value={openaiPrompt}
2023-08-17 13:27:22 +08:00
onChange={handleChange}
2023-07-20 13:45:41 +08:00
multiline
/>
</Stack>
</Box>
);
}