All files / src/components/music/midi MusicMidiProjectBridge.ts

0% Statements 0/33
0% Branches 0/10
0% Functions 0/5
0% Lines 0/32

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68                                                                                                                                       
import API from "renderer/lib/api";
import type { MusicMidiState } from "shared/lib/music/midi";
import { musicMidiController } from "./musicMidiController";
 
type MusicMidiBridgeStore = {
  dispatch: (action: unknown) => unknown;
  getState: () => {
    tracker: {
      midiInput: MusicMidiState;
    };
  };
  subscribe: (listener: () => void) => () => void;
};
 
let activeStore: MusicMidiBridgeStore | null = null;
let teardownBridge: (() => void) | null = null;
 
export const initMusicMidiProjectBridge = (store: MusicMidiBridgeStore) => {
  Iif (activeStore === store && teardownBridge) {
    return teardownBridge;
  }
 
  teardownBridge?.();
 
  activeStore = store;
  musicMidiController.bindStore(store);
 
  let previousMidiState = store.getState().tracker.midiInput;
 
  API.music.updateMidiInputMenuState(previousMidiState);
 
  const unsubscribeStore = store.subscribe(() => {
    const midiState = store.getState().tracker.midiInput;
    Iif (midiState === previousMidiState) {
      return;
    }
 
    previousMidiState = midiState;
    API.music.updateMidiInputMenuState(midiState);
  });
 
  const unsubscribeToggle = API.events.menu.midiInputToggle.subscribe(() => {
    void musicMidiController.toggleEnabled();
  });
 
  const unsubscribeSelect = API.events.menu.midiInputSelect.subscribe(
    (_event, inputId) => {
      void musicMidiController.selectInput(inputId);
    },
  );
 
  void musicMidiController.initialize();
 
  teardownBridge = () => {
    unsubscribeStore();
    unsubscribeToggle();
    unsubscribeSelect();
    Iif (activeStore === store) {
      activeStore = null;
    }
    Iif (teardownBridge) {
      teardownBridge = null;
    }
  };
 
  return teardownBridge;
};