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 IconButton from "@mui/material/IconButton"; import EditIcon from "@mui/icons-material/Edit"; import Grid from "@mui/material/Grid"; import { UI_LANGS, TRANS_NEWLINE_LENGTH, CACHE_NAME, OPT_MOUSEKEY_ALL, OPT_MOUSEKEY_DISABLE, OPT_SHORTCUT_TRANSLATE, OPT_SHORTCUT_STYLE, OPT_SHORTCUT_POPUP, } from "../../config"; import { useEffect, useState, useRef } from "react"; import { useShortcut } from "../../hooks/Shortcut"; function ShortcutItem({ action, label }) { const { shortcut, setShortcut } = useShortcut(action); const [disabled, setDisabled] = useState(true); const [focused, setFocus] = useState(false); const [formval, setFormval] = useState(shortcut); const inputRef = useRef(null); useEffect(() => { if (!disabled) { inputRef.current.focus(); setFormval([]); } }, [disabled]); useEffect(() => { if (!focused) { return; } const keys = new Set(); const handleKeydown = (e) => { // console.log("keydown", e); e.code && keys.add(e.key); setFormval([...keys]); }; const handleKeyup = (e) => { // console.log("keyup", e); keys.delete(e.key); }; window.addEventListener("keydown", handleKeydown); window.addEventListener("keyup", handleKeyup); return () => { window.removeEventListener("keydown", handleKeydown); window.removeEventListener("keyup", handleKeyup); }; }, [focused]); return ( { setFocus(true); }} onBlur={(e) => { setFocus(false); setDisabled(true); setShortcut(formval); }} /> { setDisabled(false); }} > {} ); } export default function Settings() { const i18n = useI18n(); const { setting, updateSetting } = useSetting(); const alert = useAlert(); 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; case "newlineLength": value = limitNumber(value, 1, 1000); break; default: } updateSetting({ [name]: value, }); }; const handleClearCache = () => { try { caches.delete(CACHE_NAME); alert.success(i18n("clear_success")); } catch (err) { console.log("[clear cache]", err); } }; const { uiLang, fetchLimit, fetchInterval, minLength, maxLength, clearCache, newlineLength = TRANS_NEWLINE_LENGTH, mouseKey = OPT_MOUSEKEY_DISABLE, } = setting; return ( {i18n("ui_lang")} {i18n("mouseover_translation")} {isExt ? ( {i18n("if_clear_cache")} {i18n("clear_all_cache_now")} ) : ( )} ); }