Skip to content

Commit 64ff0b5

Browse files
chore(ui): "useInputFieldDescription" -> "useInputFieldDescriptionSafe"
Also update docstrings
1 parent b59bebf commit 64ff0b5

File tree

5 files changed

+32
-37
lines changed

5 files changed

+32
-37
lines changed

invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldDescriptionPopover.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
Textarea,
99
} from '@invoke-ai/ui-library';
1010
import { useAppDispatch } from 'app/store/storeHooks';
11-
import { useInputFieldDescription } from 'features/nodes/hooks/useInputFieldDescription';
11+
import { useInputFieldDescriptionSafe } from 'features/nodes/hooks/useInputFieldDescriptionSafe';
1212
import { fieldDescriptionChanged } from 'features/nodes/store/nodesSlice';
1313
import { NO_DRAG_CLASS, NO_PAN_CLASS, NO_WHEEL_CLASS } from 'features/nodes/types/constants';
1414
import type { ChangeEvent } from 'react';
@@ -48,7 +48,7 @@ InputFieldDescriptionPopover.displayName = 'InputFieldDescriptionPopover';
4848
const Content = memo(({ nodeId, fieldName }: Props) => {
4949
const dispatch = useAppDispatch();
5050
const { t } = useTranslation();
51-
const description = useInputFieldDescription(nodeId, fieldName);
51+
const description = useInputFieldDescriptionSafe(nodeId, fieldName);
5252
const onChange = useCallback(
5353
(e: ChangeEvent<HTMLTextAreaElement>) => {
5454
dispatch(fieldDescriptionChanged({ nodeId, fieldName, val: e.target.value }));

invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/NodeFieldElementDescriptionEditable.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { FormHelperText, Textarea } from '@invoke-ai/ui-library';
22
import { useAppDispatch } from 'app/store/storeHooks';
33
import { linkifyOptions, linkifySx } from 'common/components/linkify';
44
import { useEditable } from 'common/hooks/useEditable';
5-
import { useInputFieldDescription } from 'features/nodes/hooks/useInputFieldDescription';
5+
import { useInputFieldDescriptionSafe } from 'features/nodes/hooks/useInputFieldDescriptionSafe';
66
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplateOrThrow';
77
import { fieldDescriptionChanged } from 'features/nodes/store/nodesSlice';
88
import type { NodeFieldElement } from 'features/nodes/types/workflow';
@@ -13,7 +13,7 @@ export const NodeFieldElementDescriptionEditable = memo(({ el }: { el: NodeField
1313
const { data } = el;
1414
const { fieldIdentifier } = data;
1515
const dispatch = useAppDispatch();
16-
const description = useInputFieldDescription(fieldIdentifier.nodeId, fieldIdentifier.fieldName);
16+
const description = useInputFieldDescriptionSafe(fieldIdentifier.nodeId, fieldIdentifier.fieldName);
1717
const fieldTemplate = useInputFieldTemplateOrThrow(fieldIdentifier.nodeId, fieldIdentifier.fieldName);
1818
const inputRef = useRef<HTMLTextAreaElement>(null);
1919

invokeai/frontend/web/src/features/nodes/components/sidePanel/builder/NodeFieldElementViewMode.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { linkifyOptions, linkifySx } from 'common/components/linkify';
44
import { InputFieldRenderer } from 'features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer';
55
import { useContainerContext } from 'features/nodes/components/sidePanel/builder/contexts';
66
import { NodeFieldElementLabel } from 'features/nodes/components/sidePanel/builder/NodeFieldElementLabel';
7-
import { useInputFieldDescription } from 'features/nodes/hooks/useInputFieldDescription';
7+
import { useInputFieldDescriptionSafe } from 'features/nodes/hooks/useInputFieldDescriptionSafe';
88
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplateOrThrow';
99
import type { NodeFieldElement } from 'features/nodes/types/workflow';
1010
import { NODE_FIELD_CLASS_NAME } from 'features/nodes/types/workflow';
@@ -28,7 +28,7 @@ const sx: SystemStyleObject = {
2828
export const NodeFieldElementViewMode = memo(({ el }: { el: NodeFieldElement }) => {
2929
const { id, data } = el;
3030
const { fieldIdentifier, showDescription } = data;
31-
const description = useInputFieldDescription(fieldIdentifier.nodeId, fieldIdentifier.fieldName);
31+
const description = useInputFieldDescriptionSafe(fieldIdentifier.nodeId, fieldIdentifier.fieldName);
3232
const fieldTemplate = useInputFieldTemplateOrThrow(fieldIdentifier.nodeId, fieldIdentifier.fieldName);
3333
const containerCtx = useContainerContext();
3434

invokeai/frontend/web/src/features/nodes/hooks/useInputFieldDescription.ts

Lines changed: 0 additions & 31 deletions
This file was deleted.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { createSelector } from '@reduxjs/toolkit';
2+
import { useAppSelector } from 'app/store/storeHooks';
3+
import { selectFieldInputInstanceSafe, selectNodesSlice } from 'features/nodes/store/selectors';
4+
import { useMemo } from 'react';
5+
6+
/**
7+
* Gets the user-defined description of an input field for a given node.
8+
*
9+
* If the node doesn't exist or is not an invocation node, an empty string is returned.
10+
*
11+
* @param nodeId The ID of the node
12+
* @param fieldName The name of the field
13+
*/
14+
export const useInputFieldDescriptionSafe = (nodeId: string, fieldName: string) => {
15+
const selector = useMemo(
16+
() =>
17+
createSelector(
18+
selectNodesSlice,
19+
(nodes) => selectFieldInputInstanceSafe(nodes, nodeId, fieldName)?.description ?? ''
20+
),
21+
[fieldName, nodeId]
22+
);
23+
24+
const description = useAppSelector(selector);
25+
return description;
26+
};

0 commit comments

Comments
 (0)