HotkeysManager.jsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import React, { useState } from 'react';
  2. import HotkeysDetector from './HotkeysDetector';
  3. import StaffCredit from '../StaffCredit/StaffCredit';
  4. import MirrorMode from '../MirrorMode/MirrorMode';
  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. // StaffCredit,
  11. // MirrorMode,
  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;