HotkeysManager.jsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import React, { useState } from 'react';
  2. import HotkeysDetector from './HotkeysDetector';
  3. import ShowStaffCredit from './Subscribers/ShowStaffCredit';
  4. import SwitchToMirrorMode from './Subscribers/SwitchToMirrorMode';
  5. import ShowShortcutsModal from './Subscribers/ShowShortcutsModal';
  6. import CreatePage from './Subscribers/CreatePage';
  7. import EditPage from './Subscribers/EditPage';
  8. import FocusToGlobalSearch from './Subscribers/FocusToGlobalSearch';
  9. // define supported components list
  10. const SUPPORTED_COMPONENTS = [
  11. ShowStaffCredit,
  12. SwitchToMirrorMode,
  13. ShowShortcutsModal,
  14. CreatePage,
  15. EditPage,
  16. FocusToGlobalSearch,
  17. ];
  18. const KEY_SET = new Set();
  19. const STROKE_SET = new Set();
  20. const STROKE_TO_COMPONENT_MAP = {};
  21. SUPPORTED_COMPONENTS.forEach((comp) => {
  22. const strokes = comp.getHotkeyStrokes();
  23. strokes.forEach((stroke) => {
  24. // register key
  25. stroke.forEach(key => KEY_SET.add(key));
  26. // register stroke
  27. STROKE_SET.add(stroke);
  28. // register component
  29. const componentList = STROKE_TO_COMPONENT_MAP[stroke] || [];
  30. componentList.push(comp);
  31. STROKE_TO_COMPONENT_MAP[stroke.toString()] = componentList;
  32. });
  33. });
  34. const HotkeysManager = (props) => {
  35. const [view, setView] = useState([]);
  36. /**
  37. * delete the instance in state.view
  38. */
  39. const deleteRender = (instance) => {
  40. const index = view.lastIndexOf(instance);
  41. const newView = view.slice(); // shallow copy
  42. newView.splice(index, 1);
  43. setView(newView);
  44. };
  45. /**
  46. * activates when one of the hotkey strokes gets determined from HotkeysDetector
  47. */
  48. const onDetected = (strokeDetermined) => {
  49. const key = (Math.random() * 1000).toString();
  50. const components = STROKE_TO_COMPONENT_MAP[strokeDetermined.toString()];
  51. const newViews = components.map(Component => (
  52. <Component key={key} onDeleteRender={deleteRender} />
  53. ));
  54. setView(view.concat(newViews).flat());
  55. };
  56. return (
  57. <>
  58. <HotkeysDetector
  59. onDetected={stroke => onDetected(stroke)}
  60. keySet={KEY_SET}
  61. strokeSet={STROKE_SET}
  62. />
  63. {view}
  64. </>
  65. );
  66. };
  67. export default HotkeysManager;