Files
kiss-translator/src/views/Popup/index.js

256 lines
6.4 KiB
JavaScript
Raw Normal View History

2023-07-20 13:45:41 +08:00
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";
2023-09-23 19:16:51 +08:00
import { sendBgMsg, sendTabMsg, getTabInfo } from "../../libs/msg";
2023-08-30 18:05:37 +08:00
import { browser } from "../../libs/browser";
import { isExt } from "../../libs/client";
2023-07-20 13:45:41 +08:00
import { useI18n } from "../../hooks/I18n";
import TextField from "@mui/material/TextField";
2023-09-04 22:03:17 +08:00
import Divider from "@mui/material/Divider";
import Header from "./Header";
2023-07-20 13:45:41 +08:00
import {
MSG_TRANS_TOGGLE,
MSG_TRANS_GETRULE,
MSG_TRANS_PUTRULE,
2023-09-23 19:16:51 +08:00
MSG_OPEN_OPTIONS,
MSG_SAVE_RULE,
2023-07-20 13:45:41 +08:00
OPT_TRANS_ALL,
OPT_LANGS_FROM,
OPT_LANGS_TO,
OPT_STYLE_ALL,
} from "../../config";
2023-08-26 11:43:00 +08:00
import { sendIframeMsg } from "../../libs/iframe";
2023-09-10 12:35:03 +08:00
import { saveRule } from "../../libs/rules";
2023-09-19 12:18:01 +08:00
import { tryClearCaches } from "../../libs";
2023-07-20 13:45:41 +08:00
2023-08-09 14:57:51 +08:00
export default function Popup({ setShowPopup, translator: tran }) {
2023-07-20 13:45:41 +08:00
const i18n = useI18n();
2023-08-09 17:33:51 +08:00
const [rule, setRule] = useState(tran?.rule);
2023-07-20 13:45:41 +08:00
const handleOpenSetting = () => {
2023-09-23 19:16:51 +08:00
if (!tran) {
2023-08-06 21:12:01 +08:00
browser?.runtime.openOptionsPage();
2023-09-23 19:16:51 +08:00
} else if (isExt) {
sendBgMsg(MSG_OPEN_OPTIONS);
2023-08-06 21:12:01 +08:00
} else {
window.open(process.env.REACT_APP_OPTIONSPAGE, "_blank");
}
2023-08-09 04:39:50 +08:00
setShowPopup && setShowPopup(false);
2023-07-20 13:45:41 +08:00
};
const handleTransToggle = async (e) => {
try {
2023-08-08 13:29:15 +08:00
setRule({ ...rule, transOpen: e.target.checked ? "true" : "false" });
2023-08-06 21:12:01 +08:00
2023-09-23 19:16:51 +08:00
if (!tran) {
2023-08-06 21:12:01 +08:00
await sendTabMsg(MSG_TRANS_TOGGLE);
} else {
2023-08-09 14:57:51 +08:00
tran.toggle();
2023-08-26 11:43:00 +08:00
sendIframeMsg(MSG_TRANS_TOGGLE);
2023-08-06 21:12:01 +08:00
}
2023-07-20 13:45:41 +08:00
} catch (err) {
console.log("[toggle trans]", err);
}
};
const handleChange = async (e) => {
try {
const { name, value } = e.target;
setRule((pre) => ({ ...pre, [name]: value }));
2023-08-06 21:12:01 +08:00
2023-09-23 19:16:51 +08:00
if (!tran) {
2023-08-06 21:12:01 +08:00
await sendTabMsg(MSG_TRANS_PUTRULE, { [name]: value });
} else {
2023-08-09 14:57:51 +08:00
tran.updateRule({ [name]: value });
2023-08-26 11:43:00 +08:00
sendIframeMsg(MSG_TRANS_PUTRULE, { [name]: value });
2023-08-06 21:12:01 +08:00
}
2023-07-20 13:45:41 +08:00
} catch (err) {
console.log("[update rule]", err);
}
};
2023-09-03 13:11:04 +08:00
const handleClearCache = () => {
2023-09-19 12:18:01 +08:00
tryClearCaches();
2023-09-03 13:11:04 +08:00
};
2023-09-10 12:35:03 +08:00
const handleSaveRule = async () => {
try {
2023-09-12 17:20:56 +08:00
let href = window.location.href;
2023-09-23 19:16:51 +08:00
if (!tran) {
2023-09-10 12:35:03 +08:00
const tab = await getTabInfo();
2023-09-12 17:20:56 +08:00
href = tab.url;
2023-09-10 12:35:03 +08:00
}
2023-09-27 15:39:57 +08:00
const newRule = { ...rule, pattern: href };
2023-09-23 19:16:51 +08:00
if (isExt && tran) {
2023-09-27 15:39:57 +08:00
sendBgMsg(MSG_SAVE_RULE, newRule);
2023-09-23 19:16:51 +08:00
} else {
2023-09-27 15:39:57 +08:00
saveRule(newRule);
2023-09-23 19:16:51 +08:00
}
2023-09-10 12:35:03 +08:00
} catch (err) {
console.log("[save rule]", err);
}
};
2023-07-20 13:45:41 +08:00
useEffect(() => {
2023-09-23 19:16:51 +08:00
if (tran) {
2023-08-09 14:57:51 +08:00
return;
2023-08-06 21:12:01 +08:00
}
2023-07-20 13:45:41 +08:00
(async () => {
try {
const res = await sendTabMsg(MSG_TRANS_GETRULE);
if (!res.error) {
setRule(res.data);
}
} catch (err) {
console.log("[query rule]", err);
}
})();
2023-09-23 19:16:51 +08:00
}, [tran]);
2023-07-20 13:45:41 +08:00
if (!rule) {
return (
2023-09-04 22:03:17 +08:00
<Box minWidth={300}>
2023-09-23 19:16:51 +08:00
{!tran && (
2023-09-04 23:24:50 +08:00
<>
<Header />
<Divider />
</>
)}
2023-09-04 22:03:17 +08:00
<Stack sx={{ p: 2 }} spacing={3}>
2023-07-20 13:45:41 +08:00
<Button variant="text" onClick={handleOpenSetting}>
{i18n("setting")}
</Button>
</Stack>
</Box>
);
}
2024-01-04 10:49:44 +08:00
const { transOpen, translator, fromLang, toLang, textStyle } = rule;
2023-07-20 13:45:41 +08:00
return (
2023-09-04 22:03:17 +08:00
<Box minWidth={300}>
2023-09-23 19:16:51 +08:00
{!tran && (
2023-09-04 23:24:50 +08:00
<>
<Header />
<Divider />
</>
)}
2023-09-04 22:03:17 +08:00
<Stack sx={{ p: 2 }} spacing={2}>
2023-09-03 13:11:04 +08:00
<Stack
direction="row"
justifyContent="space-between"
alignItems="center"
spacing={2}
>
<FormControlLabel
control={
<Switch
checked={transOpen === "true"}
onChange={handleTransToggle}
/>
}
label={i18n("translate_alt")}
/>
</Stack>
2023-07-20 13:45:41 +08:00
<TextField
select
2023-08-06 21:12:01 +08:00
SelectProps={{ MenuProps: { disablePortal: true } }}
2023-07-20 13:45:41 +08:00
size="small"
value={translator}
name="translator"
label={i18n("translate_service")}
onChange={handleChange}
>
{OPT_TRANS_ALL.map((item) => (
2023-08-04 16:48:40 +08:00
<MenuItem key={item} value={item}>
{item}
</MenuItem>
2023-07-20 13:45:41 +08:00
))}
</TextField>
<TextField
select
2023-08-06 21:12:01 +08:00
SelectProps={{ MenuProps: { disablePortal: true } }}
2023-07-20 13:45:41 +08:00
size="small"
value={fromLang}
name="fromLang"
label={i18n("from_lang")}
onChange={handleChange}
>
{OPT_LANGS_FROM.map(([lang, name]) => (
2023-08-04 16:48:40 +08:00
<MenuItem key={lang} value={lang}>
{name}
</MenuItem>
2023-07-20 13:45:41 +08:00
))}
</TextField>
<TextField
select
2023-08-06 21:12:01 +08:00
SelectProps={{ MenuProps: { disablePortal: true } }}
2023-07-20 13:45:41 +08:00
size="small"
value={toLang}
name="toLang"
label={i18n("to_lang")}
onChange={handleChange}
>
{OPT_LANGS_TO.map(([lang, name]) => (
2023-08-04 16:48:40 +08:00
<MenuItem key={lang} value={lang}>
{name}
</MenuItem>
2023-07-20 13:45:41 +08:00
))}
</TextField>
<TextField
select
2023-08-06 21:12:01 +08:00
SelectProps={{ MenuProps: { disablePortal: true } }}
2023-07-20 13:45:41 +08:00
size="small"
value={textStyle}
name="textStyle"
2023-08-22 21:14:33 +08:00
label={i18n("text_style_alt")}
2023-07-20 13:45:41 +08:00
onChange={handleChange}
>
{OPT_STYLE_ALL.map((item) => (
2023-08-04 16:48:40 +08:00
<MenuItem key={item} value={item}>
{i18n(item)}
</MenuItem>
2023-07-20 13:45:41 +08:00
))}
</TextField>
2024-01-04 10:49:44 +08:00
{/* {OPT_STYLE_USE_COLOR.includes(textStyle) && (
2023-09-01 17:02:47 +08:00
<TextField
size="small"
name="bgColor"
value={bgColor}
label={i18n("bg_color")}
onChange={handleChange}
/>
2024-01-04 10:49:44 +08:00
)} */}
2023-08-09 22:58:03 +08:00
2023-09-10 12:35:03 +08:00
<Stack
direction="row"
justifyContent="space-between"
alignItems="center"
spacing={2}
>
<Button variant="text" onClick={handleSaveRule}>
{i18n("save_rule")}
</Button>
{!isExt && (
<Button variant="text" onClick={handleClearCache}>
{i18n("clear_cache")}
</Button>
)}
2023-09-10 12:35:03 +08:00
<Button variant="text" onClick={handleOpenSetting}>
{i18n("setting")}
</Button>
</Stack>
2023-07-20 13:45:41 +08:00
</Stack>
</Box>
);
}