HotkeysManager.jsx 2.1 KB

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