UNPKG

@steambrew/client

Version:
51 lines (50 loc) 2.4 kB
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 })); };