feat(ui): add "unsafe" version of field instance selector

This commit is contained in:
psychedelicious
2025-02-20 11:34:00 +10:00
parent 6496fcdcbd
commit c379d76844
4 changed files with 18 additions and 7 deletions

View File

@@ -20,7 +20,7 @@ import {
setUpscaleInitialImage,
} from 'features/imageActions/actions';
import { fieldImageCollectionValueChanged } from 'features/nodes/store/nodesSlice';
import { selectFieldInputInstance, selectNodesSlice } from 'features/nodes/store/selectors';
import { selectFieldInputInstanceSafe, selectNodesSlice } from 'features/nodes/store/selectors';
import { type FieldIdentifier, isImageFieldCollectionInputInstance } from 'features/nodes/types/field';
import type { ImageDTO } from 'services/api/types';
import type { JsonObject } from 'type-fest';
@@ -261,7 +261,7 @@ export const addImagesToNodeImageFieldCollectionDndTarget: DndTarget<
const { fieldIdentifier } = targetData.payload;
const fieldInputInstance = selectFieldInputInstance(
const fieldInputInstance = selectFieldInputInstanceSafe(
selectNodesSlice(getState()),
fieldIdentifier.nodeId,
fieldIdentifier.fieldName

View File

@@ -1,6 +1,6 @@
import { createSelector } from '@reduxjs/toolkit';
import { useAppSelector } from 'app/store/storeHooks';
import { selectFieldInputInstance, selectNodesSlice } from 'features/nodes/store/selectors';
import { selectFieldInputInstanceSafe, selectNodesSlice } from 'features/nodes/store/selectors';
import type { FieldInputInstance } from 'features/nodes/types/field';
import { useMemo } from 'react';
import { assert } from 'tsafe';
@@ -9,7 +9,7 @@ export const useInputFieldInstance = (nodeId: string, fieldName: string): FieldI
const selector = useMemo(
() =>
createSelector(selectNodesSlice, (nodes) => {
const instance = selectFieldInputInstance(nodes, nodeId, fieldName);
const instance = selectFieldInputInstanceSafe(nodes, nodeId, fieldName);
assert(instance, `Instance for input field ${fieldName} not found`);
return instance;
}),

View File

@@ -1,13 +1,13 @@
import { createSelector } from '@reduxjs/toolkit';
import { useAppSelector } from 'app/store/storeHooks';
import { selectFieldInputInstance, selectNodesSlice } from 'features/nodes/store/selectors';
import { selectFieldInputInstanceSafe, selectNodesSlice } from 'features/nodes/store/selectors';
import { useMemo } from 'react';
export const useInputFieldLabel = (nodeId: string, fieldName: string): string => {
const selector = useMemo(
() =>
createSelector(selectNodesSlice, (nodes) => {
return selectFieldInputInstance(nodes, nodeId, fieldName)?.label ?? '';
return selectFieldInputInstanceSafe(nodes, nodeId, fieldName)?.label ?? '';
}),
[fieldName, nodeId]
);

View File

@@ -36,9 +36,20 @@ export const selectFieldInputInstance = (
nodesSlice: NodesState,
nodeId: string,
fieldName: string
): FieldInputInstance => {
const data = selectNodeData(nodesSlice, nodeId);
const field = data.inputs[fieldName];
assert(field !== undefined, `Field ${fieldName} not found in node ${nodeId}`);
return field;
};
export const selectFieldInputInstanceSafe = (
nodesSlice: NodesState,
nodeId: string,
fieldName: string
): FieldInputInstance | null => {
const data = selectNodeData(nodesSlice, nodeId);
return data?.inputs[fieldName] ?? null;
return data.inputs[fieldName] ?? null;
};
export const selectLastSelectedNode = (nodesSlice: NodesState) => {