mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-06-17 00:37:49 +00:00
84c3b039c3
* initial fixes: everything working except toasts and patch notes * tabshook changes, disable toaster for now * prettier * oops * implement custom toaster because I am tired of Valve's shit also fix QAM not injecting sometimes * remove extra logging * add findSP, fix patch notes, fix vscode screwup * fix patch notes * show error when plugin frontends fail to load * add get_tab_lambda * add css and has_element helpers to Tab * small modals fixup * Don't forceUpdate QuickAccess on stable * add routes prop used to get tabs component * add more dev utils to DFL global
75 lines
2.2 KiB
TypeScript
75 lines
2.2 KiB
TypeScript
import { FC, createContext, useContext, useEffect, useState } from 'react';
|
|
|
|
interface PublicDeckyGlobalComponentsState {
|
|
components: Map<string, FC>;
|
|
}
|
|
|
|
export class DeckyGlobalComponentsState {
|
|
// TODO a set would be better
|
|
private _components = new Map<string, FC>();
|
|
|
|
public eventBus = new EventTarget();
|
|
|
|
publicState(): PublicDeckyGlobalComponentsState {
|
|
return { components: this._components };
|
|
}
|
|
|
|
addComponent(path: string, component: FC) {
|
|
this._components.set(path, component);
|
|
this.notifyUpdate();
|
|
}
|
|
|
|
removeComponent(path: string) {
|
|
this._components.delete(path);
|
|
this.notifyUpdate();
|
|
}
|
|
|
|
private notifyUpdate() {
|
|
this.eventBus.dispatchEvent(new Event('update'));
|
|
}
|
|
}
|
|
|
|
interface DeckyGlobalComponentsContext extends PublicDeckyGlobalComponentsState {
|
|
addComponent(path: string, component: FC): void;
|
|
removeComponent(path: string): void;
|
|
}
|
|
|
|
const DeckyGlobalComponentsContext = createContext<DeckyGlobalComponentsContext>(null as any);
|
|
|
|
export const useDeckyGlobalComponentsState = () => useContext(DeckyGlobalComponentsContext);
|
|
|
|
interface Props {
|
|
deckyGlobalComponentsState: DeckyGlobalComponentsState;
|
|
}
|
|
|
|
export const DeckyGlobalComponentsStateContextProvider: FC<Props> = ({
|
|
children,
|
|
deckyGlobalComponentsState: deckyGlobalComponentsState,
|
|
}) => {
|
|
const [publicDeckyGlobalComponentsState, setPublicDeckyGlobalComponentsState] =
|
|
useState<PublicDeckyGlobalComponentsState>({
|
|
...deckyGlobalComponentsState.publicState(),
|
|
});
|
|
|
|
useEffect(() => {
|
|
function onUpdate() {
|
|
setPublicDeckyGlobalComponentsState({ ...deckyGlobalComponentsState.publicState() });
|
|
}
|
|
|
|
deckyGlobalComponentsState.eventBus.addEventListener('update', onUpdate);
|
|
|
|
return () => deckyGlobalComponentsState.eventBus.removeEventListener('update', onUpdate);
|
|
}, []);
|
|
|
|
const addComponent = deckyGlobalComponentsState.addComponent.bind(deckyGlobalComponentsState);
|
|
const removeComponent = deckyGlobalComponentsState.removeComponent.bind(deckyGlobalComponentsState);
|
|
|
|
return (
|
|
<DeckyGlobalComponentsContext.Provider
|
|
value={{ ...publicDeckyGlobalComponentsState, addComponent, removeComponent }}
|
|
>
|
|
{children}
|
|
</DeckyGlobalComponentsContext.Provider>
|
|
);
|
|
};
|