Files
InvokeAI/invokeai/frontend/web/src/features/nodes/hooks/useInputFieldInitialFormValue.ts
2025-02-14 14:50:56 +11:00

38 lines
1.5 KiB
TypeScript

import { createSelector } from '@reduxjs/toolkit';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { useInputFieldValue } from 'features/nodes/hooks/useInputFieldValue';
import { fieldValueReset } from 'features/nodes/store/nodesSlice';
import { selectWorkflowSlice } from 'features/nodes/store/workflowSlice';
import { isEqual } from 'lodash-es';
import { useCallback, useMemo } from 'react';
const uniqueNonexistentValue = Symbol('uniqueNonexistentValue');
export const useInputFieldInitialFormValue = (elementId: string, nodeId: string, fieldName: string) => {
const dispatch = useAppDispatch();
const selectInitialValue = useMemo(
() =>
createSelector(selectWorkflowSlice, (workflow) => {
if (!(elementId in workflow.formFieldInitialValues)) {
return uniqueNonexistentValue;
}
return workflow.formFieldInitialValues[elementId];
}),
[elementId]
);
const initialValue = useAppSelector(selectInitialValue);
const value = useInputFieldValue(nodeId, fieldName);
const isValueChanged = useMemo(
() => initialValue !== uniqueNonexistentValue && !isEqual(value, initialValue),
[value, initialValue]
);
const resetToInitialValue = useCallback(() => {
if (initialValue === uniqueNonexistentValue) {
return;
}
dispatch(fieldValueReset({ nodeId, fieldName, value: initialValue }));
}, [dispatch, fieldName, nodeId, initialValue]);
return { initialValue, isValueChanged, resetToInitialValue };
};