Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c1778fbcbb | ||
|
|
1ef9974c05 | ||
|
|
399c6b6fed | ||
|
|
62a60eee44 | ||
|
|
54339af885 | ||
|
|
06cfd33e60 | ||
|
|
08c9d78d2a | ||
|
|
e7a5e5dce1 | ||
|
|
3a59a127d1 | ||
|
|
26f213cad2 |
2
.env
2
.env
@@ -2,7 +2,7 @@ GENERATE_SOURCEMAP=false
|
|||||||
|
|
||||||
REACT_APP_NAME=KISS Translator
|
REACT_APP_NAME=KISS Translator
|
||||||
REACT_APP_NAME_CN=简约翻译
|
REACT_APP_NAME_CN=简约翻译
|
||||||
REACT_APP_VERSION=1.6.10
|
REACT_APP_VERSION=1.6.11
|
||||||
|
|
||||||
REACT_APP_HOMEPAGE=https://github.com/fishjar/kiss-translator
|
REACT_APP_HOMEPAGE=https://github.com/fishjar/kiss-translator
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,8 @@ If you also like a little more simplicity, welcome to pick it up.
|
|||||||
|
|
||||||
- `Alt+Q` Toggle Translation
|
- `Alt+Q` Toggle Translation
|
||||||
- `Alt+C` Toggle Styles
|
- `Alt+C` Toggle Styles
|
||||||
- `Alt+K` Open Menu
|
- `Alt+K` Open Popup
|
||||||
|
- `Alt+O` Open Options
|
||||||
|
|
||||||
## Schedule
|
## Schedule
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,8 @@
|
|||||||
|
|
||||||
- `Alt+Q` 开启翻译
|
- `Alt+Q` 开启翻译
|
||||||
- `Alt+C` 切换样式
|
- `Alt+C` 切换样式
|
||||||
- `Alt+K` 打开菜单
|
- `Alt+K` 打开弹窗
|
||||||
|
- `Alt+O` 打开设置
|
||||||
|
|
||||||
## 进度
|
## 进度
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "kiss-translator",
|
"name": "kiss-translator",
|
||||||
"description": "A minimalist bilingual translation Extension & Greasemonkey Script",
|
"description": "A minimalist bilingual translation Extension & Greasemonkey Script",
|
||||||
"version": "1.6.10",
|
"version": "1.6.11",
|
||||||
"author": "Gabe<yugang2002@gmail.com>",
|
"author": "Gabe<yugang2002@gmail.com>",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -10,5 +10,8 @@
|
|||||||
},
|
},
|
||||||
"toggle_style": {
|
"toggle_style": {
|
||||||
"message": "Toggle Style"
|
"message": "Toggle Style"
|
||||||
|
},
|
||||||
|
"open_options": {
|
||||||
|
"message": "Open Options"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,9 +6,12 @@
|
|||||||
"message": "一个简约的双语网页翻译扩展 & 油猴脚本"
|
"message": "一个简约的双语网页翻译扩展 & 油猴脚本"
|
||||||
},
|
},
|
||||||
"toggle_translate": {
|
"toggle_translate": {
|
||||||
"message": "切换翻译"
|
"message": "开启翻译"
|
||||||
},
|
},
|
||||||
"toggle_style": {
|
"toggle_style": {
|
||||||
"message": "切换样式"
|
"message": "切换样式"
|
||||||
|
},
|
||||||
|
"open_options": {
|
||||||
|
"message": "打开设置"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"name": "__MSG_app_name__",
|
"name": "__MSG_app_name__",
|
||||||
"description": "__MSG_app_description__",
|
"description": "__MSG_app_description__",
|
||||||
"version": "1.6.10",
|
"version": "1.6.11",
|
||||||
"default_locale": "en",
|
"default_locale": "en",
|
||||||
"author": "Gabe<yugang2002@gmail.com>",
|
"author": "Gabe<yugang2002@gmail.com>",
|
||||||
"homepage_url": "https://github.com/fishjar/kiss-translator",
|
"homepage_url": "https://github.com/fishjar/kiss-translator",
|
||||||
@@ -33,6 +33,12 @@
|
|||||||
"default": "Alt+C"
|
"default": "Alt+C"
|
||||||
},
|
},
|
||||||
"description": "__MSG_toggle_style__"
|
"description": "__MSG_toggle_style__"
|
||||||
|
},
|
||||||
|
"openOptions": {
|
||||||
|
"suggested_key": {
|
||||||
|
"default": "Alt+O"
|
||||||
|
},
|
||||||
|
"description": "__MSG_open_options__"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"permissions": ["<all_urls>", "storage"],
|
"permissions": ["<all_urls>", "storage"],
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"manifest_version": 3,
|
"manifest_version": 3,
|
||||||
"name": "__MSG_app_name__",
|
"name": "__MSG_app_name__",
|
||||||
"description": "__MSG_app_description__",
|
"description": "__MSG_app_description__",
|
||||||
"version": "1.6.10",
|
"version": "1.6.11",
|
||||||
"default_locale": "en",
|
"default_locale": "en",
|
||||||
"author": "Gabe<yugang2002@gmail.com>",
|
"author": "Gabe<yugang2002@gmail.com>",
|
||||||
"homepage_url": "https://github.com/fishjar/kiss-translator",
|
"homepage_url": "https://github.com/fishjar/kiss-translator",
|
||||||
@@ -34,6 +34,12 @@
|
|||||||
"default": "Alt+C"
|
"default": "Alt+C"
|
||||||
},
|
},
|
||||||
"description": "__MSG_toggle_style__"
|
"description": "__MSG_toggle_style__"
|
||||||
|
},
|
||||||
|
"openOptions": {
|
||||||
|
"suggested_key": {
|
||||||
|
"default": "Alt+O"
|
||||||
|
},
|
||||||
|
"description": "__MSG_open_options__"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"permissions": ["storage"],
|
"permissions": ["storage"],
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import {
|
|||||||
MSG_TRANS_TOGGLE_STYLE,
|
MSG_TRANS_TOGGLE_STYLE,
|
||||||
CMD_TOGGLE_TRANSLATE,
|
CMD_TOGGLE_TRANSLATE,
|
||||||
CMD_TOGGLE_STYLE,
|
CMD_TOGGLE_STYLE,
|
||||||
|
CMD_OPEN_OPTIONS,
|
||||||
} from "./config";
|
} from "./config";
|
||||||
import { getSettingWithDefault, tryInitDefaultData } from "./libs/storage";
|
import { getSettingWithDefault, tryInitDefaultData } from "./libs/storage";
|
||||||
import { trySyncSettingAndRules } from "./libs/sync";
|
import { trySyncSettingAndRules } from "./libs/sync";
|
||||||
@@ -85,6 +86,9 @@ browser.commands.onCommand.addListener((command) => {
|
|||||||
case CMD_TOGGLE_STYLE:
|
case CMD_TOGGLE_STYLE:
|
||||||
sendTabMsg(MSG_TRANS_TOGGLE_STYLE);
|
sendTabMsg(MSG_TRANS_TOGGLE_STYLE);
|
||||||
break;
|
break;
|
||||||
|
case CMD_OPEN_OPTIONS:
|
||||||
|
browser.runtime.openOptionsPage();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -537,4 +537,12 @@ export const I18N = {
|
|||||||
zh: `隐藏`,
|
zh: `隐藏`,
|
||||||
en: `"Hide`,
|
en: `"Hide`,
|
||||||
},
|
},
|
||||||
|
save_rule: {
|
||||||
|
zh: `保存规则`,
|
||||||
|
en: `"Save Rule`,
|
||||||
|
},
|
||||||
|
global_rule: {
|
||||||
|
zh: `全局规则`,
|
||||||
|
en: `Global Rule`,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ export const STOKEY_WEBFIXCACHE_PREFIX = `${APP_NAME}_webfixcache_`;
|
|||||||
|
|
||||||
export const CMD_TOGGLE_TRANSLATE = "toggleTranslate";
|
export const CMD_TOGGLE_TRANSLATE = "toggleTranslate";
|
||||||
export const CMD_TOGGLE_STYLE = "toggleStyle";
|
export const CMD_TOGGLE_STYLE = "toggleStyle";
|
||||||
|
export const CMD_OPEN_OPTIONS = "openOptions";
|
||||||
|
|
||||||
export const CLIENT_WEB = "web";
|
export const CLIENT_WEB = "web";
|
||||||
export const CLIENT_CHROME = "chrome";
|
export const CLIENT_CHROME = "chrome";
|
||||||
|
|||||||
@@ -19,3 +19,12 @@ export const sendTabMsg = async (action, args) => {
|
|||||||
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
||||||
return browser.tabs.sendMessage(tabs[0].id, { action, args });
|
return browser.tabs.sendMessage(tabs[0].id, { action, args });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前tab信息
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export const getTabInfo = async () => {
|
||||||
|
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
|
||||||
|
return tabs[0];
|
||||||
|
};
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import {
|
|||||||
DEFAULT_OW_RULE,
|
DEFAULT_OW_RULE,
|
||||||
} from "../config";
|
} from "../config";
|
||||||
import { loadOrFetchSubRules } from "./subRules";
|
import { loadOrFetchSubRules } from "./subRules";
|
||||||
|
import { getRulesWithDefault, setRules } from "./storage";
|
||||||
|
import { trySyncRules } from "./sync";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据href匹配规则
|
* 根据href匹配规则
|
||||||
@@ -134,3 +136,19 @@ export const checkRules = (rules) => {
|
|||||||
|
|
||||||
return rules;
|
return rules;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存或更新rule
|
||||||
|
* @param {*} newRule
|
||||||
|
*/
|
||||||
|
export const saveRule = async (newRule) => {
|
||||||
|
const rules = await getRulesWithDefault();
|
||||||
|
const rule = rules.find((item) => isMatch(newRule.pattern, item.pattern));
|
||||||
|
if (rule && rule.pattern !== GLOBAL_KEY) {
|
||||||
|
Object.assign(rule, { ...newRule, pattern: rule.pattern });
|
||||||
|
} else {
|
||||||
|
rules.unshift(newRule);
|
||||||
|
}
|
||||||
|
await setRules(rules);
|
||||||
|
trySyncRules();
|
||||||
|
};
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ import { apiFetch } from "../apis";
|
|||||||
/**
|
/**
|
||||||
* 修复程序类型
|
* 修复程序类型
|
||||||
*/
|
*/
|
||||||
const WEBFIX_BR = "br";
|
const FIXER_BR = "br";
|
||||||
|
const FIXER_FONTSIZE = "fontSize";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 需要修复的站点列表
|
* 需要修复的站点列表
|
||||||
@@ -19,13 +20,19 @@ const DEFAULT_SITES = [
|
|||||||
pattern: "www.phoronix.com",
|
pattern: "www.phoronix.com",
|
||||||
selector: ".content",
|
selector: ".content",
|
||||||
rootSlector: "",
|
rootSlector: "",
|
||||||
fixer: WEBFIX_BR,
|
fixer: FIXER_BR,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
pattern: "t.me/s/*",
|
pattern: "t.me/s/",
|
||||||
selector: ".tgme_widget_message_text",
|
selector: ".tgme_widget_message_text",
|
||||||
rootSlector: ".tgme_channel_history",
|
rootSlector: ".tgme_channel_history",
|
||||||
fixer: WEBFIX_BR,
|
fixer: FIXER_BR,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pattern: "baidu.com",
|
||||||
|
selector: "html",
|
||||||
|
rootSlector: "",
|
||||||
|
fixer: FIXER_FONTSIZE,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -87,11 +94,20 @@ function brFixer(node) {
|
|||||||
node.innerHTML = html;
|
node.innerHTML = html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修复字体大小问题,如 baidu.com
|
||||||
|
* @param {*} node
|
||||||
|
*/
|
||||||
|
function fontSizeFixer(node) {
|
||||||
|
node.style.cssText += "font-size:1em;";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修复程序映射
|
* 修复程序映射
|
||||||
*/
|
*/
|
||||||
const fixerMap = {
|
const fixerMap = {
|
||||||
[WEBFIX_BR]: brFixer,
|
[FIXER_BR]: brFixer,
|
||||||
|
[FIXER_FONTSIZE]: fontSizeFixer,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -362,6 +362,7 @@ function RuleFields({ rule, rules, setShow, setKeyword }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function RuleAccordion({ rule, rules }) {
|
function RuleAccordion({ rule, rules }) {
|
||||||
|
const i18n = useI18n();
|
||||||
const [expanded, setExpanded] = useState(false);
|
const [expanded, setExpanded] = useState(false);
|
||||||
|
|
||||||
const handleChange = (e) => {
|
const handleChange = (e) => {
|
||||||
@@ -376,7 +377,9 @@ function RuleAccordion({ rule, rules }) {
|
|||||||
opacity: rules ? 1 : 0.5,
|
opacity: rules ? 1 : 0.5,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{rule.pattern}
|
{rule.pattern === GLOBAL_KEY
|
||||||
|
? `[${i18n("global_rule")}] ${rule.pattern}`
|
||||||
|
: rule.pattern}
|
||||||
</Typography>
|
</Typography>
|
||||||
</AccordionSummary>
|
</AccordionSummary>
|
||||||
<AccordionDetails>
|
<AccordionDetails>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import Stack from "@mui/material/Stack";
|
import Stack from "@mui/material/Stack";
|
||||||
import TextField from "@mui/material/TextField";
|
import TextField from "@mui/material/TextField";
|
||||||
import { useEffect, useState } from "react";
|
import { useCallback, useEffect, useState } from "react";
|
||||||
import { useI18n } from "../../hooks/I18n";
|
import { useI18n } from "../../hooks/I18n";
|
||||||
import Typography from "@mui/material/Typography";
|
import Typography from "@mui/material/Typography";
|
||||||
import Accordion from "@mui/material/Accordion";
|
import Accordion from "@mui/material/Accordion";
|
||||||
@@ -75,11 +75,17 @@ export default function Webfix() {
|
|||||||
const alert = useAlert();
|
const alert = useAlert();
|
||||||
const { setting, updateSetting } = useSetting();
|
const { setting, updateSetting } = useSetting();
|
||||||
|
|
||||||
|
const loadSites = useCallback(async () => {
|
||||||
|
const sites = await loadOrFetchWebfix(process.env.REACT_APP_WEBFIXURL);
|
||||||
|
setSites(sites);
|
||||||
|
}, []);
|
||||||
|
|
||||||
const handleSyncTest = async (e) => {
|
const handleSyncTest = async (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
await syncWebfix(process.env.REACT_APP_WEBFIXURL);
|
await syncWebfix(process.env.REACT_APP_WEBFIXURL);
|
||||||
|
await loadSites();
|
||||||
alert.success(i18n("sync_success"));
|
alert.success(i18n("sync_success"));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log("[sync webfix]", err);
|
console.log("[sync webfix]", err);
|
||||||
@@ -93,15 +99,14 @@ export default function Webfix() {
|
|||||||
(async () => {
|
(async () => {
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
const sites = await loadOrFetchWebfix(process.env.REACT_APP_WEBFIXURL);
|
await loadSites();
|
||||||
setSites(sites);
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log("[load webfix]", err.message);
|
console.log("[load webfix]", err.message);
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
}, []);
|
}, [loadSites]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ export default function Options() {
|
|||||||
// 检查版本是否一致
|
// 检查版本是否一致
|
||||||
if (version !== process.env.REACT_APP_VERSION) {
|
if (version !== process.env.REACT_APP_VERSION) {
|
||||||
setError(
|
setError(
|
||||||
`The version of the script(v${version}) and this page(v${process.env.REACT_APP_VERSION}) are inconsistent.`
|
`The version is inconsistent, please check whether the script(v${version}) is the latest version(v${process.env.REACT_APP_VERSION}). (版本不一致,请检查脚本(v${version})是否为最新版(v${process.env.REACT_APP_VERSION}))`
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -53,7 +53,7 @@ export default function Options() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (++i > 8) {
|
if (++i > 8) {
|
||||||
setError("Time out.");
|
setError("Time out. (连接超时)");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,26 +78,26 @@ export default function Options() {
|
|||||||
</Divider>
|
</Divider>
|
||||||
<h2>
|
<h2>
|
||||||
Please confirm whether to install or enable KISS Translator
|
Please confirm whether to install or enable KISS Translator
|
||||||
GreaseMonkey script?
|
GreaseMonkey script? (请检查是否安装或启用简约翻译油猴脚本)
|
||||||
</h2>
|
</h2>
|
||||||
<Stack spacing={2}>
|
<Stack spacing={2}>
|
||||||
<Link href={process.env.REACT_APP_USERSCRIPT_DOWNLOADURL}>
|
<Link href={process.env.REACT_APP_USERSCRIPT_DOWNLOADURL}>
|
||||||
Install Userscript 1
|
Install Userscript for Tampermonkey/Violentmonkey 1 (油猴脚本 安装地址 1)
|
||||||
</Link>
|
</Link>
|
||||||
<Link href={process.env.REACT_APP_USERSCRIPT_DOWNLOADURL2}>
|
<Link href={process.env.REACT_APP_USERSCRIPT_DOWNLOADURL2}>
|
||||||
Install Userscript 2
|
Install Userscript for Tampermonkey/Violentmonkey 2 (油猴脚本 安装地址 2)
|
||||||
</Link>
|
</Link>
|
||||||
<Link href={process.env.REACT_APP_USERSCRIPT_IOS_DOWNLOADURL}>
|
<Link href={process.env.REACT_APP_USERSCRIPT_IOS_DOWNLOADURL}>
|
||||||
Install Userscript Safari 1
|
Install Userscript for iOS Safari 1 (油猴脚本 iOS Safari专用 安装地址 1)
|
||||||
</Link>
|
</Link>
|
||||||
<Link href={process.env.REACT_APP_USERSCRIPT_IOS_DOWNLOADURL2}>
|
<Link href={process.env.REACT_APP_USERSCRIPT_IOS_DOWNLOADURL2}>
|
||||||
Install Userscript Safari 2
|
Install Userscript for iOS Safari 2 (油猴脚本 iOS Safari专用 安装地址 2)
|
||||||
</Link>
|
</Link>
|
||||||
<Link href={process.env.REACT_APP_OPTIONSPAGE}>
|
<Link href={process.env.REACT_APP_OPTIONSPAGE}>
|
||||||
Open Options Page 1
|
Open Options Page 1 (打开设置页面 1)
|
||||||
</Link>
|
</Link>
|
||||||
<Link href={process.env.REACT_APP_OPTIONSPAGE2}>
|
<Link href={process.env.REACT_APP_OPTIONSPAGE2}>
|
||||||
Open Options Page 2
|
Open Options Page 2 (打开设置页面 2)
|
||||||
</Link>
|
</Link>
|
||||||
</Stack>
|
</Stack>
|
||||||
</center>
|
</center>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import MenuItem from "@mui/material/MenuItem";
|
|||||||
import FormControlLabel from "@mui/material/FormControlLabel";
|
import FormControlLabel from "@mui/material/FormControlLabel";
|
||||||
import Switch from "@mui/material/Switch";
|
import Switch from "@mui/material/Switch";
|
||||||
import Button from "@mui/material/Button";
|
import Button from "@mui/material/Button";
|
||||||
import { sendTabMsg } from "../../libs/msg";
|
import { sendTabMsg, getTabInfo } from "../../libs/msg";
|
||||||
import { browser } from "../../libs/browser";
|
import { browser } from "../../libs/browser";
|
||||||
import { isExt } from "../../libs/client";
|
import { isExt } from "../../libs/client";
|
||||||
import { useI18n } from "../../hooks/I18n";
|
import { useI18n } from "../../hooks/I18n";
|
||||||
@@ -24,6 +24,7 @@ import {
|
|||||||
CACHE_NAME,
|
CACHE_NAME,
|
||||||
} from "../../config";
|
} from "../../config";
|
||||||
import { sendIframeMsg } from "../../libs/iframe";
|
import { sendIframeMsg } from "../../libs/iframe";
|
||||||
|
import { saveRule } from "../../libs/rules";
|
||||||
|
|
||||||
export default function Popup({ setShowPopup, translator: tran }) {
|
export default function Popup({ setShowPopup, translator: tran }) {
|
||||||
const i18n = useI18n();
|
const i18n = useI18n();
|
||||||
@@ -77,6 +78,20 @@ export default function Popup({ setShowPopup, translator: tran }) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleSaveRule = async () => {
|
||||||
|
try {
|
||||||
|
let host = window.location.host;
|
||||||
|
if (isExt) {
|
||||||
|
const tab = await getTabInfo();
|
||||||
|
const url = new URL(tab.url);
|
||||||
|
host = url.host;
|
||||||
|
}
|
||||||
|
saveRule({ ...rule, pattern: host });
|
||||||
|
} catch (err) {
|
||||||
|
console.log("[save rule]", err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!isExt) {
|
if (!isExt) {
|
||||||
return;
|
return;
|
||||||
@@ -218,9 +233,19 @@ export default function Popup({ setShowPopup, translator: tran }) {
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<Button variant="text" onClick={handleOpenSetting}>
|
<Stack
|
||||||
{i18n("setting")}
|
direction="row"
|
||||||
</Button>
|
justifyContent="space-between"
|
||||||
|
alignItems="center"
|
||||||
|
spacing={2}
|
||||||
|
>
|
||||||
|
<Button variant="text" onClick={handleSaveRule}>
|
||||||
|
{i18n("save_rule")}
|
||||||
|
</Button>
|
||||||
|
<Button variant="text" onClick={handleOpenSetting}>
|
||||||
|
{i18n("setting")}
|
||||||
|
</Button>
|
||||||
|
</Stack>
|
||||||
</Stack>
|
</Stack>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user