@decky/ui 4.14.0 → 4.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,7 +7,7 @@ const CommonDialogDivs = Object.values(CommonUIModule).filter((m) => typeof m ==
7
7
  const MappedDialogDivs = new Map(Object.values(CommonDialogDivs).map((m) => {
8
8
  try {
9
9
  const renderedDiv = m.render({});
10
- return [renderedDiv.props.className.split(' ')[0], m];
10
+ return [renderedDiv?.props?.className?.split(' ')[0], m];
11
11
  }
12
12
  catch (e) {
13
13
  console.error("[DFL:Dialog]: failed to render common dialog component", e);
@@ -13,7 +13,7 @@ export interface ProgressBarProps {
13
13
  focusable?: boolean;
14
14
  }
15
15
  export interface ProgressBarWithInfoProps extends ProgressBarItemProps {
16
- sTimeRemaining?: ReactNode;
16
+ rtEstimatedCompletionTime?: number;
17
17
  sOperationText?: ReactNode;
18
18
  }
19
19
  export declare const ProgressBar: FC<ProgressBarProps>;
@@ -15,6 +15,7 @@ export interface TextFieldProps extends HTMLAttributes<HTMLInputElement> {
15
15
  mustBeEmail?: boolean;
16
16
  focusOnMount?: boolean;
17
17
  tooltip?: string;
18
+ placeholder?: string;
18
19
  inlineControls?: ReactNode;
19
20
  onChange?: ChangeEventHandler<HTMLInputElement>;
20
21
  value?: string;
@@ -9,7 +9,7 @@ export interface Screenshots {
9
9
  GetLastScreenshotTaken(): Promise<Screenshot>;
10
10
  GetLocalScreenshotByHandle(appId: string, screenshotIndex: number): Promise<Screenshot>;
11
11
  GetLocalScreenshotCount(appId: number): Promise<number>;
12
- GetLocalScreenshotPath(appId: number, hHandle: number): Promise<string>;
12
+ GetLocalScreenshotPath(appId: string, hHandle: number): Promise<string>;
13
13
  GetNumGamesWithLocalScreenshots(): Promise<number>;
14
14
  GetTotalDiskSpaceUsage(path: string): Promise<number>;
15
15
  ShowScreenshotInSystemViewer(appId: string, screenshotIndex: number): void;
@@ -11,21 +11,21 @@ function patchComponent(node, handler, steps, step, caches, logger, prop = 'type
11
11
  loggingEnabled && logger.group('Patching node:', node);
12
12
  switch (typeof node?.[prop]) {
13
13
  case 'function':
14
- const patch = afterPatch(node, prop, steps[step + 1] ? createStepHandler(handler, steps, step + 1, caches, logger) : handler);
15
- loggingEnabled && logger.debug('Patched a function component', patch);
16
- break;
17
- case 'object':
18
14
  if (node[prop]?.prototype?.render) {
19
15
  wrapReactClass(node);
20
16
  const patch = afterPatch(node[prop].prototype, 'render', steps[step + 1] ? createStepHandler(handler, steps, step + 1, caches, logger) : handler);
21
17
  loggingEnabled && logger.debug('Patched class component', patch);
22
18
  }
23
19
  else {
24
- loggingEnabled && logger.debug('Patching forwardref/memo');
25
- wrapReactType(node, prop);
26
- patchComponent(node[prop], handler, steps, step, caches, logger, node[prop]?.render ? 'render' : 'type');
20
+ const patch = afterPatch(node, prop, steps[step + 1] ? createStepHandler(handler, steps, step + 1, caches, logger) : handler);
21
+ loggingEnabled && logger.debug('Patched a function component', patch);
27
22
  }
28
23
  break;
24
+ case 'object':
25
+ loggingEnabled && logger.debug('Patching forwardref/memo');
26
+ wrapReactType(node, prop);
27
+ patchComponent(node[prop], handler, steps, step, caches, logger, node[prop]?.render ? 'render' : 'type');
28
+ break;
29
29
  default:
30
30
  logger.error('Unhandled component type', node);
31
31
  break;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decky/ui",
3
- "version": "4.14.0",
3
+ "version": "4.15.1",
4
4
  "description": "A library for interacting with the Steam frontend in Decky plugins and elsewhere.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -69,7 +69,7 @@ const MappedDialogDivs = new Map(
69
69
  try {
70
70
  const renderedDiv = m.render({});
71
71
  // Take only the first class name segment as it identifies the element we want
72
- return [renderedDiv.props.className.split(' ')[0], m];
72
+ return [renderedDiv?.props?.className?.split(' ')[0], m];
73
73
  } catch (e) {
74
74
  console.error("[DFL:Dialog]: failed to render common dialog component", e);
75
75
  return [null, null];
@@ -19,7 +19,8 @@ export interface ProgressBarProps {
19
19
  }
20
20
 
21
21
  export interface ProgressBarWithInfoProps extends ProgressBarItemProps {
22
- sTimeRemaining?: ReactNode;
22
+ /** Timestamp of the completion time, has to be divided by 1000 */
23
+ rtEstimatedCompletionTime?: number;
23
24
  sOperationText?: ReactNode;
24
25
  }
25
26
 
@@ -18,6 +18,7 @@ export interface TextFieldProps extends HTMLAttributes<HTMLInputElement> {
18
18
  mustBeEmail?: boolean;
19
19
  focusOnMount?: boolean;
20
20
  tooltip?: string;
21
+ placeholder?: string;
21
22
  inlineControls?: ReactNode;
22
23
  onChange?: ChangeEventHandler<HTMLInputElement>;
23
24
  value?: string;
@@ -72,7 +72,7 @@ export interface Screenshots {
72
72
  * @param hHandle The handle of the screenshot.
73
73
  * @returns the screenshot path or the screenshot directory if no such handle.
74
74
  */
75
- GetLocalScreenshotPath(appId: number, hHandle: number): Promise<string>;
75
+ GetLocalScreenshotPath(appId: string, hHandle: number): Promise<string>;
76
76
 
77
77
  /**
78
78
  * Retrieves the number of games with local screenshots.
@@ -23,11 +23,6 @@ function patchComponent(node: any, handler: GenericPatchHandler, steps: NodeStep
23
23
  // We need to take extra care to not mutate the original node.type
24
24
  switch (typeof node?.[prop]) {
25
25
  case 'function':
26
- // Function component
27
- const patch = afterPatch(node, prop, steps[step + 1] ? createStepHandler(handler, steps, step + 1, caches, logger) : handler);
28
- loggingEnabled && logger.debug('Patched a function component', patch);
29
- break;
30
- case 'object':
31
26
  if (node[prop]?.prototype?.render) {
32
27
  // Class component
33
28
  // TODO handle patching custom methods
@@ -35,12 +30,17 @@ function patchComponent(node: any, handler: GenericPatchHandler, steps: NodeStep
35
30
  const patch = afterPatch(node[prop].prototype, 'render', steps[step + 1] ? createStepHandler(handler, steps, step + 1, caches, logger) : handler);
36
31
  loggingEnabled && logger.debug('Patched class component', patch);
37
32
  } else {
38
- loggingEnabled && logger.debug('Patching forwardref/memo');
39
- wrapReactType(node, prop);
40
- // Step down the object
41
- patchComponent(node[prop], handler, steps, step, caches, logger, node[prop]?.render ? 'render' : 'type');
33
+ // Function component
34
+ const patch = afterPatch(node, prop, steps[step + 1] ? createStepHandler(handler, steps, step + 1, caches, logger) : handler);
35
+ loggingEnabled && logger.debug('Patched a function component', patch);
42
36
  }
43
37
  break;
38
+ case 'object':
39
+ loggingEnabled && logger.debug('Patching forwardref/memo');
40
+ wrapReactType(node, prop);
41
+ // Step down the object
42
+ patchComponent(node[prop], handler, steps, step, caches, logger, node[prop]?.render ? 'render' : 'type');
43
+ break;
44
44
  default:
45
45
  logger.error('Unhandled component type', node);
46
46
  break;