voice-changer/client/demo/src/001_provider/001_AppStateProvider.tsx

39 lines
1.4 KiB
TypeScript
Raw Normal View History

2023-02-16 18:09:56 +03:00
import { ClientState } from "@dannadori/voice-changer-client-js";
import React, { useContext, useEffect } from "react";
import { ReactNode } from "react";
import { useVCClient, VCClientState } from "../001_globalHooks/001_useVCClient";
import { FrontendManagerStateAndMethod, useFrontendManager } from "../001_globalHooks/010_useFrontendManager";
import { useAppRoot } from "./001_AppRootProvider";
type Props = {
children: ReactNode;
};
type AppStateValue = ClientState & {
audioContext: AudioContext
frontendManagerState: FrontendManagerStateAndMethod;
}
const AppStateContext = React.createContext<AppStateValue | null>(null);
export const useAppState = (): AppStateValue => {
const state = useContext(AppStateContext);
if (!state) {
throw new Error("useAppState must be used within AppStateProvider");
}
return state;
};
export const AppStateProvider = ({ children }: Props) => {
const appRoot = useAppRoot()
2023-02-16 20:11:03 +03:00
const clientState = useVCClient({ audioContext: appRoot.audioContextState.audioContext })
2023-02-16 18:09:56 +03:00
const frontendManagerState = useFrontendManager();
const providerValue: AppStateValue = {
audioContext: appRoot.audioContextState.audioContext!,
...clientState.clientState,
frontendManagerState
};
return <AppStateContext.Provider value={providerValue}>{children}</AppStateContext.Provider>;
};