import { useState, useEffect } from "react"; import Box from "@mui/material/Box"; 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 { sendBgMsg, sendTabMsg, getCurTab } from "../../libs/msg"; import { browser } from "../../libs/browser"; import { isExt } from "../../libs/client"; import { useI18n } from "../../hooks/I18n"; import TextField from "@mui/material/TextField"; import Divider from "@mui/material/Divider"; import Header from "./Header"; import { MSG_TRANS_TOGGLE, MSG_TRANS_GETRULE, MSG_TRANS_PUTRULE, MSG_OPEN_OPTIONS, MSG_SAVE_RULE, MSG_COMMAND_SHORTCUTS, OPT_TRANS_ALL, OPT_LANGS_FROM, OPT_LANGS_TO, OPT_STYLE_ALL, } from "../../config"; import { sendIframeMsg } from "../../libs/iframe"; import { saveRule } from "../../libs/rules"; import { tryClearCaches } from "../../libs"; export default function Popup({ setShowPopup, translator: tran }) { const i18n = useI18n(); const [rule, setRule] = useState(tran?.rule); const [commands, setCommands] = useState({}); const handleOpenSetting = () => { if (!tran) { browser?.runtime.openOptionsPage(); } else if (isExt) { sendBgMsg(MSG_OPEN_OPTIONS); } else { window.open(process.env.REACT_APP_OPTIONSPAGE, "_blank"); } setShowPopup && setShowPopup(false); }; const handleTransToggle = async (e) => { try { setRule({ ...rule, transOpen: e.target.checked ? "true" : "false" }); if (!tran) { await sendTabMsg(MSG_TRANS_TOGGLE); } else { tran.toggle(); sendIframeMsg(MSG_TRANS_TOGGLE); } } catch (err) { console.log("[toggle trans]", err); } }; const handleChange = async (e) => { try { const { name, value } = e.target; setRule((pre) => ({ ...pre, [name]: value })); if (!tran) { await sendTabMsg(MSG_TRANS_PUTRULE, { [name]: value }); } else { tran.updateRule({ [name]: value }); sendIframeMsg(MSG_TRANS_PUTRULE, { [name]: value }); } } catch (err) { console.log("[update rule]", err); } }; const handleClearCache = () => { tryClearCaches(); }; const handleSaveRule = async () => { try { let href = window.location.href; if (!tran) { const tab = await getCurTab(); href = tab.url; } const newRule = { ...rule, pattern: href.split("/")[2] }; if (isExt && tran) { sendBgMsg(MSG_SAVE_RULE, newRule); } else { saveRule(newRule); } } catch (err) { console.log("[save rule]", err); } }; useEffect(() => { if (tran) { return; } (async () => { try { const res = await sendTabMsg(MSG_TRANS_GETRULE); if (!res.error) { setRule(res.data); } } catch (err) { console.log("[query rule]", err); } })(); }, [tran]); useEffect(() => { (async () => { try { const commands = {}; if (isExt) { const res = await sendBgMsg(MSG_COMMAND_SHORTCUTS); res.forEach(({ name, shortcut }) => { commands[name] = shortcut; }); } else { const shortcuts = tran.setting.shortcuts; if (shortcuts) { Object.entries(shortcuts).forEach(([key, val]) => { commands[key] = val.join("+"); }); } } setCommands(commands); } catch (err) { console.log("[query cmds]", err); } })(); }, [tran]); if (!rule) { return ( {!tran && ( <>
)} ); } const { transOpen, translator, fromLang, toLang, textStyle } = rule; return ( {!tran && ( <>
)} } label={ commands["toggleTranslate"] ? `${i18n("translate_alt")}(${commands["toggleTranslate"]})` : i18n("translate_alt") } /> {OPT_TRANS_ALL.map((item) => ( {item} ))} {OPT_LANGS_FROM.map(([lang, name]) => ( {name} ))} {OPT_LANGS_TO.map(([lang, name]) => ( {name} ))} {OPT_STYLE_ALL.map((item) => ( {i18n(item)} ))} {/* {OPT_STYLE_USE_COLOR.includes(textStyle) && ( )} */} {!isExt && ( )} ); }