diff --git a/public/manifest.firefox.json b/public/manifest.firefox.json index 03dc1f6..2e71c3b 100644 --- a/public/manifest.firefox.json +++ b/public/manifest.firefox.json @@ -17,6 +17,11 @@ } ], "commands": { + "_execute_browser_action": { + "suggested_key": { + "default": "Alt+K" + } + }, "toggleTranslate": { "suggested_key": { "default": "Alt+Q" diff --git a/public/manifest.json b/public/manifest.json index f3b3ba6..ca4ed46 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -18,6 +18,11 @@ } ], "commands": { + "_execute_action": { + "suggested_key": { + "default": "Alt+K" + } + }, "toggleTranslate": { "suggested_key": { "default": "Alt+Q" diff --git a/src/userscript.js b/src/userscript.js index 8f6afbf..573a142 100644 --- a/src/userscript.js +++ b/src/userscript.js @@ -10,12 +10,10 @@ import { } from "./libs/storage"; import { Translator } from "./libs/translator"; import { trySyncAllSubRules } from "./libs/subRules"; -import { isGm } from "./libs/client"; import { MSG_TRANS_TOGGLE, MSG_TRANS_PUTRULE } from "./config"; import { isIframe } from "./libs/iframe"; import { handlePing, injectScript } from "./libs/gm"; import { matchRule } from "./libs/rules"; -import { register } from "@violentmonkey/shortcut"; /** * 入口函数 @@ -89,40 +87,6 @@ const init = async () => { ); - // 注册菜单 - if (isGm) { - try { - GM.registerMenuCommand( - "Toggle Translate", - (event) => { - translator.toggle(); - }, - "Q" - ); - GM.registerMenuCommand( - "Toggle Style", - (event) => { - translator.toggleStyle(); - }, - "C" - ); - } catch (err) { - console.log("[registerMenuCommand]", err); - } - } - - // 注册快捷键 - try { - register("a-q", () => { - translator.toggle(); - }); - register("a-c", () => { - translator.toggleStyle(); - }); - } catch (err) { - console.log("[shortcut.register", err); - } - // 同步订阅规则 trySyncAllSubRules(setting); }; diff --git a/src/views/Action/index.js b/src/views/Action/index.js index dde75b5..a5e2dfe 100644 --- a/src/views/Action/index.js +++ b/src/views/Action/index.js @@ -11,6 +11,8 @@ import { useEffect, useState, useMemo, useCallback } from "react"; import { SettingProvider } from "../../hooks/Setting"; import Popup from "../Popup"; import { debounce } from "../../libs/utils"; +import * as shortcut from "@violentmonkey/shortcut"; +import { isGm } from "../../libs/client"; export default function Action({ translator, fab }) { const fabWidth = 40; @@ -44,6 +46,73 @@ export default function Action({ translator, fab }) { setMoved(true); }, []); + useEffect(() => { + // 注册快捷键 + shortcut.register("a-q", () => { + translator.toggle(); + setShowPopup(false); + }); + shortcut.register("a-c", () => { + translator.toggleStyle(); + setShowPopup(false); + }); + shortcut.register("a-k", () => { + setShowPopup((pre) => !pre); + }); + + return () => { + shortcut.disable(); + }; + }, [translator]); + + useEffect(() => { + // 注册菜单 + const menuCommandIds = []; + if (isGm) { + try { + menuCommandIds.push( + GM.registerMenuCommand( + "Toggle Translate", + (event) => { + translator.toggle(); + setShowPopup(false); + }, + "Q" + ), + GM.registerMenuCommand( + "Toggle Style", + (event) => { + translator.toggleStyle(); + setShowPopup(false); + }, + "C" + ), + GM.registerMenuCommand( + "Open Menu", + (event) => { + setShowPopup((pre) => !pre); + }, + "K" + ) + ); + } catch (err) { + console.log("[registerMenuCommand]", err); + } + } + + return () => { + if (isGm) { + try { + menuCommandIds.forEach((id) => { + GM.unregisterMenuCommand(id); + }); + } catch (err) { + // + } + } + }; + }, [translator]); + useEffect(() => { window.addEventListener("resize", handleWindowResize); return () => { @@ -53,6 +122,7 @@ export default function Action({ translator, fab }) { useEffect(() => { window.addEventListener("click", handleWindowClick); + return () => { window.removeEventListener("click", handleWindowClick); };