Compare commits

...

1 Commits

Author SHA1 Message Date
AAGaming
d6e399fa46 feat(plugin): add menu and overlay patching api 2022-12-31 21:48:31 -05:00
2 changed files with 49 additions and 2 deletions

View File

@@ -1,4 +1,4 @@
import { CSSProperties, FC } from 'react'; import { CSSProperties, FC, ReactNode } from 'react';
import { findModuleChild } from '../webpack'; import { findModuleChild } from '../webpack';
@@ -12,7 +12,7 @@ export interface MarqueeProps {
resetOnPause?: boolean; resetOnPause?: boolean;
style?: CSSProperties; style?: CSSProperties;
className?: string; className?: string;
children: React.ReactNode; children: ReactNode;
} }
export const Marquee: FC<MarqueeProps> = findModuleChild((m) => { export const Marquee: FC<MarqueeProps> = findModuleChild((m) => {

View File

@@ -21,6 +21,52 @@ interface ServerResponseError {
export type ServerResponse<TRes> = ServerResponseSuccess<TRes> | ServerResponseError; export type ServerResponse<TRes> = ServerResponseSuccess<TRes> | ServerResponseError;
export interface MainMenuItem {
/** Called when clicking this menu item, useful if you do not want to navigate to a route.
* For navigating to a route, use route instead. */
action?: () => void;
/** The route this menu item navigates to @example "/steamweb" */
route?: string;
/** Props for the route this item navigates to. Currently only used for /steamweb to determine what webpack to navigate to @example {url: 'https://store.steampowered.com/'} */
routeState?: any;
/** Label for this menu item, @example "Store" */
label: ReactNode;
/** Runs when this item is selected. Defaults to setting the focused app to null.
* If you override this you must also call the original to retain proper behaivour */
onFocus?: () => void;
/** Icon of this menu item, you probably want a react SVG node */
children: ReactNode;
}
export interface CustomMainMenuItem extends MainMenuItem {
index: number;
}
export interface MainMenuItemReactNode {
props: MainMenuItem;
type: ComponentType;
key: any;
}
export interface OverlayReactNode {
props: MainMenuItem;
type: ComponentType;
}
export type ItemPatch = (item: MainMenuItemReactNode) => MainMenuItemReactNode;
export type OverlayPatch = (overlay: OverlayReactNode) => OverlayReactNode;
export interface MenuHook {
addItem(item: CustomMainMenuItem): CustomMainMenuItem;
addPatch(path: string, patch: ItemPatch): ItemPatch;
addOverlayPatch(patch: OverlayPatch): OverlayPatch;
addOverlayComponent(component: ReactNode): ReactNode;
removePatch(path: string, patch: ItemPatch): void;
removeOverlayPatch(patch: OverlayPatch): void;
removeOverlayComponent(component: ReactNode): void;
removeItem(item: CustomMainMenuItem): void;
}
export type RoutePatch = (route: RouteProps) => RouteProps; export type RoutePatch = (route: RouteProps) => RouteProps;
export interface RouterHook { export interface RouterHook {
@@ -59,6 +105,7 @@ export interface FilePickerRes {
export interface ServerAPI { export interface ServerAPI {
routerHook: RouterHook; routerHook: RouterHook;
menuHook: MenuHook;
toaster: Toaster; toaster: Toaster;
openFilePicker(startPath: string, includeFiles?: boolean, regex?: RegExp): Promise<FilePickerRes>; openFilePicker(startPath: string, includeFiles?: boolean, regex?: RegExp): Promise<FilePickerRes>;
callPluginMethod<TArgs = {}, TRes = {}>(methodName: string, args: TArgs): Promise<ServerResponse<TRes>>; callPluginMethod<TArgs = {}, TRes = {}>(methodName: string, args: TArgs): Promise<ServerResponse<TRes>>;