4087 refactor object metadata item hooks and utils (#4861)

- Extracted each exported element from useObjectMetadataItem into its
own hook.
This commit is contained in:
Lucas Bordeau
2024-04-09 09:19:52 +02:00
committed by GitHub
parent 651af1c0e1
commit b1242bb850
89 changed files with 699 additions and 622 deletions

View File

@ -1,21 +0,0 @@
import { renderHook } from '@testing-library/react';
import { useGetObjectOrderByField } from '@/object-metadata/hooks/useGetObjectOrderByField';
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
const mockObjectMetadataItems = getObjectMetadataItemsMock();
describe('useGetObjectOrderByField', () => {
it('should work as expected', () => {
const objectMetadataItem = mockObjectMetadataItems.find(
(item) => item.nameSingular === 'person',
)!;
const { result } = renderHook(() =>
useGetObjectOrderByField({ objectMetadataItem })('AscNullsLast'),
);
expect(result.current).toEqual({
name: { firstName: 'AscNullsLast', lastName: 'AscNullsLast' },
});
});
});

View File

@ -0,0 +1,33 @@
import { ReactNode } from 'react';
import { MockedProvider } from '@apollo/client/testing';
import { renderHook } from '@testing-library/react';
import { RecoilRoot } from 'recoil';
import { useGetObjectOrderByField } from '@/object-metadata/hooks/useGetObjectOrderByField';
const Wrapper = ({ children }: { children: ReactNode }) => (
<RecoilRoot>
<MockedProvider addTypename={false}>{children}</MockedProvider>
</RecoilRoot>
);
describe('useGetObjectOrderByField', () => {
it('should work as expected', () => {
const { result } = renderHook(
() => {
const { getObjectOrderByField } = useGetObjectOrderByField({
objectNameSingular: 'person',
});
return getObjectOrderByField('AscNullsLast');
},
{
wrapper: Wrapper,
},
);
expect(result.current).toEqual({
name: { firstName: 'AscNullsLast', lastName: 'AscNullsLast' },
});
});
});

View File

@ -2,21 +2,19 @@ import { renderHook } from '@testing-library/react';
import { RecoilRoot } from 'recoil';
import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier';
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
const mockObjectMetadataItems = getObjectMetadataItemsMock();
describe('useMapToObjectRecordIdentifier', () => {
it('should work as expected', async () => {
const { result } = renderHook(
() => {
const objectMetadataItem = mockObjectMetadataItems.find(
(item) => item.nameSingular === 'person',
)!;
const { mapToObjectRecordIdentifier } = useMapToObjectRecordIdentifier({
objectNameSingular: 'person',
});
return useMapToObjectRecordIdentifier({
objectMetadataItem,
})({ id: 'id', name: { firstName: 'Sheldon', lastName: 'Cooper' } });
return mapToObjectRecordIdentifier({
id: 'id',
name: { firstName: 'Sheldon', lastName: 'Cooper' },
});
},
{
wrapper: RecoilRoot,

View File

@ -11,6 +11,7 @@ const Wrapper = ({ children }: { children: ReactNode }) => (
</RecoilRoot>
);
// Split into tests for each new hook
describe('useObjectMetadataItem', () => {
it('should return correct properties', async () => {
const { result } = renderHook(
@ -20,39 +21,8 @@ describe('useObjectMetadataItem', () => {
},
);
const {
basePathToShowPage,
objectMetadataItem,
labelIdentifierFieldMetadata,
getRecordFromCache,
findManyRecordsQuery,
findOneRecordQuery,
createOneRecordMutation,
updateOneRecordMutation,
deleteOneRecordMutation,
executeQuickActionOnOneRecordMutation,
createManyRecordsMutation,
deleteManyRecordsMutation,
mapToObjectRecordIdentifier,
getObjectOrderByField,
} = result.current;
const { objectMetadataItem } = result.current;
expect(labelIdentifierFieldMetadata).toBeUndefined();
expect(basePathToShowPage).toBe('/object/opportunity/');
expect(objectMetadataItem.id).toBe('20202020-cae9-4ff4-9579-f7d9fe44c937');
expect(typeof getRecordFromCache).toBe('function');
expect(typeof mapToObjectRecordIdentifier).toBe('function');
expect(typeof getObjectOrderByField).toBe('function');
expect(findManyRecordsQuery).toHaveProperty('kind', 'Document');
expect(findOneRecordQuery).toHaveProperty('kind', 'Document');
expect(createOneRecordMutation).toHaveProperty('kind', 'Document');
expect(updateOneRecordMutation).toHaveProperty('kind', 'Document');
expect(deleteOneRecordMutation).toHaveProperty('kind', 'Document');
expect(executeQuickActionOnOneRecordMutation).toHaveProperty(
'kind',
'Document',
);
expect(createManyRecordsMutation).toHaveProperty('kind', 'Document');
expect(deleteManyRecordsMutation).toHaveProperty('kind', 'Document');
});
});

View File

@ -1,8 +1,8 @@
import { ApolloClient, useApolloClient, useMutation } from '@apollo/client';
import { getOperationName } from '@apollo/client/utilities';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useFindManyRecordsQuery } from '@/object-record/hooks/useFindManyRecordsQuery';
import {
CreateObjectInput,
CreateOneObjectMetadataItemMutation,
@ -17,7 +17,8 @@ import { useApolloMetadataClient } from './useApolloMetadataClient';
export const useCreateOneObjectMetadataItem = () => {
const apolloMetadataClient = useApolloMetadataClient();
const apolloClient = useApolloClient();
const { findManyRecordsQuery } = useObjectMetadataItem({
const { findManyRecordsQuery } = useFindManyRecordsQuery({
objectNameSingular: CoreObjectNameSingular.View,
});

View File

@ -1,14 +1,20 @@
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { OrderBy } from '@/object-metadata/types/OrderBy';
import { OrderByField } from '@/object-metadata/types/OrderByField';
import { getObjectOrderByField } from '@/object-metadata/utils/getObjectOrderByField';
import { getOrderByFieldForObjectMetadataItem } from '@/object-metadata/utils/getObjectOrderByField';
export const useGetObjectOrderByField = ({
objectMetadataItem,
objectNameSingular,
}: {
objectMetadataItem: ObjectMetadataItem;
objectNameSingular: string;
}) => {
return (orderBy: OrderBy): OrderByField => {
return getObjectOrderByField(objectMetadataItem, orderBy);
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const getObjectOrderByField = (orderBy: OrderBy): OrderByField => {
return getOrderByFieldForObjectMetadataItem(objectMetadataItem, orderBy);
};
return { getObjectOrderByField };
};

View File

@ -0,0 +1,17 @@
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/getLabelIdentifierFieldMetadataItem';
export const useLabelIdentifierFieldMetadataItem = ({
objectNameSingular,
}: {
objectNameSingular: string;
}) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const labelIdentifierFieldMetadataItem =
getLabelIdentifierFieldMetadataItem(objectMetadataItem);
return { labelIdentifierFieldMetadataItem };
};

View File

@ -1,8 +1,19 @@
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { getObjectRecordIdentifier } from '@/object-metadata/utils/getObjectRecordIdentifier';
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
export const useMapToObjectRecordIdentifier =
({ objectMetadataItem }: { objectMetadataItem: ObjectMetadataItem }) =>
(record: ObjectRecord) =>
getObjectRecordIdentifier({ objectMetadataItem, record });
export const useMapToObjectRecordIdentifier = ({
objectNameSingular,
}: {
objectNameSingular: string;
}) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const mapToObjectRecordIdentifier = (record: ObjectRecord) => {
return getObjectRecordIdentifier({ objectMetadataItem, record });
};
return { mapToObjectRecordIdentifier };
};

View File

@ -1,47 +1,17 @@
import { gql } from '@apollo/client';
import { useRecoilValue } from 'recoil';
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState.ts';
import { ObjectMetadataItemNotFoundError } from '@/object-metadata/errors/ObjectMetadataNotFoundError';
import { useGetObjectOrderByField } from '@/object-metadata/hooks/useGetObjectOrderByField';
import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier';
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { getBasePathToShowPage } from '@/object-metadata/utils/getBasePathToShowPage';
import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/getLabelIdentifierFieldMetadataItem';
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
import { useGenerateCreateManyRecordMutation } from '@/object-record/hooks/useGenerateCreateManyRecordMutation';
import { useGenerateCreateOneRecordMutation } from '@/object-record/hooks/useGenerateCreateOneRecordMutation';
import { useGenerateDeleteManyRecordMutation } from '@/object-record/hooks/useGenerateDeleteManyRecordMutation';
import { useGenerateExecuteQuickActionOnOneRecordMutation } from '@/object-record/hooks/useGenerateExecuteQuickActionOnOneRecordMutation';
import { useGenerateFindDuplicateRecordsQuery } from '@/object-record/hooks/useGenerateFindDuplicateRecordsQuery';
import { useGenerateFindManyRecordsQuery } from '@/object-record/hooks/useGenerateFindManyRecordsQuery';
import { useGenerateFindOneRecordQuery } from '@/object-record/hooks/useGenerateFindOneRecordQuery';
import { useGenerateUpdateOneRecordMutation } from '@/object-record/hooks/useGenerateUpdateOneRecordMutation';
import { generateDeleteOneRecordMutation } from '@/object-record/utils/generateDeleteOneRecordMutation';
import { isDefined } from '~/utils/isDefined';
import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier';
export const EMPTY_QUERY = gql`
query EmptyQuery {
empty
}
`;
export const EMPTY_MUTATION = gql`
mutation EmptyMutation {
empty
}
`;
export const useObjectMetadataItem = (
{ objectNameSingular }: ObjectMetadataItemIdentifier,
depth?: number,
queryFields?: Record<string, any>,
computeReferences = false,
) => {
export const useObjectMetadataItem = ({
objectNameSingular,
}: ObjectMetadataItemIdentifier) => {
const currentWorkspace = useRecoilValue(currentWorkspaceState);
const mockObjectMetadataItems = getObjectMetadataItemsMock();
@ -71,89 +41,7 @@ export const useObjectMetadataItem = (
);
}
const mapToObjectRecordIdentifier = useMapToObjectRecordIdentifier({
objectMetadataItem,
});
const getObjectOrderByField = useGetObjectOrderByField({
objectMetadataItem,
});
const getRecordFromCache = useGetRecordFromCache({
objectMetadataItem,
});
const generateFindManyRecordsQuery = useGenerateFindManyRecordsQuery();
const findManyRecordsQuery = generateFindManyRecordsQuery({
objectMetadataItem,
depth,
queryFields,
});
const generateFindDuplicateRecordsQuery =
useGenerateFindDuplicateRecordsQuery();
const findDuplicateRecordsQuery = generateFindDuplicateRecordsQuery({
objectMetadataItem,
depth,
});
const generateFindOneRecordQuery = useGenerateFindOneRecordQuery();
const findOneRecordQuery = generateFindOneRecordQuery({
objectMetadataItem,
depth,
});
const createOneRecordMutation = useGenerateCreateOneRecordMutation({
objectMetadataItem,
depth,
});
const createManyRecordsMutation = useGenerateCreateManyRecordMutation({
objectMetadataItem,
depth,
});
const updateOneRecordMutation = useGenerateUpdateOneRecordMutation({
objectMetadataItem,
depth,
computeReferences,
});
const deleteOneRecordMutation = generateDeleteOneRecordMutation({
objectMetadataItem,
});
const deleteManyRecordsMutation = useGenerateDeleteManyRecordMutation({
objectMetadataItem,
});
const executeQuickActionOnOneRecordMutation =
useGenerateExecuteQuickActionOnOneRecordMutation({
objectMetadataItem,
});
const labelIdentifierFieldMetadata =
getLabelIdentifierFieldMetadataItem(objectMetadataItem);
const basePathToShowPage = getBasePathToShowPage({
objectMetadataItem,
});
return {
labelIdentifierFieldMetadata,
basePathToShowPage,
objectMetadataItem,
getRecordFromCache,
findManyRecordsQuery,
findDuplicateRecordsQuery,
findOneRecordQuery,
createOneRecordMutation,
updateOneRecordMutation,
deleteOneRecordMutation,
executeQuickActionOnOneRecordMutation,
createManyRecordsMutation,
deleteManyRecordsMutation,
mapToObjectRecordIdentifier,
getObjectOrderByField,
};
};

View File

@ -1,47 +0,0 @@
import { useRecoilValue } from 'recoil';
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState.ts';
import { ObjectMetadataItemNotFoundError } from '@/object-metadata/errors/ObjectMetadataNotFoundError';
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
import { isDefined } from '~/utils/isDefined';
import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier';
export const useObjectMetadataItemOnly = ({
objectNameSingular,
}: ObjectMetadataItemIdentifier) => {
const currentWorkspace = useRecoilValue(currentWorkspaceState);
const mockObjectMetadataItems = getObjectMetadataItemsMock();
let objectMetadataItem = useRecoilValue(
objectMetadataItemFamilySelector({
objectName: objectNameSingular,
objectNameType: 'singular',
}),
);
let objectMetadataItems = useRecoilValue(objectMetadataItemsState);
if (currentWorkspace?.activationStatus !== 'active') {
objectMetadataItem =
mockObjectMetadataItems.find(
(objectMetadataItem) =>
objectMetadataItem.nameSingular === objectNameSingular,
) ?? null;
objectMetadataItems = mockObjectMetadataItems;
}
if (!isDefined(objectMetadataItem)) {
throw new ObjectMetadataItemNotFoundError(
objectNameSingular,
objectMetadataItems,
);
}
return {
objectMetadataItem,
};
};

View File

@ -1,5 +1,5 @@
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
import { getObjectOrderByField } from '@/object-metadata/utils/getObjectOrderByField';
import { getOrderByFieldForObjectMetadataItem } from '@/object-metadata/utils/getObjectOrderByField';
const mockObjectMetadataItems = getObjectMetadataItemsMock();
@ -8,7 +8,7 @@ describe('getObjectOrderByField', () => {
const objectMetadataItem = mockObjectMetadataItems.find(
(item) => item.nameSingular === 'person',
)!;
const res = getObjectOrderByField(objectMetadataItem);
const res = getOrderByFieldForObjectMetadataItem(objectMetadataItem);
expect(res).toEqual({
name: { firstName: 'AscNullsLast', lastName: 'AscNullsLast' },
});

View File

@ -1,11 +1,9 @@
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
export const getBasePathToShowPage = ({
objectMetadataItem,
objectNameSingular,
}: {
objectMetadataItem: ObjectMetadataItem;
objectNameSingular: string;
}) => {
const basePathToShowPage = `/object/${objectMetadataItem.nameSingular}/`;
const basePathToShowPage = `/object/${objectNameSingular}/`;
return basePathToShowPage;
};

View File

@ -5,7 +5,7 @@ import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/get
import { FieldMetadataType } from '~/generated-metadata/graphql';
import { isDefined } from '~/utils/isDefined';
export const getObjectOrderByField = (
export const getOrderByFieldForObjectMetadataItem = (
objectMetadataItem: ObjectMetadataItem,
orderBy?: OrderBy | null,
): OrderByField => {

View File

@ -68,7 +68,7 @@ export const getObjectRecordIdentifier = ({
: imageIdentifierFieldValue) ?? '';
const basePathToShowPage = getBasePathToShowPage({
objectMetadataItem,
objectNameSingular: objectMetadataItem.nameSingular,
});
const isWorkspaceMemberObjectMetadata =