Fixed bug that was appearing with records without any activity target The problem may come from the new TwentyORM that doesn't understand the filter like before.
93 lines
3.2 KiB
TypeScript
93 lines
3.2 KiB
TypeScript
import { isNonEmptyString } from '@sniptt/guards';
|
|
import { useRecoilCallback } from 'recoil';
|
|
|
|
import { findActivitiesOperationSignatureFactory } from '@/activities/graphql/operation-signatures/factories/findActivitiesOperationSignatureFactory';
|
|
import { useActivityTargetsForTargetableObjects } from '@/activities/hooks/useActivityTargetsForTargetableObjects';
|
|
import { ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity';
|
|
import { Note } from '@/activities/types/Note';
|
|
import { Task } from '@/activities/types/Task';
|
|
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
|
|
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
|
import { RecordGqlOperationFilter } from '@/object-record/graphql/types/RecordGqlOperationFilter';
|
|
import { RecordGqlOperationOrderBy } from '@/object-record/graphql/types/RecordGqlOperationOrderBy';
|
|
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
|
|
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
|
import { sortByAscString } from '~/utils/array/sortByAscString';
|
|
|
|
export const useActivities = <T extends Task | Note>({
|
|
objectNameSingular,
|
|
targetableObjects,
|
|
activitiesFilters,
|
|
activitiesOrderByVariables,
|
|
skip,
|
|
}: {
|
|
objectNameSingular: CoreObjectNameSingular;
|
|
targetableObjects: ActivityTargetableObject[];
|
|
activitiesFilters: RecordGqlOperationFilter;
|
|
activitiesOrderByVariables: RecordGqlOperationOrderBy;
|
|
skip?: boolean;
|
|
}) => {
|
|
const { objectMetadataItems } = useObjectMetadataItems();
|
|
|
|
const { activityTargets, loadingActivityTargets } =
|
|
useActivityTargetsForTargetableObjects({
|
|
objectNameSingular,
|
|
targetableObjects,
|
|
skip: skip,
|
|
});
|
|
|
|
const activityIds = [
|
|
...new Set(
|
|
activityTargets
|
|
? [
|
|
...activityTargets
|
|
.map(
|
|
(activityTarget) =>
|
|
activityTarget.taskId ?? activityTarget.noteId,
|
|
)
|
|
.filter(isNonEmptyString),
|
|
].sort(sortByAscString)
|
|
: [],
|
|
),
|
|
];
|
|
|
|
const skipBecauseNoActivityTargetFound = activityIds.length === 0;
|
|
|
|
const filter: RecordGqlOperationFilter = {
|
|
id: {
|
|
in: activityIds,
|
|
},
|
|
...activitiesFilters,
|
|
};
|
|
|
|
const FIND_ACTIVITIES_OPERATION_SIGNATURE =
|
|
findActivitiesOperationSignatureFactory({
|
|
objectMetadataItems,
|
|
objectNameSingular,
|
|
});
|
|
|
|
const { records: activities, loading: loadingActivities } =
|
|
useFindManyRecords<Task | Note>({
|
|
skip: skip || loadingActivityTargets || skipBecauseNoActivityTargetFound,
|
|
objectNameSingular:
|
|
FIND_ACTIVITIES_OPERATION_SIGNATURE.objectNameSingular,
|
|
recordGqlFields: FIND_ACTIVITIES_OPERATION_SIGNATURE.fields,
|
|
filter,
|
|
orderBy: activitiesOrderByVariables,
|
|
onCompleted: useRecoilCallback(
|
|
({ set }) =>
|
|
(activities) => {
|
|
for (const activity of activities) {
|
|
set(recordStoreFamilyState(activity.id), activity);
|
|
}
|
|
},
|
|
[],
|
|
),
|
|
});
|
|
|
|
return {
|
|
activities: activities as T[],
|
|
loading: loadingActivities || loadingActivityTargets,
|
|
};
|
|
};
|