Compare commits

..

12 Commits

Author SHA1 Message Date
semantic-release-bot
edcc43a6ee chore(release): 3.18.10 [CI SKIP] 2023-01-17 00:35:19 +00:00
AAGaming
9723854ddc fix(SuspensefulImage): fix changing src 2023-01-16 19:34:44 -05:00
semantic-release-bot
7501817b76 chore(release): 3.18.9 [CI SKIP] 2023-01-16 14:13:05 +00:00
AAGaming
4affd4aaec fix(Navigation): fix on stable 2023-01-16 09:12:16 -05:00
semantic-release-bot
6b3db72a14 chore(release): 3.18.8 [CI SKIP] 2023-01-16 01:23:38 +00:00
AAGaming
58b69f0d6c fix(Navigation): fix timing issue in decky-loader 2023-01-15 20:22:54 -05:00
semantic-release-bot
c62102e993 chore(release): 3.18.7 [CI SKIP] 2023-01-16 00:19:36 +00:00
AAGaming
2e66e5a555 fix: un-break navigation on stable 2023-01-15 19:18:47 -05:00
semantic-release-bot
ce525318d8 chore(release): 3.18.6 [CI SKIP] 2023-01-13 02:55:51 +00:00
AAGaming
aac2d520a6 fix(Router): fix Navigation for the millionth time 2023-01-12 21:55:08 -05:00
semantic-release-bot
a656f4e57f chore(release): 3.18.5 [CI SKIP] 2022-12-21 15:57:16 +00:00
noot
0b50f2cf0b fix: fixed prop interfaces (#70) 2022-12-21 10:56:39 -05:00
7 changed files with 118 additions and 82 deletions

View File

@@ -1,3 +1,45 @@
## [3.18.10](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.18.9...v3.18.10) (2023-01-17)
### Bug Fixes
* **SuspensefulImage:** fix changing src ([9723854](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/9723854ddca53d7708e1effbddec9e5ead22d5de))
## [3.18.9](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.18.8...v3.18.9) (2023-01-16)
### Bug Fixes
* **Navigation:** fix on stable ([4affd4a](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/4affd4aaec088f01d0f30af48cb4daa34acf26b1))
## [3.18.8](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.18.7...v3.18.8) (2023-01-16)
### Bug Fixes
* **Navigation:** fix timing issue in decky-loader ([58b69f0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/58b69f0d6c43356c4f0ed183802d5bf7fb80e978))
## [3.18.7](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.18.6...v3.18.7) (2023-01-16)
### Bug Fixes
* un-break navigation on stable ([2e66e5a](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/2e66e5a555f44009d24e332eca82453ba930baf7))
## [3.18.6](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.18.5...v3.18.6) (2023-01-13)
### Bug Fixes
* **Router:** fix Navigation for the millionth time ([aac2d52](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/aac2d520a68b1074ba1ae988d6c92f7881a296d7))
## [3.18.5](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.18.4...v3.18.5) (2022-12-21)
### Bug Fixes
* fixed prop interfaces ([#70](https://github.com/SteamDeckHomebrew/decky-frontend-lib/issues/70)) ([0b50f2c](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/0b50f2cf0baa76fc00aa0a41a8435d7a512bff19))
## [3.18.4](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v3.18.3...v3.18.4) (2022-12-16)

View File

@@ -1,6 +1,6 @@
{
"name": "decky-frontend-lib",
"version": "3.18.4",
"version": "3.18.10",
"description": "A library for building decky plugins",
"main": "dist/index.js",
"types": "dist/index.d.ts",

View File

@@ -13,6 +13,8 @@ export const SuspensefulImage: FC<SuspensefulImageProps> = (props) => {
const [error, setError] = useState(false);
useEffect(() => {
setLoading(true);
setError(false);
const img = new Image();
img.src = props.src || '';
img.addEventListener('load', () => {
@@ -21,7 +23,7 @@ export const SuspensefulImage: FC<SuspensefulImageProps> = (props) => {
img.addEventListener('error', () => {
setError(true);
});
}, []);
}, [props.src]);
return loading ? (
<div

View File

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

View File

@@ -1,10 +1,11 @@
import { FC } from 'react';
import { FC, ReactNode } from 'react';
import { findModuleChild } from '../webpack';
export interface PanelSectionProps {
title?: string;
spinner?: boolean;
children?: ReactNode
}
const [panelSection, mod] = findModuleChild((mod: any) => {
@@ -18,6 +19,10 @@ const [panelSection, mod] = findModuleChild((mod: any) => {
export const PanelSection = panelSection as FC<PanelSectionProps>;
export interface PanelSectionRowProps {
children?: ReactNode
}
export const PanelSectionRow = Object.values(mod).filter(
(exp: any) => !exp?.toString()?.includes('.PanelSection'),
)[0] as FC;
)[0] as FC<PanelSectionRowProps>;

View File

@@ -1,3 +1,4 @@
import { sleep } from '../utils';
import { Module, findModuleChild } from '../webpack';
export enum SideMenu {
@@ -125,32 +126,65 @@ export interface Navigation {
CloseSideMenus(): void;
}
export const Navigation = {
Navigate: Router.Navigate.bind(Router),
NavigateBack: Router.WindowStore?.GamepadUIMainWindowInstance?.NavigateBack.bind(
Router.WindowStore.GamepadUIMainWindowInstance,
),
NavigateToAppProperties: Router.NavigateToAppProperties.bind(Router),
NavigateToExternalWeb: Router.NavigateToExternalWeb.bind(Router),
NavigateToInvites: Router.NavigateToInvites.bind(Router),
NavigateToChat: Router.NavigateToChat.bind(Router),
NavigateToLibraryTab: Router.NavigateToLibraryTab.bind(Router),
NavigateToLayoutPreview: Router.NavigateToLayoutPreview.bind(Router),
NavigateToSteamWeb: Router.WindowStore?.GamepadUIMainWindowInstance?.NavigateToSteamWeb.bind(
Router.WindowStore.GamepadUIMainWindowInstance,
),
NavigateToWebRoute: Router.WindowStore?.GamepadUIMainWindowInstance?.NavigateToWebRoute.bind(
Router.WindowStore.GamepadUIMainWindowInstance,
),
OpenSideMenu: Router.WindowStore?.GamepadUIMainWindowInstance?.MenuStore.OpenSideMenu.bind(
Router.WindowStore.GamepadUIMainWindowInstance.MenuStore,
),
OpenQuickAccessMenu: Router.WindowStore?.GamepadUIMainWindowInstance?.MenuStore.OpenQuickAccessMenu.bind(
Router.WindowStore.GamepadUIMainWindowInstance.MenuStore,
),
OpenMainMenu: Router.WindowStore?.GamepadUIMainWindowInstance?.MenuStore.OpenMainMenu.bind(
Router.WindowStore.GamepadUIMainWindowInstance.MenuStore,
),
CloseSideMenus: Router.CloseSideMenus.bind(Router),
OpenPowerMenu: Router.OpenPowerMenu.bind(Router),
} as Navigation;
export let Navigation = {} as Navigation;
try {
(async () => {
let InternalNavigators: any = {};
if (!Router.NavigateToAppProperties || (Router as unknown as any).deckyShim) {
function initInternalNavigators() {
try {
InternalNavigators = findModuleChild((m: any) => {
if (typeof m !== 'object') return undefined;
for (let prop in m) {
if (m[prop]?.GetNavigator) {
return m[prop];
}
}
})?.GetNavigator();
} catch (e) {
console.error('[DFL:Router]: Failed to init internal navigators, trying again');
}
}
initInternalNavigators();
while (!InternalNavigators?.AppProperties) {
console.log('[DFL:Router]: Trying to init internal navigators again');
await sleep(100);
initInternalNavigators();
}
}
const newNavigation = {
Navigate: Router.Navigate.bind(Router),
NavigateBack: Router.WindowStore?.GamepadUIMainWindowInstance?.NavigateBack.bind(
Router.WindowStore.GamepadUIMainWindowInstance,
),
NavigateToAppProperties: InternalNavigators?.AppProperties || Router.NavigateToAppProperties.bind(Router),
NavigateToExternalWeb: Router.NavigateToExternalWeb.bind(Router),
NavigateToInvites: InternalNavigators?.Invites || Router.NavigateToInvites.bind(Router),
NavigateToChat: Router.NavigateToChat.bind(Router),
NavigateToLibraryTab: InternalNavigators?.LibraryTab || Router.NavigateToLibraryTab.bind(Router),
NavigateToLayoutPreview: Router.NavigateToLayoutPreview.bind(Router),
NavigateToSteamWeb: Router.WindowStore?.GamepadUIMainWindowInstance?.NavigateToSteamWeb.bind(
Router.WindowStore.GamepadUIMainWindowInstance,
),
NavigateToWebRoute: Router.WindowStore?.GamepadUIMainWindowInstance?.NavigateToWebRoute.bind(
Router.WindowStore.GamepadUIMainWindowInstance,
),
OpenSideMenu: Router.WindowStore?.GamepadUIMainWindowInstance?.MenuStore.OpenSideMenu.bind(
Router.WindowStore.GamepadUIMainWindowInstance.MenuStore,
),
OpenQuickAccessMenu: Router.WindowStore?.GamepadUIMainWindowInstance?.MenuStore.OpenQuickAccessMenu.bind(
Router.WindowStore.GamepadUIMainWindowInstance.MenuStore,
),
OpenMainMenu: Router.WindowStore?.GamepadUIMainWindowInstance?.MenuStore.OpenMainMenu.bind(
Router.WindowStore.GamepadUIMainWindowInstance.MenuStore,
),
CloseSideMenus: Router.CloseSideMenus.bind(Router),
OpenPowerMenu: Router.OpenPowerMenu.bind(Router),
} as Navigation;
Object.assign(Navigation, newNavigation);
})();
} catch (e) {
console.error('[DFL:Router]: Error initializing Navigation interface', e);
}

View File

@@ -21,52 +21,6 @@ interface 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 interface RouterHook {
@@ -105,7 +59,6 @@ export interface FilePickerRes {
export interface ServerAPI {
routerHook: RouterHook;
menuHook: MenuHook;
toaster: Toaster;
openFilePicker(startPath: string, includeFiles?: boolean, regex?: RegExp): Promise<FilePickerRes>;
callPluginMethod<TArgs = {}, TRes = {}>(methodName: string, args: TArgs): Promise<ServerResponse<TRes>>;