This PR is part 3 of RecordPicker refactoring. It aims to remove all effects from: - (low level layer) SingleRecordPicker, MultipleRecordPicker - (higher level layer) RelationPicker, RelationToOneInput, RelationFromManyInput, ActivityTargetInput... In this PR, I'm re-grouping Effects in ActivityTarget section and creating a hook that will be called on inlineCellOpen
67 lines
2.4 KiB
TypeScript
67 lines
2.4 KiB
TypeScript
import { useQuery } from '@apollo/client';
|
|
import { useRecoilValue } from 'recoil';
|
|
|
|
import { useLimitPerMetadataItem } from '@/object-metadata/hooks/useLimitPerMetadataItem';
|
|
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
|
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
|
import { EMPTY_QUERY } from '@/object-record/constants/EmptyQuery';
|
|
import { useGenerateCombinedSearchRecordsQuery } from '@/object-record/multiple-objects/hooks/useGenerateCombinedSearchRecordsQuery';
|
|
import { MultiObjectRecordQueryResult } from '@/object-record/multiple-objects/types/MultiObjectRecordQueryResult';
|
|
import { isObjectMetadataItemSearchableInCombinedRequest } from '@/object-record/utils/isObjectMetadataItemSearchableInCombinedRequest';
|
|
import { isDefined } from 'twenty-shared';
|
|
|
|
export const useMultiObjectSearch = ({
|
|
searchFilterValue,
|
|
limit,
|
|
excludedObjects,
|
|
}: {
|
|
searchFilterValue: string;
|
|
limit?: number;
|
|
excludedObjects?: CoreObjectNameSingular[];
|
|
}) => {
|
|
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
|
|
|
|
const selectableObjectMetadataItems = objectMetadataItems
|
|
.filter(({ isSystem, isRemote }) => !isSystem && !isRemote)
|
|
.filter(({ nameSingular }) => {
|
|
return !excludedObjects?.includes(nameSingular as CoreObjectNameSingular);
|
|
})
|
|
.filter((objectMetadataItem) =>
|
|
isObjectMetadataItemSearchableInCombinedRequest(objectMetadataItem),
|
|
);
|
|
|
|
const { limitPerMetadataItem } = useLimitPerMetadataItem({
|
|
objectMetadataItems,
|
|
limit,
|
|
});
|
|
|
|
const multiSelectSearchQueryForSelectedIds =
|
|
useGenerateCombinedSearchRecordsQuery({
|
|
operationSignatures: selectableObjectMetadataItems.map(
|
|
(objectMetadataItem) => ({
|
|
objectNameSingular: objectMetadataItem.nameSingular,
|
|
variables: {},
|
|
}),
|
|
),
|
|
});
|
|
|
|
const {
|
|
loading: matchesSearchFilterObjectRecordsLoading,
|
|
data: matchesSearchFilterObjectRecordsQueryResult,
|
|
} = useQuery<MultiObjectRecordQueryResult>(
|
|
multiSelectSearchQueryForSelectedIds ?? EMPTY_QUERY,
|
|
{
|
|
variables: {
|
|
search: searchFilterValue,
|
|
...limitPerMetadataItem,
|
|
},
|
|
skip: !isDefined(multiSelectSearchQueryForSelectedIds),
|
|
},
|
|
);
|
|
|
|
return {
|
|
matchesSearchFilterObjectRecordsLoading,
|
|
matchesSearchFilterObjectRecordsQueryResult,
|
|
};
|
|
};
|