Refactor field and cell old component states (#13217)

This PR refactors fields draft value component state and old component
scoped states still left.

It does not refactor the persistField logic but it will allow it in a
next refactor.

We still have to refactor scoped state used as component states / family
states, not as old states.
This commit is contained in:
Lucas Bordeau
2025-07-16 10:54:28 +02:00
committed by GitHub
parent 58fd1f4623
commit b8e0256480
18 changed files with 114 additions and 105 deletions

View File

@ -2,14 +2,12 @@ import { isUndefined } from '@sniptt/guards';
import { useRecoilCallback } from 'recoil'; import { useRecoilCallback } from 'recoil';
import { FIELD_NOT_OVERWRITTEN_AT_DRAFT } from '@/object-record/constants/FieldsNotOverwrittenAtDraft'; import { FIELD_NOT_OVERWRITTEN_AT_DRAFT } from '@/object-record/constants/FieldsNotOverwrittenAtDraft';
import { recordFieldInputDraftValueComponentSelector } from '@/object-record/record-field/states/selectors/recordFieldInputDraftValueComponentSelector'; import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition';
import { FieldInputDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue';
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
import { computeDraftValueFromFieldValue } from '@/object-record/record-field/utils/computeDraftValueFromFieldValue'; import { computeDraftValueFromFieldValue } from '@/object-record/record-field/utils/computeDraftValueFromFieldValue';
import { computeDraftValueFromString } from '@/object-record/record-field/utils/computeDraftValueFromString'; import { computeDraftValueFromString } from '@/object-record/record-field/utils/computeDraftValueFromString';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { extractComponentSelector } from '@/ui/utilities/state/component-state/utils/extractComponentSelector';
export const useInitDraftValueV2 = <FieldValue>() => { export const useInitDraftValueV2 = <FieldValue>() => {
return useRecoilCallback( return useRecoilCallback(
@ -25,13 +23,6 @@ export const useInitDraftValueV2 = <FieldValue>() => {
fieldDefinition: FieldDefinition<FieldMetadata>; fieldDefinition: FieldDefinition<FieldMetadata>;
fieldComponentInstanceId: string; fieldComponentInstanceId: string;
}) => { }) => {
const getDraftValueSelector = extractComponentSelector<
FieldInputDraftValue<FieldValue> | undefined
>(
recordFieldInputDraftValueComponentSelector,
fieldComponentInstanceId,
);
const recordFieldValue = snapshot const recordFieldValue = snapshot
.getLoadable( .getLoadable(
recordStoreFamilySelector<FieldValue>({ recordStoreFamilySelector<FieldValue>({
@ -46,7 +37,9 @@ export const useInitDraftValueV2 = <FieldValue>() => {
FIELD_NOT_OVERWRITTEN_AT_DRAFT.includes(fieldDefinition.type) FIELD_NOT_OVERWRITTEN_AT_DRAFT.includes(fieldDefinition.type)
) { ) {
set( set(
getDraftValueSelector(), recordFieldInputDraftValueComponentState.atomFamily({
instanceId: fieldComponentInstanceId,
}),
computeDraftValueFromFieldValue<FieldValue>({ computeDraftValueFromFieldValue<FieldValue>({
fieldValue: recordFieldValue, fieldValue: recordFieldValue,
fieldDefinition, fieldDefinition,
@ -54,7 +47,9 @@ export const useInitDraftValueV2 = <FieldValue>() => {
); );
} else { } else {
set( set(
getDraftValueSelector(), recordFieldInputDraftValueComponentState.atomFamily({
instanceId: fieldComponentInstanceId,
}),
computeDraftValueFromString<FieldValue>({ computeDraftValueFromString<FieldValue>({
value, value,
fieldDefinition, fieldDefinition,

View File

@ -1,25 +1,12 @@
import { useSetRecoilState } from 'recoil'; import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
import { recordFieldInputDraftValueComponentSelector } from '@/object-record/record-field/states/selectors/recordFieldInputDraftValueComponentSelector';
import { FieldInputDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue'; import { FieldInputDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue';
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { extractComponentSelector } from '@/ui/utilities/state/component-state/utils/extractComponentSelector';
export const useRecordFieldInput = <FieldValue>() => { export const useRecordFieldInput = <FieldValue>() => {
const recordFieldComponentInstanceId = useAvailableComponentInstanceIdOrThrow( const setDraftValue = useSetRecoilComponentStateV2(
RecordFieldComponentInstanceContext, recordFieldInputDraftValueComponentState,
); );
const getDraftValueSelector = extractComponentSelector<
FieldInputDraftValue<FieldValue> | undefined
>(
recordFieldInputDraftValueComponentSelector,
recordFieldComponentInstanceId,
);
const setDraftValue = useSetRecoilState(getDraftValueSelector());
const isDraftValueEmpty = ( const isDraftValueEmpty = (
value: FieldInputDraftValue<FieldValue> | undefined, value: FieldInputDraftValue<FieldValue> | undefined,
) => { ) => {
@ -36,7 +23,6 @@ export const useRecordFieldInput = <FieldValue>() => {
return { return {
setDraftValue, setDraftValue,
getDraftValueSelector,
isDraftValueEmpty, isDraftValueEmpty,
}; };
}; };

View File

@ -1,11 +1,13 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
import { isFieldAddressValue } from '@/object-record/record-field/types/guards/isFieldAddressValue'; import { isFieldAddressValue } from '@/object-record/record-field/types/guards/isFieldAddressValue';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
import { usePersistField } from '../../hooks/usePersistField'; import { usePersistField } from '../../hooks/usePersistField';
import { FieldAddressValue } from '../../types/FieldMetadata'; import { FieldAddressValue } from '../../types/FieldMetadata';
@ -40,10 +42,11 @@ export const useAddressField = () => {
persistField(newValue); persistField(newValue);
}; };
const { setDraftValue, getDraftValueSelector } = const { setDraftValue } = useRecordFieldInput<FieldAddressValue>();
useRecordFieldInput<FieldAddressValue>();
const draftValue = useRecoilValue(getDraftValueSelector()); const draftValue = useRecoilComponentValueV2(
recordFieldInputDraftValueComponentState,
);
return { return {
fieldDefinition, fieldDefinition,

View File

@ -1,14 +1,16 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { FieldCurrencyValue } from '@/object-record/record-field/types/FieldMetadata'; import { FieldCurrencyValue } from '@/object-record/record-field/types/FieldMetadata';
import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata';
import { isFieldCurrency } from '@/object-record/record-field/types/guards/isFieldCurrency'; import { isFieldCurrency } from '@/object-record/record-field/types/guards/isFieldCurrency';
import { isFieldCurrencyValue } from '@/object-record/record-field/types/guards/isFieldCurrencyValue'; import { isFieldCurrencyValue } from '@/object-record/record-field/types/guards/isFieldCurrencyValue';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { convertCurrencyAmountToCurrencyMicros } from '~/utils/convertCurrencyToCurrencyMicros'; import { convertCurrencyAmountToCurrencyMicros } from '~/utils/convertCurrencyToCurrencyMicros';
@ -54,10 +56,11 @@ export const useCurrencyField = () => {
persistField(newCurrencyValue); persistField(newCurrencyValue);
}; };
const { setDraftValue, getDraftValueSelector } = const { setDraftValue } = useRecordFieldInput<FieldCurrencyValue>();
useRecordFieldInput<FieldCurrencyValue>();
const draftValue = useRecoilValue(getDraftValueSelector()); const draftValue = useRecoilComponentValueV2(
recordFieldInputDraftValueComponentState,
);
const defaultValue = fieldDefinition.defaultValue; const defaultValue = fieldDefinition.defaultValue;

View File

@ -1,5 +1,5 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
@ -9,6 +9,8 @@ import { emailsSchema } from '@/object-record/record-field/types/guards/isFieldE
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
@ -26,10 +28,11 @@ export const useEmailsField = () => {
}), }),
); );
const { setDraftValue, getDraftValueSelector } = const { setDraftValue } = useRecordFieldInput<FieldEmailsValue>();
useRecordFieldInput<FieldEmailsValue>();
const draftValue = useRecoilValue(getDraftValueSelector()); const draftValue = useRecoilComponentValueV2(
recordFieldInputDraftValueComponentState,
);
const persistField = usePersistField(); const persistField = usePersistField();

View File

@ -1,14 +1,16 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { FieldFullNameValue } from '@/object-record/record-field/types/FieldMetadata'; import { FieldFullNameValue } from '@/object-record/record-field/types/FieldMetadata';
import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata';
import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName'; import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName';
import { isFieldFullNameValue } from '@/object-record/record-field/types/guards/isFieldFullNameValue'; import { isFieldFullNameValue } from '@/object-record/record-field/types/guards/isFieldFullNameValue';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
export const useFullNameField = () => { export const useFullNameField = () => {
@ -39,10 +41,11 @@ export const useFullNameField = () => {
persistField(newValue); persistField(newValue);
}; };
const { setDraftValue, getDraftValueSelector } = const { setDraftValue } = useRecordFieldInput<FieldFullNameValue>();
useRecordFieldInput<FieldFullNameValue>();
const draftValue = useRecoilValue(getDraftValueSelector()); const draftValue = useRecoilComponentValueV2(
recordFieldInputDraftValueComponentState,
);
return { return {
fieldDefinition, fieldDefinition,

View File

@ -1,5 +1,5 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
@ -8,6 +8,8 @@ import { recordStoreFamilySelector } from '@/object-record/record-store/states/s
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { usePrecomputedJsonDraftValue } from '@/object-record/record-field/meta-types/hooks/usePrecomputedJsonDraftValue'; import { usePrecomputedJsonDraftValue } from '@/object-record/record-field/meta-types/hooks/usePrecomputedJsonDraftValue';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
import { isFieldRawJson } from '../../types/guards/isFieldRawJson'; import { isFieldRawJson } from '../../types/guards/isFieldRawJson';
@ -42,10 +44,11 @@ export const useJsonField = () => {
} }
}; };
const { setDraftValue, getDraftValueSelector } = const { setDraftValue } = useRecordFieldInput<FieldJsonValue>();
useRecordFieldInput<FieldJsonValue>();
const draftValue = useRecoilValue(getDraftValueSelector()); const draftValue = useRecoilComponentValueV2(
recordFieldInputDraftValueComponentState,
);
const precomputedDraftValue = usePrecomputedJsonDraftValue({ const precomputedDraftValue = usePrecomputedJsonDraftValue({
draftValue, draftValue,

View File

@ -1,5 +1,5 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
@ -9,6 +9,8 @@ import { linksSchema } from '@/object-record/record-field/types/guards/isFieldLi
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
@ -26,10 +28,11 @@ export const useLinksField = () => {
}), }),
); );
const { setDraftValue, getDraftValueSelector } = const { setDraftValue } = useRecordFieldInput<FieldLinksValue>();
useRecordFieldInput<FieldLinksValue>();
const draftValue = useRecoilValue(getDraftValueSelector()); const draftValue = useRecoilComponentValueV2(
recordFieldInputDraftValueComponentState,
);
const persistField = usePersistField(); const persistField = usePersistField();

View File

@ -1,14 +1,16 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { FieldMultiSelectValue } from '@/object-record/record-field/types/FieldMetadata'; import { FieldMultiSelectValue } from '@/object-record/record-field/types/FieldMetadata';
import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata';
import { isFieldMultiSelect } from '@/object-record/record-field/types/guards/isFieldMultiSelect'; import { isFieldMultiSelect } from '@/object-record/record-field/types/guards/isFieldMultiSelect';
import { isFieldMultiSelectValue } from '@/object-record/record-field/types/guards/isFieldMultiSelectValue'; import { isFieldMultiSelectValue } from '@/object-record/record-field/types/guards/isFieldMultiSelectValue';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
export const useMultiSelectField = () => { export const useMultiSelectField = () => {
@ -34,9 +36,11 @@ export const useMultiSelectField = () => {
: null; : null;
const persistField = usePersistField(); const persistField = usePersistField();
const { setDraftValue, getDraftValueSelector } = const { setDraftValue } = useRecordFieldInput<FieldMultiSelectValue>();
useRecordFieldInput<FieldMultiSelectValue>();
const draftValue = useRecoilValue(getDraftValueSelector()); const draftValue = useRecoilComponentValueV2(
recordFieldInputDraftValueComponentState,
);
return { return {
recordId, recordId,

View File

@ -1,5 +1,5 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
import { FieldNumberValue } from '@/object-record/record-field/types/FieldMetadata'; import { FieldNumberValue } from '@/object-record/record-field/types/FieldMetadata';
@ -11,6 +11,8 @@ import {
castAsNumberOrNull, castAsNumberOrNull,
} from '~/utils/cast-as-number-or-null'; } from '~/utils/cast-as-number-or-null';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { isNull } from '@sniptt/guards'; import { isNull } from '@sniptt/guards';
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
import { usePersistField } from '../../hooks/usePersistField'; import { usePersistField } from '../../hooks/usePersistField';
@ -54,10 +56,11 @@ export const useNumberField = () => {
persistField(castedValue); persistField(castedValue);
}; };
const { setDraftValue, getDraftValueSelector } = const { setDraftValue } = useRecordFieldInput<FieldNumberValue>();
useRecordFieldInput<FieldNumberValue>();
const draftValue = useRecoilValue(getDraftValueSelector()); const draftValue = useRecoilComponentValueV2(
recordFieldInputDraftValueComponentState,
);
return { return {
fieldDefinition, fieldDefinition,

View File

@ -1,5 +1,5 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
@ -9,6 +9,8 @@ import { phonesSchema } from '@/object-record/record-field/types/guards/isFieldP
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
@ -26,10 +28,11 @@ export const usePhonesField = () => {
}), }),
); );
const { setDraftValue, getDraftValueSelector } = const { setDraftValue } = useRecordFieldInput<FieldPhonesValue>();
useRecordFieldInput<FieldPhonesValue>();
const draftValue = useRecoilValue(getDraftValueSelector()); const draftValue = useRecoilComponentValueV2(
recordFieldInputDraftValueComponentState,
);
const persistField = usePersistField(); const persistField = usePersistField();

View File

@ -1,16 +1,17 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { useGetButtonIcon } from '@/object-record/record-field/hooks/useGetButtonIcon'; import { useGetButtonIcon } from '@/object-record/record-field/hooks/useGetButtonIcon';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
import { FieldRelationValue } from '@/object-record/record-field/types/FieldMetadata'; import { FieldRelationValue } from '@/object-record/record-field/types/FieldMetadata';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata';
import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation'; import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
export const useRelationField = <T extends ObjectRecord | ObjectRecord[]>() => { export const useRelationField = <T extends ObjectRecord | ObjectRecord[]>() => {
const { recordId, fieldDefinition, maxWidth } = useContext(FieldContext); const { recordId, fieldDefinition, maxWidth } = useContext(FieldContext);
@ -28,9 +29,9 @@ export const useRelationField = <T extends ObjectRecord | ObjectRecord[]>() => {
recordStoreFamilySelector({ recordId, fieldName }), recordStoreFamilySelector({ recordId, fieldName }),
); );
const { getDraftValueSelector } = const draftValue = useRecoilComponentValueV2(
useRecordFieldInput<FieldRelationValue<T>>(); recordFieldInputDraftValueComponentState,
const draftValue = useRecoilValue(getDraftValueSelector()); );
const initialSearchValue = draftValue; const initialSearchValue = draftValue;

View File

@ -1,5 +1,5 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
import { FieldRichTextValue } from '@/object-record/record-field/types/FieldMetadata'; import { FieldRichTextValue } from '@/object-record/record-field/types/FieldMetadata';
@ -7,8 +7,10 @@ import { recordStoreFamilySelector } from '@/object-record/record-store/states/s
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { isFieldRichText } from '@/object-record/record-field/types/guards/isFieldRichText'; import { isFieldRichText } from '@/object-record/record-field/types/guards/isFieldRichText';
import { isFieldRichTextValue } from '@/object-record/record-field/types/guards/isFieldRichTextValue'; import { isFieldRichTextValue } from '@/object-record/record-field/types/guards/isFieldRichTextValue';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import type { PartialBlock } from '@blocknote/core'; import type { PartialBlock } from '@blocknote/core';
import { isNonEmptyString } from '@sniptt/guards'; import { isNonEmptyString } from '@sniptt/guards';
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
@ -33,10 +35,11 @@ export const useRichTextField = () => {
); );
const fieldRichTextValue = isFieldRichTextValue(fieldValue) ? fieldValue : ''; const fieldRichTextValue = isFieldRichTextValue(fieldValue) ? fieldValue : '';
const { setDraftValue, getDraftValueSelector } = const { setDraftValue } = useRecordFieldInput<FieldRichTextValue>();
useRecordFieldInput<FieldRichTextValue>();
const draftValue = useRecoilValue(getDraftValueSelector()); const draftValue = useRecoilComponentValueV2(
recordFieldInputDraftValueComponentState,
);
const draftValueParsed: PartialBlock[] = isNonEmptyString(draftValue) const draftValueParsed: PartialBlock[] = isNonEmptyString(draftValue)
? JSON.parse(draftValue) ? JSON.parse(draftValue)

View File

@ -1,5 +1,5 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
import { import {
@ -10,8 +10,10 @@ import { recordStoreFamilySelector } from '@/object-record/record-store/states/s
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { isFieldRichTextV2 } from '@/object-record/record-field/types/guards/isFieldRichTextV2'; import { isFieldRichTextV2 } from '@/object-record/record-field/types/guards/isFieldRichTextV2';
import { isFieldRichTextV2Value } from '@/object-record/record-field/types/guards/isFieldRichTextValueV2'; import { isFieldRichTextV2Value } from '@/object-record/record-field/types/guards/isFieldRichTextValueV2';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import type { PartialBlock } from '@blocknote/core'; import type { PartialBlock } from '@blocknote/core';
import { isNonEmptyString } from '@sniptt/guards'; import { isNonEmptyString } from '@sniptt/guards';
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
@ -38,10 +40,11 @@ export const useRichTextV2Field = () => {
? fieldValue ? fieldValue
: ({ blocknote: null, markdown: null } as FieldRichTextV2Value); : ({ blocknote: null, markdown: null } as FieldRichTextV2Value);
const { setDraftValue, getDraftValueSelector } = const { setDraftValue } = useRecordFieldInput<FieldRichTextValue>();
useRecordFieldInput<FieldRichTextValue>();
const draftValue = useRecoilValue(getDraftValueSelector()); const draftValue = useRecoilComponentValueV2(
recordFieldInputDraftValueComponentState,
);
const draftValueParsed: PartialBlock[] = isNonEmptyString(draftValue) const draftValueParsed: PartialBlock[] = isNonEmptyString(draftValue)
? JSON.parse(draftValue) ? JSON.parse(draftValue)

View File

@ -1,11 +1,13 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { FieldContext } from '../../contexts/FieldContext'; import { FieldContext } from '../../contexts/FieldContext';
import { FieldSelectValue } from '../../types/FieldMetadata'; import { FieldSelectValue } from '../../types/FieldMetadata';
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
@ -29,9 +31,11 @@ export const useSelectField = () => {
const fieldSelectValue = isFieldSelectValue(fieldValue) ? fieldValue : null; const fieldSelectValue = isFieldSelectValue(fieldValue) ? fieldValue : null;
const persistField = usePersistField(); const persistField = usePersistField();
const { setDraftValue, getDraftValueSelector } = const { setDraftValue } = useRecordFieldInput<FieldSelectValue>();
useRecordFieldInput<FieldSelectValue>();
const draftValue = useRecoilValue(getDraftValueSelector()); const draftValue = useRecoilComponentValueV2(
recordFieldInputDraftValueComponentState,
);
return { return {
recordId, recordId,

View File

@ -1,13 +1,15 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState } from 'recoil';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { FieldTextValue } from '@/object-record/record-field/types/FieldMetadata'; import { FieldTextValue } from '@/object-record/record-field/types/FieldMetadata';
import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata'; import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata';
import { isFieldText } from '@/object-record/record-field/types/guards/isFieldText'; import { isFieldText } from '@/object-record/record-field/types/guards/isFieldText';
import { isFieldTextValue } from '@/object-record/record-field/types/guards/isFieldTextValue'; import { isFieldTextValue } from '@/object-record/record-field/types/guards/isFieldTextValue';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
export const useTextField = () => { export const useTextField = () => {
@ -25,10 +27,11 @@ export const useTextField = () => {
); );
const fieldTextValue = isFieldTextValue(fieldValue) ? fieldValue : ''; const fieldTextValue = isFieldTextValue(fieldValue) ? fieldValue : '';
const { setDraftValue, getDraftValueSelector } = const { setDraftValue } = useRecordFieldInput<FieldTextValue>();
useRecordFieldInput<FieldTextValue>();
const draftValue = useRecoilValue(getDraftValueSelector()); const draftValue = useRecoilComponentValueV2(
recordFieldInputDraftValueComponentState,
);
return { return {
draftValue, draftValue,

View File

@ -1,7 +1,9 @@
import { createComponentState } from '@/ui/utilities/state/component-state/utils/createComponentState'; import { RecordFieldComponentInstanceContext } from '@/object-record/record-field/states/contexts/RecordFieldComponentInstanceContext';
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
export const recordFieldInputDraftValueComponentState = export const recordFieldInputDraftValueComponentState =
createComponentState<any>({ createComponentStateV2<any>({
key: 'recordFieldInputDraftValueComponentState', key: 'recordFieldInputDraftValueComponentState',
defaultValue: undefined, defaultValue: undefined,
componentInstanceContext: RecordFieldComponentInstanceContext,
}); });

View File

@ -1,16 +0,0 @@
import { recordFieldInputDraftValueComponentState } from '@/object-record/record-field/states/recordFieldInputDraftValueComponentState';
import { createComponentSelector } from '@/ui/utilities/state/component-state/utils/createComponentSelector';
export const recordFieldInputDraftValueComponentSelector =
createComponentSelector<any>({
key: 'recordFieldInputDraftValueComponentSelector',
get:
<T>({ scopeId }: { scopeId: string }) =>
({ get }) =>
get(recordFieldInputDraftValueComponentState({ scopeId })) as T,
set:
<T>({ scopeId }: { scopeId: string }) =>
({ set }, newValue: T) => {
set(recordFieldInputDraftValueComponentState({ scopeId }), newValue);
},
});