diff --git a/src/index.ts b/src/index.ts index 0eacc23..98c6942 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,7 +18,7 @@ import getChildrenLengthByParentUid from "roamjs-components/queries/getChildrenL import initializeTodont, { TODONT_MODES } from "./utils/todont"; export default runExtension(async ({ extensionAPI }) => { - const toggleTodont = initializeTodont(); + const toggleTodont = initializeTodont(extensionAPI); extensionAPI.settings.panel.create({ tabTitle: "TODO Trigger", settings: [ @@ -83,7 +83,7 @@ export default runExtension(async ({ extensionAPI }) => { id: "todont-mode", name: "TODONT Mode", description: - "Whether to incorporate styling when TODOS turn into ARCHIVED buttons.", + "Whether to incorporate styling when TODOS turn into ARCHIVED buttons. When enabled, adds 'Archive TODO' command to the command palette (customizable hotkey in Settings → Hotkeys).", action: { type: "select", items: TODONT_MODES.slice(0), diff --git a/src/utils/todont.ts b/src/utils/todont.ts index b6f966e..06c3026 100644 --- a/src/utils/todont.ts +++ b/src/utils/todont.ts @@ -6,7 +6,6 @@ import getBasicTreeByParentUid from "roamjs-components/queries/getBasicTreeByPar import createHTMLObserver from "roamjs-components/dom/createHTMLObserver"; import createObserver from "roamjs-components/dom/createObserver"; import toFlexRegex from "roamjs-components/util/toFlexRegex"; -import isControl from "roamjs-components/util/isControl"; import getUids from "roamjs-components/dom/getUids"; import { OnloadArgs } from "roamjs-components/types"; @@ -82,9 +81,15 @@ export const replaceText = ({ export const TODONT_MODES = ["off", "icon", "strikethrough"] as const; -const initializeTodont = () => { +const ARCHIVE_COMMAND_LABEL = "Archive TODO"; + +const initializeTodont = (extensionAPI: OnloadArgs["extensionAPI"]) => { const unloads = new Set<() => void>(); return async (todontMode: typeof TODONT_MODES[number]) => { + // Clean up previous mode before setting up new one + unloads.forEach((u) => u()); + unloads.clear(); + if (todontMode !== "off") { const TODONT_CLASSNAME = "roamjs-todont"; const css = document.createElement("style"); @@ -197,15 +202,16 @@ const initializeTodont = () => { } }; - const keydownEventListener = async (e: KeyboardEvent) => { - if (e.key === "Enter" && e.shiftKey && isControl(e)) { - todontCallback(); - } - }; - - document.addEventListener("keydown", keydownEventListener); + extensionAPI.ui.commandPalette.addCommand({ + label: ARCHIVE_COMMAND_LABEL, + callback: todontCallback, + "default-hotkey": "ctrl-shift-enter", + "disable-hotkey": false, + }); unloads.add(() => { - document.removeEventListener("keydown", keydownEventListener); + extensionAPI.ui.commandPalette.removeCommand({ + label: ARCHIVE_COMMAND_LABEL, + }); }); if (todontMode === "strikethrough") { @@ -235,9 +241,6 @@ const initializeTodont = () => { }); unloads.add(() => strikethroughObserver.disconnect()); } - } else { - unloads.forEach((u) => u()); - unloads.clear(); } }; };