import Box from "@mui/material/Box";
import Stack from "@mui/material/Stack";
import TextField from "@mui/material/TextField";
import MenuItem from "@mui/material/MenuItem";
import Link from "@mui/material/Link";
import { useSetting } from "../../hooks/Setting";
import { limitNumber } from "../../libs/utils";
import { useI18n } from "../../hooks/I18n";
import { useAlert } from "../../hooks/Alert";
import { isExt } from "../../libs/client";
import Grid from "@mui/material/Grid";
import {
UI_LANGS,
TRANS_NEWLINE_LENGTH,
CACHE_NAME,
OPT_TRANS_MICROSOFT,
OPT_LANGDETECTOR_ALL,
OPT_SHORTCUT_TRANSLATE,
OPT_SHORTCUT_STYLE,
OPT_SHORTCUT_POPUP,
OPT_SHORTCUT_SETTING,
DEFAULT_BLACKLIST,
DEFAULT_CSPLIST,
MSG_CONTEXT_MENUS,
MSG_UPDATE_CSP,
DEFAULT_HTTP_TIMEOUT,
OPT_LANGS_TO,
} from "../../config";
import { useShortcut } from "../../hooks/Shortcut";
import ShortcutInput from "./ShortcutInput";
import { useFab } from "../../hooks/Fab";
import { sendBgMsg } from "../../libs/msg";
import { kissLog } from "../../libs/log";
import UploadButton from "./UploadButton";
import DownloadButton from "./DownloadButton";
import { getSettingOld } from "../../libs/storage";
function ShortcutItem({ action, label }) {
const { shortcut, setShortcut } = useShortcut(action);
return (
);
}
export default function Settings() {
const i18n = useI18n();
const { setting, updateSetting } = useSetting();
const alert = useAlert();
const { fab, updateFab } = useFab();
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 "transInterval":
value = limitNumber(value, 10, 2000);
break;
case "minLength":
value = limitNumber(value, 1, 100);
break;
case "maxLength":
value = limitNumber(value, 100, 100000);
break;
case "newlineLength":
value = limitNumber(value, 1, 1000);
break;
case "httpTimeout":
value = limitNumber(value, 5000, 60000);
break;
case "touchTranslate":
value = limitNumber(value, 0, 4);
break;
case "contextMenuType":
isExt && sendBgMsg(MSG_CONTEXT_MENUS, value);
break;
case "csplist":
isExt && sendBgMsg(MSG_UPDATE_CSP, value);
break;
default:
}
updateSetting({
[name]: value,
});
};
const handleClearCache = () => {
try {
caches.delete(CACHE_NAME);
alert.success(i18n("clear_success"));
} catch (err) {
kissLog("clear cache", err);
}
};
const handleImport = async (data) => {
try {
updateSetting(JSON.parse(data));
} catch (err) {
kissLog("import setting", err);
}
};
const {
uiLang,
minLength,
maxLength,
clearCache,
newlineLength = TRANS_NEWLINE_LENGTH,
httpTimeout = DEFAULT_HTTP_TIMEOUT,
contextMenuType = 1,
touchTranslate = 2,
blacklist = DEFAULT_BLACKLIST.join(",\n"),
csplist = DEFAULT_CSPLIST.join(",\n"),
transInterval = 100,
langDetector = OPT_TRANS_MICROSOFT,
preInit = true,
skipLangs = [],
detectRemote = true,
} = setting;
const { isHide = false, fabClickAction = 0 } = fab || {};
return (
JSON.stringify(setting, null, 2)}
text={i18n("export")}
fileName={`kiss-setting_${Date.now()}.json`}
/>
JSON.stringify(await getSettingOld(), null, 2)
}
text={i18n("export_old")}
fileName={`kiss-setting_v1_${Date.now()}.json`}
/>
{UI_LANGS.map(([lang, name]) => (
))}
{
updateFab({ isHide: e.target.value });
}}
>
updateFab({ fabClickAction: e.target.value })}
>
{[0, 2, 3, 4].map((item) => (
))}
{OPT_LANGDETECTOR_ALL.map((item) => (
))}
{OPT_LANGS_TO.map(([langKey, langName]) => (
))}
{isExt ? (
<>
{i18n("clear_all_cache_now")}
}
>
>
) : (
<>
>
)}
);
}