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"; import Link from "@mui/material/Link"; import FormHelperText from "@mui/material/FormHelperText"; 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, } 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"; 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, 100, 5000); break; case "minLength": value = limitNumber(value, 1, 100); break; case "maxLength": value = limitNumber(value, 100, 10000); break; case "newlineLength": value = limitNumber(value, 1, 1000); 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(err, "clear cache"); } }; const handleImport = async (data) => { try { await updateSetting(JSON.parse(data)); } catch (err) { kissLog(err, "import setting"); } }; const { uiLang, minLength, maxLength, clearCache, newlineLength = TRANS_NEWLINE_LENGTH, contextMenuType = 1, touchTranslate = 2, blacklist = DEFAULT_BLACKLIST.join(",\n"), csplist = DEFAULT_CSPLIST.join(",\n"), transInterval = 500, langDetector = OPT_TRANS_MICROSOFT, } = setting; const { isHide = false } = fab || {}; return ( JSON.stringify(setting, null, 2)} text={i18n("export")} fileName={`kiss-setting_${Date.now()}.json`} /> {i18n("ui_lang")} {i18n("touch_translate_shortcut")} {i18n("hide_fab_button")} {i18n("context_menus")} {i18n("detect_lang_remote")} {isExt ? ( <> {i18n("if_clear_cache")} {i18n("clear_all_cache_now")} ) : ( <> )} ); }