Refactored useFindOneObjectMetadataItem and useFindManyObjectMetadataItems (#2600)
* Refactored useFindOneObjectMetadataItem and useFindManyObjectMetadataItems to rely on a recoil family selector * Removed console.log * Cleaned * Removed unused hook * Fixed seeds
This commit is contained in:
@ -1,13 +1,14 @@
|
||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
import { FieldMetadata } from '@/ui/object/field/types/FieldMetadata';
|
||||
import { ColumnDefinition } from '@/ui/object/record-table/types/ColumnDefinition';
|
||||
import { Nullable } from '~/types/Nullable';
|
||||
|
||||
import { formatFieldMetadataItemAsColumnDefinition } from '../utils/formatFieldMetadataItemAsColumnDefinition';
|
||||
import { formatFieldMetadataItemsAsFilterDefinitions } from '../utils/formatFieldMetadataItemsAsFilterDefinitions';
|
||||
import { formatFieldMetadataItemsAsSortDefinitions } from '../utils/formatFieldMetadataItemsAsSortDefinitions';
|
||||
|
||||
export const useComputeDefinitionsFromFieldMetadata = (
|
||||
objectMetadataItem?: ObjectMetadataItem,
|
||||
objectMetadataItem?: Nullable<ObjectMetadataItem>,
|
||||
) => {
|
||||
if (!objectMetadataItem) {
|
||||
return {
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
import { useMemo } from 'react';
|
||||
import { useQuery } from '@apollo/client';
|
||||
import { useRecoilCallback } from 'recoil';
|
||||
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
|
||||
import {
|
||||
FieldFilter,
|
||||
@ -8,6 +10,7 @@ import {
|
||||
ObjectMetadataItemsQuery,
|
||||
ObjectMetadataItemsQueryVariables,
|
||||
} from '~/generated-metadata/graphql';
|
||||
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
|
||||
import { logError } from '~/utils/logError';
|
||||
|
||||
import { FIND_MANY_METADATA_OBJECTS } from '../graphql/queries';
|
||||
@ -15,7 +18,6 @@ import { mapPaginatedObjectMetadataItemsToObjectMetadataItems } from '../utils/m
|
||||
|
||||
import { useApolloMetadataClient } from './useApolloMetadataClient';
|
||||
|
||||
// TODO: test fetchMore
|
||||
export const useFindManyObjectMetadataItems = ({
|
||||
skip,
|
||||
objectFilter,
|
||||
@ -29,41 +31,44 @@ export const useFindManyObjectMetadataItems = ({
|
||||
|
||||
const { enqueueSnackBar } = useSnackBar();
|
||||
|
||||
const {
|
||||
data,
|
||||
fetchMore: fetchMoreInternal,
|
||||
loading,
|
||||
error,
|
||||
} = useQuery<ObjectMetadataItemsQuery, ObjectMetadataItemsQueryVariables>(
|
||||
FIND_MANY_METADATA_OBJECTS,
|
||||
{
|
||||
variables: {
|
||||
objectFilter,
|
||||
fieldFilter,
|
||||
},
|
||||
client: apolloMetadataClient ?? undefined,
|
||||
skip: skip || !apolloMetadataClient,
|
||||
onError: (error) => {
|
||||
logError('useFindManyObjectMetadataItems error : ' + error);
|
||||
enqueueSnackBar(
|
||||
`Error during useFindManyObjectMetadataItems, ${error.message}`,
|
||||
{
|
||||
variant: 'error',
|
||||
},
|
||||
);
|
||||
},
|
||||
onCompleted: () => {},
|
||||
const { data, loading, error } = useQuery<
|
||||
ObjectMetadataItemsQuery,
|
||||
ObjectMetadataItemsQueryVariables
|
||||
>(FIND_MANY_METADATA_OBJECTS, {
|
||||
variables: {
|
||||
objectFilter,
|
||||
fieldFilter,
|
||||
},
|
||||
);
|
||||
client: apolloMetadataClient ?? undefined,
|
||||
skip: skip || !apolloMetadataClient,
|
||||
onError: (error) => {
|
||||
logError('useFindManyObjectMetadataItems error : ' + error);
|
||||
enqueueSnackBar(
|
||||
`Error during useFindManyObjectMetadataItems, ${error.message}`,
|
||||
{
|
||||
variant: 'error',
|
||||
},
|
||||
);
|
||||
},
|
||||
onCompleted: useRecoilCallback(
|
||||
({ snapshot, set }) =>
|
||||
(data) => {
|
||||
const objectMetadataItems =
|
||||
mapPaginatedObjectMetadataItemsToObjectMetadataItems({
|
||||
pagedObjectMetadataItems: data,
|
||||
});
|
||||
|
||||
const hasMore = data?.objects?.pageInfo?.hasNextPage;
|
||||
const actualObjectMetadataItems = snapshot
|
||||
.getLoadable(objectMetadataItemsState)
|
||||
.getValue();
|
||||
|
||||
const fetchMore = () =>
|
||||
fetchMoreInternal({
|
||||
variables: {
|
||||
afterCursor: data?.objects?.pageInfo?.endCursor,
|
||||
},
|
||||
});
|
||||
if (!isDeeplyEqual(objectMetadataItems, actualObjectMetadataItems)) {
|
||||
set(objectMetadataItemsState, objectMetadataItems);
|
||||
}
|
||||
},
|
||||
[],
|
||||
),
|
||||
});
|
||||
|
||||
const objectMetadataItems = useMemo(() => {
|
||||
return mapPaginatedObjectMetadataItemsToObjectMetadataItems({
|
||||
@ -73,8 +78,6 @@ export const useFindManyObjectMetadataItems = ({
|
||||
|
||||
return {
|
||||
objectMetadataItems,
|
||||
hasMore,
|
||||
fetchMore,
|
||||
loading,
|
||||
error,
|
||||
};
|
||||
|
||||
@ -1,74 +0,0 @@
|
||||
import { useMemo } from 'react';
|
||||
import { useQuery } from '@apollo/client';
|
||||
|
||||
import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
|
||||
import {
|
||||
ObjectFilter,
|
||||
ObjectMetadataItemsQuery,
|
||||
ObjectMetadataItemsQueryVariables,
|
||||
} from '~/generated-metadata/graphql';
|
||||
import { logError } from '~/utils/logError';
|
||||
|
||||
import { FIND_MANY_METADATA_OBJECTS } from '../graphql/queries';
|
||||
import { mapPaginatedObjectMetadataItemsToObjectMetadataItems } from '../utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems';
|
||||
|
||||
import { useApolloMetadataClient } from './useApolloMetadataClient';
|
||||
|
||||
// TODO: test fetchMore
|
||||
export const useFindManyObjectMetadataItems = ({
|
||||
skip,
|
||||
filter,
|
||||
}: { skip?: boolean; filter?: ObjectFilter } = {}) => {
|
||||
const apolloMetadataClient = useApolloMetadataClient();
|
||||
|
||||
const { enqueueSnackBar } = useSnackBar();
|
||||
|
||||
const {
|
||||
data,
|
||||
fetchMore: fetchMoreInternal,
|
||||
loading,
|
||||
error,
|
||||
} = useQuery<ObjectMetadataItemsQuery, ObjectMetadataItemsQueryVariables>(
|
||||
FIND_MANY_METADATA_OBJECTS,
|
||||
{
|
||||
variables: {
|
||||
objectFilter: filter,
|
||||
},
|
||||
client: apolloMetadataClient ?? undefined,
|
||||
skip: skip || !apolloMetadataClient,
|
||||
onError: (error) => {
|
||||
logError('useFindManyObjectMetadataItems error : ' + error);
|
||||
enqueueSnackBar(
|
||||
`Error during useFindManyObjectMetadataItems, ${error.message}`,
|
||||
{
|
||||
variant: 'error',
|
||||
},
|
||||
);
|
||||
},
|
||||
onCompleted: () => {},
|
||||
},
|
||||
);
|
||||
|
||||
const hasMore = data?.objects?.pageInfo?.hasNextPage;
|
||||
|
||||
const fetchMore = () =>
|
||||
fetchMoreInternal({
|
||||
variables: {
|
||||
afterCursor: data?.objects?.pageInfo?.endCursor,
|
||||
},
|
||||
});
|
||||
|
||||
const objectMetadataItems = useMemo(() => {
|
||||
return mapPaginatedObjectMetadataItemsToObjectMetadataItems({
|
||||
pagedObjectMetadataItems: data,
|
||||
});
|
||||
}, [data]);
|
||||
|
||||
return {
|
||||
objectMetadataItems,
|
||||
hasMore,
|
||||
fetchMore,
|
||||
loading,
|
||||
error,
|
||||
};
|
||||
};
|
||||
@ -1,10 +1,12 @@
|
||||
import { useFindManyObjectMetadataItems } from '@/object-metadata/hooks/useFindManyObjectMetadataItems';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
import { FieldType } from '@/ui/object/field/types/FieldType';
|
||||
|
||||
import { FieldMetadataItem } from '../types/FieldMetadataItem';
|
||||
|
||||
export const useMapFieldMetadataToGraphQLQuery = () => {
|
||||
const { objectMetadataItems } = useFindManyObjectMetadataItems();
|
||||
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
|
||||
|
||||
const mapFieldMetadataToGraphQLQuery = (
|
||||
field: FieldMetadataItem,
|
||||
@ -19,6 +21,7 @@ export const useMapFieldMetadataToGraphQLQuery = () => {
|
||||
|
||||
const fieldIsSimpleValue = (
|
||||
[
|
||||
'UUID',
|
||||
'TEXT',
|
||||
'PHONE',
|
||||
'DATE',
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
import { MainIdentifierMapper } from '@/ui/object/field/types/MainIdentifierMapper';
|
||||
import { Nullable } from '~/types/Nullable';
|
||||
|
||||
export const useObjectMainIdentifier = (
|
||||
objectMetadataItem?: ObjectMetadataItem,
|
||||
objectMetadataItem?: Nullable<ObjectMetadataItem>,
|
||||
) => {
|
||||
if (!objectMetadataItem) {
|
||||
return {
|
||||
|
||||
@ -1,15 +1,16 @@
|
||||
import { gql } from '@apollo/client';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
|
||||
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
|
||||
import { useGenerateCreateOneObjectMutation } from '@/object-record/utils/generateCreateOneObjectMutation';
|
||||
import { useGenerateDeleteOneObjectMutation } from '@/object-record/utils/useGenerateDeleteOneObjectMutation';
|
||||
import { useGenerateFindManyCustomObjectsQuery } from '@/object-record/utils/useGenerateFindManyCustomObjectsQuery';
|
||||
import { useGenerateFindOneCustomObjectQuery } from '@/object-record/utils/useGenerateFindOneCustomObjectQuery';
|
||||
import { useGenerateUpdateOneObjectMutation } from '@/object-record/utils/useGenerateUpdateOneObjectMutation';
|
||||
import { isDefined } from '~/utils/isDefined';
|
||||
|
||||
import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier';
|
||||
|
||||
import { useFindManyObjectMetadataItems } from './useFindManyObjectMetadataItems';
|
||||
|
||||
export const EMPTY_QUERY = gql`
|
||||
query EmptyQuery {
|
||||
empty
|
||||
@ -22,53 +23,46 @@ export const EMPTY_MUTATION = gql`
|
||||
}
|
||||
`;
|
||||
|
||||
export const useFindOneObjectMetadataItem = ({
|
||||
export const useObjectMetadataItem = ({
|
||||
objectNamePlural,
|
||||
objectNameSingular,
|
||||
skip,
|
||||
}: ObjectMetadataItemIdentifier & { skip?: boolean }) => {
|
||||
const { objectMetadataItems, loading } = useFindManyObjectMetadataItems({
|
||||
skip,
|
||||
});
|
||||
|
||||
const foundObjectMetadataItem = objectMetadataItems.find(
|
||||
(object) =>
|
||||
object.namePlural === objectNamePlural ||
|
||||
object.nameSingular === objectNameSingular,
|
||||
const objectMetadataItem = useRecoilValue(
|
||||
objectMetadataItemFamilySelector({
|
||||
objectNamePlural,
|
||||
objectNameSingular,
|
||||
}),
|
||||
);
|
||||
|
||||
const objectNotFoundInMetadata =
|
||||
objectMetadataItems.length === 0 ||
|
||||
(objectMetadataItems.length > 0 && !foundObjectMetadataItem);
|
||||
const objectNotFoundInMetadata = !isDefined(objectMetadataItem);
|
||||
|
||||
const findManyQuery = useGenerateFindManyCustomObjectsQuery({
|
||||
objectMetadataItem: foundObjectMetadataItem,
|
||||
objectMetadataItem,
|
||||
});
|
||||
|
||||
const findOneQuery = useGenerateFindOneCustomObjectQuery({
|
||||
objectMetadataItem: foundObjectMetadataItem,
|
||||
objectMetadataItem,
|
||||
});
|
||||
|
||||
const createOneMutation = useGenerateCreateOneObjectMutation({
|
||||
objectMetadataItem: foundObjectMetadataItem,
|
||||
objectMetadataItem,
|
||||
});
|
||||
|
||||
const updateOneMutation = useGenerateUpdateOneObjectMutation({
|
||||
objectMetadataItem: foundObjectMetadataItem,
|
||||
objectMetadataItem,
|
||||
});
|
||||
|
||||
const deleteOneMutation = useGenerateDeleteOneObjectMutation({
|
||||
objectMetadataItem: foundObjectMetadataItem,
|
||||
objectMetadataItem,
|
||||
});
|
||||
|
||||
return {
|
||||
foundObjectMetadataItem,
|
||||
objectMetadataItem,
|
||||
objectNotFoundInMetadata,
|
||||
findManyQuery,
|
||||
findOneQuery,
|
||||
createOneMutation,
|
||||
updateOneMutation,
|
||||
deleteOneMutation,
|
||||
loading,
|
||||
};
|
||||
};
|
||||
@ -1,14 +1,17 @@
|
||||
import { useRecoilValue } from 'recoil';
|
||||
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
|
||||
import { ObjectMetadataItem } from '../types/ObjectMetadataItem';
|
||||
import { formatObjectMetadataItemInput } from '../utils/formatObjectMetadataItemInput';
|
||||
import { getObjectSlug } from '../utils/getObjectSlug';
|
||||
|
||||
import { useCreateOneObjectRecordMetadataItem } from './useCreateOneObjectMetadataItem';
|
||||
import { useDeleteOneObjectMetadataItem } from './useDeleteOneObjectMetadataItem';
|
||||
import { useFindManyObjectMetadataItems } from './useFindManyObjectMetadataItems';
|
||||
import { useUpdateOneObjectMetadataItem } from './useUpdateOneObjectMetadataItem';
|
||||
|
||||
export const useObjectMetadataItemForSettings = () => {
|
||||
const { objectMetadataItems, loading } = useFindManyObjectMetadataItems();
|
||||
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
|
||||
|
||||
const activeObjectMetadataItems = objectMetadataItems.filter(
|
||||
({ isActive, isSystem }) => isActive && !isSystem,
|
||||
@ -87,7 +90,6 @@ export const useObjectMetadataItemForSettings = () => {
|
||||
findActiveObjectMetadataItemBySlug,
|
||||
findObjectMetadataItemById,
|
||||
findObjectMetadataItemByNamePlural,
|
||||
loading,
|
||||
objectMetadataItems,
|
||||
};
|
||||
};
|
||||
|
||||
@ -0,0 +1,30 @@
|
||||
import { selectorFamily } from 'recoil';
|
||||
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
|
||||
export const objectMetadataItemFamilySelector = selectorFamily<
|
||||
ObjectMetadataItem | null,
|
||||
{ objectNameSingular?: string; objectNamePlural?: string }
|
||||
>({
|
||||
key: 'objectMetadataItemFamilySelector',
|
||||
get:
|
||||
({
|
||||
objectNameSingular,
|
||||
objectNamePlural,
|
||||
}: {
|
||||
objectNameSingular?: string;
|
||||
objectNamePlural?: string;
|
||||
}) =>
|
||||
({ get }) => {
|
||||
const objectMetadataItems = get(objectMetadataItemsState);
|
||||
|
||||
return (
|
||||
objectMetadataItems.find(
|
||||
(objectMetadataItem) =>
|
||||
objectMetadataItem.nameSingular === objectNameSingular ||
|
||||
objectMetadataItem.namePlural === objectNamePlural,
|
||||
) ?? null
|
||||
);
|
||||
},
|
||||
});
|
||||
@ -0,0 +1,8 @@
|
||||
import { atom } from 'recoil';
|
||||
|
||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
|
||||
export const objectMetadataItemsState = atom<ObjectMetadataItem[]>({
|
||||
key: 'objectMetadataItemsState',
|
||||
default: [],
|
||||
});
|
||||
Reference in New Issue
Block a user