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 { useI18n } from "../../hooks/I18n"; import { useAlert } from "../../hooks/Alert"; import { isExt } from "../../libs/client"; import Grid from "@mui/material/Grid"; import Alert from "@mui/material/Alert"; import { UI_LANGS, TRANS_NEWLINE_LENGTH, CACHE_NAME, OPT_LANGDETECTOR_ALL, OPT_SHORTCUT_TRANSLATE, OPT_SHORTCUT_STYLE, OPT_SHORTCUT_POPUP, OPT_SHORTCUT_SETTING, DEFAULT_BLACKLIST, DEFAULT_CSPLIST, DEFAULT_ORILIST, 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, LogLevel } from "../../libs/log"; import UploadButton from "./UploadButton"; import DownloadButton from "./DownloadButton"; import { getSettingOld } from "../../libs/storage"; import ValidationInput from "../../hooks/ValidationInput"; 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 "contextMenuType": isExt && sendBgMsg(MSG_CONTEXT_MENUS, value); break; case "csplist": isExt && sendBgMsg(MSG_UPDATE_CSP, { csplist: value }); break; case "orilist": isExt && sendBgMsg(MSG_UPDATE_CSP, { orilist: 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, touchModes = [2], blacklist = DEFAULT_BLACKLIST.join(",\n"), csplist = DEFAULT_CSPLIST.join(",\n"), orilist = DEFAULT_ORILIST.join(",\n"), transInterval = 100, langDetector = "-", logLevel = 1, preInit = true, skipLangs = [], // detectRemote = true, transAllnow = false, rootMargin = 500, } = setting; const { isHide = false, fabClickAction = 0 } = fab || {}; return ( {i18n("setting_helper")} JSON.stringify(setting, null, 2)} text={i18n("export")} fileName={`kiss-setting_v2_${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]) => ( {name} ))} {i18n("enable")} {i18n("disable")} { updateFab({ isHide: e.target.value }); }} > {i18n("show")} {i18n("hide")} updateFab({ fabClickAction: e.target.value })} > {i18n("fab_click_menu")} {i18n("fab_click_translate")} {[0, 2, 3, 4, 5, 6, 7].map((item) => ( {i18n(`touch_tap_${item}`)} ))} {i18n("hide_context_menus")} {i18n("simple_context_menus")} {i18n("secondary_context_menus")} {i18n("disable")} {OPT_LANGDETECTOR_ALL.map((item) => ( {item} ))} {i18n("mk_pagescroll")} {i18n("mk_pageopen")} {/* {i18n("enable")} {i18n("disable")} */} {Object.values(LogLevel).map(({ value, name }) => ( {name} ))} {OPT_LANGS_TO.map(([langKey, langName]) => ( {langName} ))} {isExt ? ( <> {i18n("clear_all_cache_now")} } > {i18n("clear_cache_never")} {i18n("clear_cache_restart")} ) : ( <> )} ); }