shortcut.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import Mousetrap from 'mousetrap';
  2. import browser from 'webextension-polyfill';
  3. import { sendMessage } from '@/utils/message';
  4. Mousetrap.prototype.stopCallback = function () {
  5. return false;
  6. };
  7. function getTriggerBlock(workflow) {
  8. const drawflow = JSON.parse(workflow?.drawflow || '{}');
  9. if (!drawflow?.drawflow?.Home?.data) return null;
  10. const blocks = Object.values(drawflow.drawflow.Home.data);
  11. const trigger = blocks.find(({ name }) => name === 'trigger');
  12. return trigger;
  13. }
  14. (async () => {
  15. try {
  16. const { shortcuts, workflows } = await browser.storage.local.get([
  17. 'shortcuts',
  18. 'workflows',
  19. ]);
  20. const shortcutsArr = Object.entries(shortcuts || {});
  21. if (shortcutsArr.length === 0) return;
  22. const keyboardShortcuts = shortcutsArr.reduce((acc, [id, value]) => {
  23. const workflow = [...workflows].find((item) => item.id === id);
  24. (acc[value] = acc[value] || []).push({
  25. id,
  26. workflow,
  27. activeInInput: getTriggerBlock(workflow)?.data?.activeInInput,
  28. });
  29. return acc;
  30. }, {});
  31. Mousetrap.bind(Object.keys(keyboardShortcuts), ({ target }, command) => {
  32. const isInputElement =
  33. ['INPUT', 'SELECT', 'TEXTAREA'].includes(target.tagName) ||
  34. target?.contentEditable === 'true';
  35. keyboardShortcuts[command].forEach((item) => {
  36. if (!item.activeInInput && isInputElement) return;
  37. sendMessage('workflow:execute', item.workflow, 'background');
  38. });
  39. return true;
  40. });
  41. } catch (error) {
  42. console.error(error);
  43. }
  44. })();