diff options
| author | AAGaming <aa@mail.catvibers.me> | 2022-10-24 19:14:56 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-24 16:14:56 -0700 |
| commit | 84c3b039c385ad872bb0f22eba7a3d2cd4a5ea10 (patch) | |
| tree | 20b13066c6256cc6ca1beac085094c7964226a37 /frontend/src/components/DeckyToasterState.tsx | |
| parent | 2e6b3834da357c7e81821ce60bad36f54dd9fa6e (diff) | |
| download | decky-loader-84c3b039c385ad872bb0f22eba7a3d2cd4a5ea10.tar.gz decky-loader-84c3b039c385ad872bb0f22eba7a3d2cd4a5ea10.zip | |
preview 10/21/2022 fixes (#234)
* 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
Diffstat (limited to 'frontend/src/components/DeckyToasterState.tsx')
| -rw-r--r-- | frontend/src/components/DeckyToasterState.tsx | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/frontend/src/components/DeckyToasterState.tsx b/frontend/src/components/DeckyToasterState.tsx new file mode 100644 index 00000000..8732d7f8 --- /dev/null +++ b/frontend/src/components/DeckyToasterState.tsx @@ -0,0 +1,69 @@ +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> + ); +}; |
