HotkeysManager.jsx 2.0 KB

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