* Wip * WIP * Removed concole log * Add relations to workspace init (#2511) * Add relations to workspace init * remove logs * update prefill * add missing isSystem * comment relation fields * Migrate v2 core models to graphql schema (#2509) * migrate v2 core models to graphql schema * Migrate to new workspace member schema * Continue work * migrated-main * Finished accountOwner nested field integration on companies * Introduce bug * Fix --------- Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com> Co-authored-by: Weiko <corentin@twenty.com>
208 lines
7.2 KiB
TypeScript
208 lines
7.2 KiB
TypeScript
import { useContext } from 'react';
|
|
import { useRecoilCallback } from 'recoil';
|
|
|
|
import { FieldContext } from '../contexts/FieldContext';
|
|
import { entityFieldsFamilySelector } from '../states/selectors/entityFieldsFamilySelector';
|
|
import { isFieldBoolean } from '../types/guards/isFieldBoolean';
|
|
import { isFieldBooleanValue } from '../types/guards/isFieldBooleanValue';
|
|
import { isFieldChip } from '../types/guards/isFieldChip';
|
|
import { isFieldChipValue } from '../types/guards/isFieldChipValue';
|
|
import { isFieldDate } from '../types/guards/isFieldDate';
|
|
import { isFieldDateValue } from '../types/guards/isFieldDateValue';
|
|
import { isFieldDoubleText } from '../types/guards/isFieldDoubleText';
|
|
import { isFieldDoubleTextChip } from '../types/guards/isFieldDoubleTextChip';
|
|
import { isFieldDoubleTextChipValue } from '../types/guards/isFieldDoubleTextChipValue';
|
|
import { isFieldDoubleTextValue } from '../types/guards/isFieldDoubleTextValue';
|
|
import { isFieldEmail } from '../types/guards/isFieldEmail';
|
|
import { isFieldEmailValue } from '../types/guards/isFieldEmailValue';
|
|
import { isFieldMoney } from '../types/guards/isFieldMoney';
|
|
import { isFieldMoneyAmountV2 } from '../types/guards/isFieldMoneyAmountV2';
|
|
import { isFieldMoneyAmountV2Value } from '../types/guards/isFieldMoneyAmountV2Value';
|
|
import { isFieldMoneyValue } from '../types/guards/isFieldMoneyValue';
|
|
import { isFieldNumber } from '../types/guards/isFieldNumber';
|
|
import { isFieldNumberValue } from '../types/guards/isFieldNumberValue';
|
|
import { isFieldPhone } from '../types/guards/isFieldPhone';
|
|
import { isFieldPhoneValue } from '../types/guards/isFieldPhoneValue';
|
|
import { isFieldProbability } from '../types/guards/isFieldProbability';
|
|
import { isFieldProbabilityValue } from '../types/guards/isFieldProbabilityValue';
|
|
import { isFieldRelation } from '../types/guards/isFieldRelation';
|
|
import { isFieldRelationValue } from '../types/guards/isFieldRelationValue';
|
|
import { isFieldText } from '../types/guards/isFieldText';
|
|
import { isFieldTextValue } from '../types/guards/isFieldTextValue';
|
|
import { isFieldURL } from '../types/guards/isFieldURL';
|
|
import { isFieldURLV2 } from '../types/guards/isFieldURLV2';
|
|
import { isFieldURLV2Value } from '../types/guards/isFieldURLV2Value';
|
|
import { isFieldURLValue } from '../types/guards/isFieldURLValue';
|
|
|
|
export const usePersistField = () => {
|
|
const {
|
|
entityId,
|
|
fieldDefinition,
|
|
useUpdateEntityMutation = () => [],
|
|
} = useContext(FieldContext);
|
|
|
|
const [updateEntity] = useUpdateEntityMutation();
|
|
|
|
const persistField = useRecoilCallback(
|
|
({ set }) =>
|
|
(valueToPersist: unknown) => {
|
|
const fieldIsRelation =
|
|
isFieldRelation(fieldDefinition) &&
|
|
isFieldRelationValue(valueToPersist);
|
|
|
|
const fieldIsChip =
|
|
isFieldChip(fieldDefinition) && isFieldChipValue(valueToPersist);
|
|
|
|
const fieldIsDoubleText =
|
|
isFieldDoubleText(fieldDefinition) &&
|
|
isFieldDoubleTextValue(valueToPersist);
|
|
|
|
const fieldIsDoubleTextChip =
|
|
isFieldDoubleTextChip(fieldDefinition) &&
|
|
isFieldDoubleTextChipValue(valueToPersist);
|
|
|
|
const fieldIsText =
|
|
isFieldText(fieldDefinition) && isFieldTextValue(valueToPersist);
|
|
|
|
const fieldIsEmail =
|
|
isFieldEmail(fieldDefinition) && isFieldEmailValue(valueToPersist);
|
|
|
|
const fieldIsDate =
|
|
isFieldDate(fieldDefinition) && isFieldDateValue(valueToPersist);
|
|
|
|
const fieldIsURL =
|
|
isFieldURL(fieldDefinition) && isFieldURLValue(valueToPersist);
|
|
|
|
const fieldIsURLV2 =
|
|
isFieldURLV2(fieldDefinition) && isFieldURLV2Value(valueToPersist);
|
|
|
|
const fieldIsBoolean =
|
|
isFieldBoolean(fieldDefinition) &&
|
|
isFieldBooleanValue(valueToPersist);
|
|
|
|
const fieldIsProbability =
|
|
isFieldProbability(fieldDefinition) &&
|
|
isFieldProbabilityValue(valueToPersist);
|
|
|
|
const fieldIsNumber =
|
|
isFieldNumber(fieldDefinition) && isFieldNumberValue(valueToPersist);
|
|
|
|
const fieldIsMoney =
|
|
isFieldMoney(fieldDefinition) && isFieldMoneyValue(valueToPersist);
|
|
|
|
const fieldIsMoneyAmountV2 =
|
|
isFieldMoneyAmountV2(fieldDefinition) &&
|
|
isFieldMoneyAmountV2Value(valueToPersist);
|
|
|
|
const fieldIsPhone =
|
|
isFieldPhone(fieldDefinition) && isFieldPhoneValue(valueToPersist);
|
|
|
|
if (fieldIsRelation) {
|
|
const fieldName = fieldDefinition.metadata.fieldName;
|
|
|
|
set(
|
|
entityFieldsFamilySelector({ entityId, fieldName }),
|
|
valueToPersist,
|
|
);
|
|
|
|
console.log({
|
|
fieldName,
|
|
valueToPersist,
|
|
});
|
|
|
|
updateEntity?.({
|
|
variables: {
|
|
where: { id: entityId },
|
|
data: {
|
|
[fieldName]: valueToPersist?.id,
|
|
},
|
|
},
|
|
});
|
|
} else if (fieldIsChip) {
|
|
const fieldName = fieldDefinition.metadata.contentFieldName;
|
|
|
|
set(
|
|
entityFieldsFamilySelector({ entityId, fieldName }),
|
|
valueToPersist,
|
|
);
|
|
|
|
updateEntity?.({
|
|
variables: {
|
|
where: { id: entityId },
|
|
data: {
|
|
[fieldName]: valueToPersist,
|
|
},
|
|
},
|
|
});
|
|
} else if (fieldIsDoubleText || fieldIsDoubleTextChip) {
|
|
set(
|
|
entityFieldsFamilySelector({
|
|
entityId,
|
|
fieldName: fieldDefinition.metadata.firstValueFieldName,
|
|
}),
|
|
valueToPersist.firstValue,
|
|
);
|
|
|
|
set(
|
|
entityFieldsFamilySelector({
|
|
entityId,
|
|
fieldName: fieldDefinition.metadata.secondValueFieldName,
|
|
}),
|
|
valueToPersist.secondValue,
|
|
);
|
|
|
|
updateEntity?.({
|
|
variables: {
|
|
where: { id: entityId },
|
|
data: {
|
|
[fieldDefinition.metadata.firstValueFieldName]:
|
|
valueToPersist.firstValue,
|
|
[fieldDefinition.metadata.secondValueFieldName]:
|
|
valueToPersist.secondValue,
|
|
},
|
|
},
|
|
});
|
|
} else if (
|
|
fieldIsText ||
|
|
fieldIsBoolean ||
|
|
fieldIsURL ||
|
|
fieldIsEmail ||
|
|
fieldIsProbability ||
|
|
fieldIsNumber ||
|
|
fieldIsMoney ||
|
|
fieldIsDate ||
|
|
fieldIsPhone ||
|
|
fieldIsURLV2 ||
|
|
fieldIsMoneyAmountV2
|
|
) {
|
|
const fieldName = fieldDefinition.metadata.fieldName;
|
|
|
|
set(
|
|
entityFieldsFamilySelector({ entityId, fieldName }),
|
|
valueToPersist,
|
|
);
|
|
|
|
updateEntity?.({
|
|
variables: {
|
|
where: { id: entityId },
|
|
data: {
|
|
[fieldName]: valueToPersist,
|
|
},
|
|
},
|
|
});
|
|
} else {
|
|
throw new Error(
|
|
`Invalid value to persist: ${JSON.stringify(
|
|
valueToPersist,
|
|
)} for type : ${
|
|
fieldDefinition.type
|
|
}, type may not be implemented in usePersistField.`,
|
|
);
|
|
}
|
|
},
|
|
[entityId, fieldDefinition, updateEntity],
|
|
);
|
|
|
|
return persistField;
|
|
};
|