123 lines
4.2 KiB
TypeScript
123 lines
4.2 KiB
TypeScript
import { useApolloClient } from '@apollo/client';
|
|
|
|
import { findActivitiesOperationSignatureFactory } from '@/activities/graphql/operation-signatures/factories/findActivitiesOperationSignatureFactory';
|
|
import { Activity } from '@/activities/types/Activity';
|
|
import { ActivityTarget } from '@/activities/types/ActivityTarget';
|
|
import { ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity';
|
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
|
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
|
|
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
|
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
|
|
import { useUpsertFindManyRecordsQueryInCache } from '@/object-record/cache/hooks/useUpsertFindManyRecordsQueryInCache';
|
|
import { getRecordFromCache } from '@/object-record/cache/utils/getRecordFromCache';
|
|
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
|
import { sortByAscString } from '~/utils/array/sortByAscString';
|
|
import { isDefined } from '~/utils/isDefined';
|
|
|
|
export const usePrepareFindManyActivitiesQuery = () => {
|
|
const { objectMetadataItem: objectMetadataItemActivity } =
|
|
useObjectMetadataItem({
|
|
objectNameSingular: CoreObjectNameSingular.Activity,
|
|
});
|
|
|
|
const getActivityFromCache = useGetRecordFromCache({
|
|
objectNameSingular: CoreObjectNameSingular.Activity,
|
|
});
|
|
|
|
const cache = useApolloClient().cache;
|
|
const { objectMetadataItems } = useObjectMetadataItems();
|
|
|
|
const { upsertFindManyRecordsQueryInCache: upsertFindManyActivitiesInCache } =
|
|
useUpsertFindManyRecordsQueryInCache({
|
|
objectMetadataItem: objectMetadataItemActivity,
|
|
});
|
|
|
|
const prepareFindManyActivitiesQuery = ({
|
|
targetableObject,
|
|
additionalFilter,
|
|
shouldActivityBeExcluded,
|
|
}: {
|
|
additionalFilter?: Record<string, unknown>;
|
|
targetableObject: ActivityTargetableObject;
|
|
shouldActivityBeExcluded?: (activityTarget: Activity) => boolean;
|
|
}) => {
|
|
const targetableObjectMetadataItem = objectMetadataItems.find(
|
|
(objectMetadataItem) =>
|
|
objectMetadataItem.nameSingular ===
|
|
targetableObject.targetObjectNameSingular,
|
|
);
|
|
|
|
if (!targetableObjectMetadataItem) {
|
|
throw new Error(
|
|
`Cannot find object metadata item for targetable object ${targetableObject.targetObjectNameSingular}`,
|
|
);
|
|
}
|
|
|
|
const targetableObjectRecord = getRecordFromCache<ObjectRecord>({
|
|
recordId: targetableObject.id,
|
|
objectMetadataItem: targetableObjectMetadataItem,
|
|
objectMetadataItems,
|
|
cache,
|
|
});
|
|
|
|
const activityTargets: ActivityTarget[] =
|
|
targetableObjectRecord?.activityTargets ?? [];
|
|
|
|
const activityTargetIds = [
|
|
...new Set(
|
|
activityTargets
|
|
.map((activityTarget) => activityTarget.id)
|
|
.filter(isDefined),
|
|
),
|
|
];
|
|
|
|
const activities: Activity[] = activityTargetIds
|
|
.map((activityTargetId) => {
|
|
const activityTarget = activityTargets.find(
|
|
(activityTarget) => activityTarget.id === activityTargetId,
|
|
);
|
|
|
|
if (!activityTarget) {
|
|
return undefined;
|
|
}
|
|
|
|
return getActivityFromCache<Activity>(activityTarget.activityId);
|
|
})
|
|
.filter(isDefined);
|
|
|
|
const activityIds = [...new Set(activities.map((activity) => activity.id))];
|
|
|
|
const nextFindManyActivitiesQueryFilter = {
|
|
filter: {
|
|
id: {
|
|
in: [...activityIds].sort(sortByAscString),
|
|
},
|
|
...additionalFilter,
|
|
},
|
|
};
|
|
|
|
const filteredActivities = [
|
|
...activities.filter((activity) => !shouldActivityBeExcluded?.(activity)),
|
|
].sort((a, b) => {
|
|
return a.createdAt > b.createdAt ? -1 : 1;
|
|
});
|
|
|
|
const FIND_ACTIVITIES_OPERATION_SIGNATURE =
|
|
findActivitiesOperationSignatureFactory({ objectMetadataItems });
|
|
|
|
upsertFindManyActivitiesInCache({
|
|
objectRecordsToOverwrite: filteredActivities,
|
|
queryVariables: {
|
|
...nextFindManyActivitiesQueryFilter,
|
|
orderBy: { createdAt: 'DescNullsFirst' },
|
|
},
|
|
recordGqlFields: FIND_ACTIVITIES_OPERATION_SIGNATURE.fields,
|
|
computeReferences: true,
|
|
});
|
|
};
|
|
|
|
return {
|
|
prepareFindManyActivitiesQuery,
|
|
};
|
|
};
|