Files
decky-frontend-lib/src/plugin.tsx

47 lines
1.4 KiB
TypeScript
Raw Normal View History

2022-05-30 21:00:38 +02:00
import type { ComponentType } from 'react';
import { RouteProps } from 'react-router';
2022-04-22 22:31:54 +02:00
export interface Plugin {
title: JSX.Element;
icon: JSX.Element;
content: JSX.Element;
2022-04-22 22:31:54 +02:00
onDismount?(): void;
}
interface ServerResponseSuccess<TRes> {
success: true;
result: TRes;
}
interface ServerResponseError {
success: false;
result: string;
}
type ServerResponse<TRes> = ServerResponseSuccess<TRes> | ServerResponseError;
2022-05-30 21:00:38 +02:00
interface RouterHook {
addRoute(path: string, component: ComponentType, props?: Omit<RouteProps, 'path' | 'children'>): void;
removeRoute(path: string): void;
}
2022-04-22 22:31:54 +02:00
export interface ServerAPI {
2022-05-30 21:00:38 +02:00
routerHook: RouterHook;
2022-04-22 22:31:54 +02:00
callPluginMethod<TArgs = {}, TRes = {}>(methodName: string, args: TArgs): Promise<ServerResponse<TRes>>;
callServerMethod<TArgs = {}, TRes = {}>(methodName: string, args: TArgs): Promise<ServerResponse<TRes>>;
fetchNoCors<TRes = {}>(url: RequestInfo, request?: RequestInit): Promise<ServerResponse<TRes>>;
2022-04-22 22:31:54 +02:00
executeInTab(tab: string, runAsync: boolean, code: string): Promise<unknown>;
injectCssIntoTab<TRes = string>(tab: string, style: string): Promise<ServerResponse<TRes>>;
2022-04-22 22:31:54 +02:00
removeCssFromTab(tab: string, cssId: string): Promise<unknown>;
}
type DefinePluginFn = (serverAPI: ServerAPI) => Plugin;
// TypeScript helper function
2022-05-10 23:38:10 +02:00
export const definePlugin = (fn: DefinePluginFn): DefinePluginFn => {
return (...args) => {
// TODO: Maybe wrap this
return fn(...args);
};
2022-04-22 22:31:54 +02:00
};