import { useState, useEffect, useMemo } from "react"; import Stack from "@mui/material/Stack"; import MenuItem from "@mui/material/MenuItem"; import FormControlLabel from "@mui/material/FormControlLabel"; import Switch from "@mui/material/Switch"; import Button from "@mui/material/Button"; import Grid from "@mui/material/Grid"; import { sendBgMsg, sendTabMsg, getCurTab } from "../../libs/msg"; import { isExt } from "../../libs/client"; import { useI18n } from "../../hooks/I18n"; import TextField from "@mui/material/TextField"; import { MSG_TRANS_TOGGLE, MSG_TRANS_PUTRULE, MSG_SAVE_RULE, MSG_COMMAND_SHORTCUTS, MSG_TRANSBOX_TOGGLE, MSG_MOUSEHOVER_TOGGLE, MSG_TRANSINPUT_TOGGLE, OPT_LANGS_FROM, OPT_LANGS_TO, } from "../../config"; import { saveRule } from "../../libs/rules"; import { tryClearCaches } from "../../libs/cache"; import { kissLog } from "../../libs/log"; import { parseUrlPattern } from "../../libs/utils"; import { useAllTextStyles } from "../../hooks/CustomStyles"; export default function PopupCont({ rule, setting, setRule, setSetting, handleOpenSetting, processActions, isContent = false, }) { const i18n = useI18n(); const [commands, setCommands] = useState({}); const { allTextStyles } = useAllTextStyles(); const handleTransToggle = async (e) => { try { setRule({ ...rule, transOpen: e.target.checked ? "true" : "false" }); if (!processActions) { await sendTabMsg(MSG_TRANS_TOGGLE); } else { processActions({ action: MSG_TRANS_TOGGLE }); } } catch (err) { kissLog("toggle trans", err); } }; const handleTransboxToggle = async (e) => { try { setSetting((pre) => ({ ...pre, tranboxSetting: { ...pre.tranboxSetting, transOpen: e.target.checked }, })); if (!processActions) { await sendTabMsg(MSG_TRANSBOX_TOGGLE); } else { processActions({ action: MSG_TRANSBOX_TOGGLE }); } } catch (err) { kissLog("toggle transbox", err); } }; const handleMousehoverToggle = async (e) => { try { setSetting((pre) => ({ ...pre, mouseHoverSetting: { ...pre.mouseHoverSetting, useMouseHover: e.target.checked, }, })); if (!processActions) { await sendTabMsg(MSG_MOUSEHOVER_TOGGLE); } else { processActions({ action: MSG_MOUSEHOVER_TOGGLE }); } } catch (err) { kissLog("toggle mousehover", err); } }; const handleInputTransToggle = async (e) => { try { setSetting((pre) => ({ ...pre, inputRule: { ...pre.inputRule, transOpen: e.target.checked, }, })); if (!processActions) { await sendTabMsg(MSG_TRANSINPUT_TOGGLE); } else { processActions({ action: MSG_TRANSINPUT_TOGGLE }); } } catch (err) { kissLog("toggle inputtrans", err); } }; const handleChange = async (e) => { try { const { name, value } = e.target; setRule((pre) => ({ ...pre, [name]: value })); if (!processActions) { await sendTabMsg(MSG_TRANS_PUTRULE, { [name]: value }); } else { processActions({ action: MSG_TRANS_PUTRULE, args: { [name]: value } }); } } catch (err) { kissLog("update rule", err); } }; const handleClearCache = () => { tryClearCaches(); }; const handleSaveRule = async () => { try { let href = ""; if (!isContent) { const tab = await getCurTab(); href = tab.url; } else { href = window.location?.href; } if (!href || typeof href !== "string") { return; } const pattern = parseUrlPattern(href); const curRule = { ...rule, pattern }; if (isExt && isContent) { sendBgMsg(MSG_SAVE_RULE, curRule); } else { saveRule(curRule); } } catch (err) { kissLog("save rule", err); } }; useEffect(() => { (async () => { try { const commands = {}; if (isExt) { const res = await sendBgMsg(MSG_COMMAND_SHORTCUTS); res.forEach(({ name, shortcut }) => { commands[name] = shortcut; }); } else { const shortcuts = setting.shortcuts; if (shortcuts) { Object.entries(shortcuts).forEach(([key, val]) => { commands[key] = val.join("+"); }); } } setCommands(commands); } catch (err) { kissLog("query cmds", err); } })(); }, [setting.shortcuts]); const optApis = useMemo( () => setting.transApis .filter((api) => !api.isDisabled) .map((api) => ({ key: api.apiSlug, name: api.apiName || api.apiSlug, })), [setting.transApis] ); const tranboxEnabled = setting.tranboxSetting.transOpen; const mouseHoverEnabled = setting.mouseHoverSetting.useMouseHover; const inputTransEnabled = setting.inputRule.transOpen; const { transOpen, apiSlug, fromLang, toLang, textStyle, autoScan, transOnly, hasRichText, hasShadowroot, } = rule; return ( } label={ commands["toggleTranslate"] ? `${i18n("translate_alt")}(${commands["toggleTranslate"]})` : i18n("translate_alt") } /> } label={i18n("autoscan_alt")} /> } label={i18n("shadowroot_alt")} /> } label={i18n("richtext_alt")} /> } label={i18n("transonly_alt")} /> } label={i18n("selection_translate")} /> } label={i18n("mousehover_translate")} /> } label={i18n("input_translate")} /> {optApis.map(({ key, name }) => ( {name} ))} {OPT_LANGS_FROM.map(([lang, name]) => ( {name} ))} {OPT_LANGS_TO.map(([lang, name]) => ( {name} ))} {allTextStyles.map((item) => ( {item.styleName} ))} ); }