All files / blacktrigram/src/audio AudioProvider.tsx

0% Statements 0/29
0% Branches 0/1
0% Functions 0/1
0% Lines 0/29

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                                                                                       
import React, { createContext, useContext, useEffect, useState } from "react";
import AudioManager from "./AudioManager";
import placeholderAssets from "./placeholder-sounds";
import { AudioAsset, AudioConfig, IAudioManager } from "./types";
 
export interface AudioProviderProps {
  children: React.ReactNode;
  config?: Partial<AudioConfig>;
  manager?: IAudioManager;
}
 
export const AudioContext = createContext<IAudioManager | null>(null);
 
export const useAudio = (): IAudioManager => {
  const ctx = useContext(AudioContext);
  if (!ctx) throw new Error("useAudio must be inside AudioProvider");
  return ctx;
};
 
export const AudioProvider: React.FC<AudioProviderProps> = ({
  children,
  config,
  manager,
}) => {
  const [audioManager] = useState<IAudioManager>(
    () => manager || new AudioManager(config)
  );
 
  useEffect(() => {
    (async () => {
      await audioManager.initialize(); // no args
      // preload all placeholder assets
      const list = Object.values(placeholderAssets).flat() as AudioAsset[];
      await Promise.all(list.map((a) => audioManager.loadAsset(a)));
    })();
  }, [audioManager]);
 
  return (
    <AudioContext.Provider value={audioManager}>
      {children}
    </AudioContext.Provider>
  );
};