@steambrew/client
Version:
A support library for creating plugins with Millennium.
51 lines (50 loc) • 2.4 kB
JavaScript
import { jsx as _jsx } from "react/jsx-runtime";
import { createContext, useContext, useEffect, useState } from 'react';
import { EUIMode } from '../../globals/steam-client/shared';
export class MillenniumGlobalComponentsState {
constructor() {
// TODO a set would be better
this._components = new Map([
[EUIMode.GamePad, new Map()],
[EUIMode.Desktop, new Map()],
]);
this.eventBus = new EventTarget();
}
publicState() {
return { components: this._components };
}
addComponent(path, component, uiMode) {
const components = this._components.get(uiMode);
if (!components)
throw new Error(`UI mode ${uiMode} not supported.`);
components.set(path, component);
this.notifyUpdate();
}
removeComponent(path, uiMode) {
const components = this._components.get(uiMode);
if (!components)
throw new Error(`UI mode ${uiMode} not supported.`);
components.delete(path);
this.notifyUpdate();
}
notifyUpdate() {
this.eventBus.dispatchEvent(new Event('update'));
}
}
const MillenniumGlobalComponentsContext = createContext(null);
export const useMillenniumGlobalComponentsState = () => useContext(MillenniumGlobalComponentsContext);
export const MillenniumGlobalComponentsStateContextProvider = ({ children, millenniumGlobalComponentsState: millenniumGlobalComponentsState }) => {
const [publicMillenniumGlobalComponentsState, setPublicMillenniumGlobalComponentsState] = useState({
...millenniumGlobalComponentsState.publicState(),
});
useEffect(() => {
function onUpdate() {
setPublicMillenniumGlobalComponentsState({ ...millenniumGlobalComponentsState.publicState() });
}
millenniumGlobalComponentsState.eventBus.addEventListener('update', onUpdate);
return () => millenniumGlobalComponentsState.eventBus.removeEventListener('update', onUpdate);
}, []);
const addComponent = millenniumGlobalComponentsState.addComponent.bind(millenniumGlobalComponentsState);
const removeComponent = millenniumGlobalComponentsState.removeComponent.bind(millenniumGlobalComponentsState);
return (_jsx(MillenniumGlobalComponentsContext.Provider, { value: { ...publicMillenniumGlobalComponentsState, addComponent, removeComponent }, children: children }));
};