b2210bd418
* ESLint rule: enforce usage of .getLoadable() + .getValue() to get atoms Co-authored-by: Matheus <matheus_benini@hotmail.com> * Merge main Co-authored-by: v1b3m <vibenjamin6@gmail.com> Co-authored-by: Matheus <matheus_benini@hotmail.com> * Fix * Refactor according to review Co-authored-by: v1b3m <vibenjamin6@gmail.com> Co-authored-by: Matheus <matheus_benini@hotmail.com> * Fix linter issue Co-authored-by: v1b3m <vibenjamin6@gmail.com> Co-authored-by: Matheus <matheus_benini@hotmail.com> * Fix linter Co-authored-by: v1b3m <vibenjamin6@gmail.com> Co-authored-by: Matheus <matheus_benini@hotmail.com> --------- Co-authored-by: gitstart-twenty <gitstart-twenty@users.noreply.github.com> Co-authored-by: Matheus <matheus_benini@hotmail.com> Co-authored-by: v1b3m <vibenjamin6@gmail.com> Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
68 lines
2.2 KiB
TypeScript
68 lines
2.2 KiB
TypeScript
import { useRecoilCallback } from 'recoil';
|
|
|
|
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
|
|
import { RelationType } from '@/settings/data-model/types/RelationType';
|
|
import {
|
|
FieldMetadataType,
|
|
RelationMetadataType,
|
|
} from '~/generated-metadata/graphql';
|
|
|
|
import { FieldMetadataItem } from '../types/FieldMetadataItem';
|
|
|
|
export const useGetRelationMetadata = () =>
|
|
useRecoilCallback(
|
|
({ snapshot }) =>
|
|
({ fieldMetadataItem }: { fieldMetadataItem: FieldMetadataItem }) => {
|
|
if (fieldMetadataItem.type !== FieldMetadataType.Relation) return null;
|
|
|
|
const relationMetadata =
|
|
fieldMetadataItem.fromRelationMetadata ||
|
|
fieldMetadataItem.toRelationMetadata;
|
|
|
|
if (!relationMetadata) return null;
|
|
|
|
const relationFieldMetadataId =
|
|
'toFieldMetadataId' in relationMetadata
|
|
? relationMetadata.toFieldMetadataId
|
|
: relationMetadata.fromFieldMetadataId;
|
|
|
|
if (!relationFieldMetadataId) return null;
|
|
|
|
const relationType =
|
|
relationMetadata.relationType === RelationMetadataType.OneToMany &&
|
|
fieldMetadataItem.toRelationMetadata
|
|
? 'MANY_TO_ONE'
|
|
: (relationMetadata.relationType as RelationType);
|
|
|
|
const relationObjectMetadataNameSingular =
|
|
'toObjectMetadata' in relationMetadata
|
|
? relationMetadata.toObjectMetadata.nameSingular
|
|
: relationMetadata.fromObjectMetadata.nameSingular;
|
|
|
|
const relationObjectMetadataItem = snapshot
|
|
.getLoadable(
|
|
objectMetadataItemFamilySelector({
|
|
objectName: relationObjectMetadataNameSingular,
|
|
objectNameType: 'singular',
|
|
}),
|
|
)
|
|
.getValue();
|
|
|
|
if (!relationObjectMetadataItem) return null;
|
|
|
|
const relationFieldMetadataItem =
|
|
relationObjectMetadataItem.fields.find(
|
|
(field) => field.id === relationFieldMetadataId,
|
|
);
|
|
|
|
if (!relationFieldMetadataItem) return null;
|
|
|
|
return {
|
|
relationFieldMetadataItem,
|
|
relationObjectMetadataItem,
|
|
relationType,
|
|
};
|
|
},
|
|
[],
|
|
);
|