mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-07-10 23:51:59 +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
70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
import { ToastData } from 'decky-frontend-lib';
|
|
import { FC, createContext, useContext, useEffect, useState } from 'react';
|
|
|
|
interface PublicDeckyToasterState {
|
|
toasts: Set<ToastData>;
|
|
}
|
|
|
|
export class DeckyToasterState {
|
|
// TODO a set would be better
|
|
private _toasts: Set<ToastData> = new Set();
|
|
|
|
public eventBus = new EventTarget();
|
|
|
|
publicState(): PublicDeckyToasterState {
|
|
return { toasts: this._toasts };
|
|
}
|
|
|
|
addToast(toast: ToastData) {
|
|
this._toasts.add(toast);
|
|
this.notifyUpdate();
|
|
}
|
|
|
|
removeToast(toast: ToastData) {
|
|
this._toasts.delete(toast);
|
|
this.notifyUpdate();
|
|
}
|
|
|
|
private notifyUpdate() {
|
|
this.eventBus.dispatchEvent(new Event('update'));
|
|
}
|
|
}
|
|
|
|
interface DeckyToasterContext extends PublicDeckyToasterState {
|
|
addToast(toast: ToastData): void;
|
|
removeToast(toast: ToastData): void;
|
|
}
|
|
|
|
const DeckyToasterContext = createContext<DeckyToasterContext>(null as any);
|
|
|
|
export const useDeckyToasterState = () => useContext(DeckyToasterContext);
|
|
|
|
interface Props {
|
|
deckyToasterState: DeckyToasterState;
|
|
}
|
|
|
|
export const DeckyToasterStateContextProvider: FC<Props> = ({ children, deckyToasterState }) => {
|
|
const [publicDeckyToasterState, setPublicDeckyToasterState] = useState<PublicDeckyToasterState>({
|
|
...deckyToasterState.publicState(),
|
|
});
|
|
|
|
useEffect(() => {
|
|
function onUpdate() {
|
|
setPublicDeckyToasterState({ ...deckyToasterState.publicState() });
|
|
}
|
|
|
|
deckyToasterState.eventBus.addEventListener('update', onUpdate);
|
|
|
|
return () => deckyToasterState.eventBus.removeEventListener('update', onUpdate);
|
|
}, []);
|
|
|
|
const addToast = deckyToasterState.addToast.bind(deckyToasterState);
|
|
const removeToast = deckyToasterState.removeToast.bind(deckyToasterState);
|
|
|
|
return (
|
|
<DeckyToasterContext.Provider value={{ ...publicDeckyToasterState, addToast, removeToast }}>
|
|
{children}
|
|
</DeckyToasterContext.Provider>
|
|
);
|
|
};
|