Skip to content

Commit 384e67d

Browse files
refactor(ui): organise useInputFieldTemplate hooks again & add useInputFieldTemplateSafe
1 parent 04b880d commit 384e67d

13 files changed

+64
-32
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { InputFieldResetToDefaultValueIconButton } from 'features/nodes/componen
77
import { useNodeFieldDnd } from 'features/nodes/components/sidePanel/builder/dnd-hooks';
88
import { useInputFieldIsConnected } from 'features/nodes/hooks/useInputFieldIsConnected';
99
import { useInputFieldIsInvalid } from 'features/nodes/hooks/useInputFieldIsInvalid';
10-
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplateOrThrow';
10+
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplate';
1111
import { NO_DRAG_CLASS } from 'features/nodes/types/constants';
1212
import type { FieldInputTemplate } from 'features/nodes/types/field';
1313
import { memo, useRef } from 'react';

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
import { InputFieldUnknownPlaceholder } from 'features/nodes/components/flow/nodes/Invocation/fields/InputFieldUnknownPlaceholder';
22
import { useInputFieldInstanceExists } from 'features/nodes/hooks/useInputFieldInstanceExists';
33
import { useInputFieldTemplateExists } from 'features/nodes/hooks/useInputFieldTemplateExists';
4-
import type { PropsWithChildren } from 'react';
4+
import type { PropsWithChildren, ReactNode } from 'react';
55
import { memo } from 'react';
66

77
type Props = PropsWithChildren<{
88
nodeId: string;
99
fieldName: string;
10+
placeholder?: ReactNode;
1011
}>;
1112

12-
export const InputFieldGate = memo(({ nodeId, fieldName, children }: Props) => {
13+
export const InputFieldGate = memo(({ nodeId, fieldName, children, placeholder }: Props) => {
1314
const hasInstance = useInputFieldInstanceExists(nodeId, fieldName);
1415
const hasTemplate = useInputFieldTemplateExists(nodeId, fieldName);
1516

1617
if (!hasTemplate || !hasInstance) {
17-
return <InputFieldUnknownPlaceholder nodeId={nodeId} fieldName={fieldName} />;
18+
return placeholder ?? <InputFieldUnknownPlaceholder nodeId={nodeId} fieldName={fieldName} />;
1819
}
1920

2021
return children;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
useIsConnectionInProgress,
88
useIsConnectionStartField,
99
} from 'features/nodes/hooks/useFieldConnectionState';
10-
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplateOrThrow';
10+
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplate';
1111
import { useFieldTypeName } from 'features/nodes/hooks/usePrettyFieldType';
1212
import { HANDLE_TOOLTIP_OPEN_DELAY } from 'features/nodes/types/constants';
1313
import type { FieldInputTemplate } from 'features/nodes/types/field';

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { IntegerFieldSlider } from 'features/nodes/components/flow/nodes/Invocat
1616
import { StringFieldInput } from 'features/nodes/components/flow/nodes/Invocation/fields/StringField/StringFieldInput';
1717
import { StringFieldTextarea } from 'features/nodes/components/flow/nodes/Invocation/fields/StringField/StringFieldTextarea';
1818
import { useInputFieldInstance } from 'features/nodes/hooks/useInputFieldInstance';
19-
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplateOrThrow';
19+
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplate';
2020
import {
2121
isBoardFieldInputInstance,
2222
isBoardFieldInputTemplate,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Flex, ListItem, Text, UnorderedList } from '@invoke-ai/ui-library';
22
import { useInputFieldErrors } from 'features/nodes/hooks/useInputFieldErrors';
33
import { useInputFieldInstance } from 'features/nodes/hooks/useInputFieldInstance';
4-
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplateOrThrow';
4+
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplate';
55
import { useFieldTypeName } from 'features/nodes/hooks/usePrettyFieldType';
66
import { startCase } from 'lodash-es';
77
import { memo, useMemo } from 'react';

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useAppDispatch } from 'app/store/storeHooks';
33
import { linkifyOptions, linkifySx } from 'common/components/linkify';
44
import { useEditable } from 'common/hooks/useEditable';
55
import { useInputFieldDescriptionSafe } from 'features/nodes/hooks/useInputFieldDescriptionSafe';
6-
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplateOrThrow';
6+
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplate';
77
import { fieldDescriptionChanged } from 'features/nodes/store/nodesSlice';
88
import type { NodeFieldElement } from 'features/nodes/types/workflow';
99
import Linkify from 'linkify-react';

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Flex, FormLabel, Spacer } from '@invoke-ai/ui-library';
22
import { NodeFieldElementResetToInitialValueIconButton } from 'features/nodes/components/flow/nodes/Invocation/fields/NodeFieldElementResetToInitialValueIconButton';
33
import { useInputFieldLabelSafe } from 'features/nodes/hooks/useInputFieldLabelSafe';
4-
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplateOrThrow';
4+
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplate';
55
import type { NodeFieldElement } from 'features/nodes/types/workflow';
66
import { memo, useMemo } from 'react';
77

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useAppDispatch } from 'app/store/storeHooks';
33
import { useEditable } from 'common/hooks/useEditable';
44
import { NodeFieldElementResetToInitialValueIconButton } from 'features/nodes/components/flow/nodes/Invocation/fields/NodeFieldElementResetToInitialValueIconButton';
55
import { useInputFieldLabelSafe } from 'features/nodes/hooks/useInputFieldLabelSafe';
6-
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplateOrThrow';
6+
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplate';
77
import { fieldLabelChanged } from 'features/nodes/store/nodesSlice';
88
import type { NodeFieldElement } from 'features/nodes/types/workflow';
99
import { memo, useCallback, useRef } from 'react';

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { useAppDispatch } from 'app/store/storeHooks';
1515
import { NodeFieldElementFloatSettings } from 'features/nodes/components/sidePanel/builder/NodeFieldElementFloatSettings';
1616
import { NodeFieldElementIntegerSettings } from 'features/nodes/components/sidePanel/builder/NodeFieldElementIntegerSettings';
1717
import { NodeFieldElementStringSettings } from 'features/nodes/components/sidePanel/builder/NodeFieldElementStringSettings';
18-
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplateOrThrow';
18+
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplate';
1919
import { formElementNodeFieldDataChanged } from 'features/nodes/store/workflowSlice';
2020
import {
2121
isFloatFieldInputTemplate,

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

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { InputFieldRenderer } from 'features/nodes/components/flow/nodes/Invocat
55
import { useContainerContext } from 'features/nodes/components/sidePanel/builder/contexts';
66
import { NodeFieldElementLabel } from 'features/nodes/components/sidePanel/builder/NodeFieldElementLabel';
77
import { useInputFieldDescriptionSafe } from 'features/nodes/hooks/useInputFieldDescriptionSafe';
8-
import { useInputFieldTemplateOrThrow } from 'features/nodes/hooks/useInputFieldTemplateOrThrow';
8+
import { useInputFieldTemplateOrThrow, useInputFieldTemplateSafe } from 'features/nodes/hooks/useInputFieldTemplate';
99
import type { NodeFieldElement } from 'features/nodes/types/workflow';
1010
import { NODE_FIELD_CLASS_NAME } from 'features/nodes/types/workflow';
1111
import Linkify from 'linkify-react';
@@ -29,12 +29,12 @@ export const NodeFieldElementViewMode = memo(({ el }: { el: NodeFieldElement })
2929
const { id, data } = el;
3030
const { fieldIdentifier, showDescription } = data;
3131
const description = useInputFieldDescriptionSafe(fieldIdentifier.nodeId, fieldIdentifier.fieldName);
32-
const fieldTemplate = useInputFieldTemplateOrThrow(fieldIdentifier.nodeId, fieldIdentifier.fieldName);
32+
const fieldTemplate = useInputFieldTemplateSafe(fieldIdentifier.nodeId, fieldIdentifier.fieldName);
3333
const containerCtx = useContainerContext();
3434

3535
const _description = useMemo(
36-
() => description || fieldTemplate.description,
37-
[description, fieldTemplate.description]
36+
() => description || fieldTemplate?.description || '',
37+
[description, fieldTemplate?.description]
3838
);
3939

4040
return (
@@ -45,22 +45,39 @@ export const NodeFieldElementViewMode = memo(({ el }: { el: NodeFieldElement })
4545
data-parent-layout={containerCtx.layout}
4646
data-with-description={showDescription && !!_description}
4747
>
48-
<FormControl flex="1 1 0" orientation="vertical">
49-
<NodeFieldElementLabel el={el} />
50-
<Flex w="full" gap={4}>
51-
<InputFieldRenderer
52-
nodeId={fieldIdentifier.nodeId}
53-
fieldName={fieldIdentifier.fieldName}
54-
settings={data.settings}
55-
/>
56-
</Flex>
57-
{showDescription && _description && (
58-
<FormHelperText sx={linkifySx}>
59-
<Linkify options={linkifyOptions}>{_description}</Linkify>
60-
</FormHelperText>
61-
)}
62-
</FormControl>
48+
<NodeFieldElementViewModeContent el={el} />
6349
</Flex>
6450
);
6551
});
6652
NodeFieldElementViewMode.displayName = 'NodeFieldElementViewMode';
53+
54+
const NodeFieldElementViewModeContent = memo(({ el }: { el: NodeFieldElement }) => {
55+
const { data } = el;
56+
const { fieldIdentifier, showDescription } = data;
57+
const description = useInputFieldDescriptionSafe(fieldIdentifier.nodeId, fieldIdentifier.fieldName);
58+
const fieldTemplate = useInputFieldTemplateOrThrow(fieldIdentifier.nodeId, fieldIdentifier.fieldName);
59+
60+
const _description = useMemo(
61+
() => description || fieldTemplate.description,
62+
[description, fieldTemplate.description]
63+
);
64+
65+
return (
66+
<FormControl flex="1 1 0" orientation="vertical">
67+
<NodeFieldElementLabel el={el} />
68+
<Flex w="full" gap={4}>
69+
<InputFieldRenderer
70+
nodeId={fieldIdentifier.nodeId}
71+
fieldName={fieldIdentifier.fieldName}
72+
settings={data.settings}
73+
/>
74+
</Flex>
75+
{showDescription && _description && (
76+
<FormHelperText sx={linkifySx}>
77+
<Linkify options={linkifyOptions}>{_description}</Linkify>
78+
</FormHelperText>
79+
)}
80+
</FormControl>
81+
);
82+
});
83+
NodeFieldElementViewModeContent.displayName = 'NodeFieldElementViewModeContent';

0 commit comments

Comments
 (0)