fix(ui): return early in error-selecting hooks

Prevent an error when a node is deleted and the hook is being called
This commit is contained in:
psychedelicious
2025-03-14 10:48:48 +10:00
parent 47cadbb48e
commit 2f9c95c462
2 changed files with 12 additions and 4 deletions

View File

@@ -2,7 +2,7 @@ import { useStore } from '@nanostores/react';
import { createSelector } from '@reduxjs/toolkit';
import { useDebouncedAppSelector } from 'app/store/use-debounced-app-selector';
import { $templates } from 'features/nodes/store/nodesSlice';
import { selectFieldInputInstance, selectInvocationNode, selectNodesSlice } from 'features/nodes/store/selectors';
import { selectFieldInputInstance, selectInvocationNodeSafe, selectNodesSlice } from 'features/nodes/store/selectors';
import { getFieldErrors } from 'features/nodes/store/util/fieldValidators';
import { useMemo } from 'react';
import { assert } from 'tsafe';
@@ -20,7 +20,11 @@ export const useInputFieldErrors = (nodeId: string, fieldName: string) => {
const selectFieldErrors = useMemo(
() =>
createSelector(selectNodesSlice, (nodes) => {
const node = selectInvocationNode(nodes, nodeId);
const node = selectInvocationNodeSafe(nodes, nodeId);
if (!node) {
// If the node is not found, return an empty array - might happen during node deletion
return [];
}
const field = selectFieldInputInstance(nodes, nodeId, fieldName);
const nodeTemplate = templates[node.data.type];

View File

@@ -2,7 +2,7 @@ import { useStore } from '@nanostores/react';
import { createSelector } from '@reduxjs/toolkit';
import { useDebouncedAppSelector } from 'app/store/use-debounced-app-selector';
import { $templates } from 'features/nodes/store/nodesSlice';
import { selectFieldInputInstance, selectInvocationNode, selectNodesSlice } from 'features/nodes/store/selectors';
import { selectFieldInputInstance, selectInvocationNodeSafe, selectNodesSlice } from 'features/nodes/store/selectors';
import { getFieldErrors } from 'features/nodes/store/util/fieldValidators';
import { useMemo } from 'react';
import { assert } from 'tsafe';
@@ -22,7 +22,11 @@ export const useInputFieldIsInvalid = (nodeId: string, fieldName: string) => {
const selectIsInvalid = useMemo(
() =>
createSelector(selectNodesSlice, (nodes) => {
const node = selectInvocationNode(nodes, nodeId);
const node = selectInvocationNodeSafe(nodes, nodeId);
if (!node) {
// If the node is not found, return false - might happen during node deletion
return false;
}
const field = selectFieldInputInstance(nodes, nodeId, fieldName);
const nodeTemplate = templates[node.data.type];