-
Notifications
You must be signed in to change notification settings - Fork 5.7k
Expand file tree
/
Copy pathuseActivities.ts
More file actions
84 lines (75 loc) · 2.76 KB
/
useActivities.ts
File metadata and controls
84 lines (75 loc) · 2.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import { useActivityTargetsForTargetableObjects } from '@/activities/hooks/useActivityTargetsForTargetableObjects';
import { type ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity';
import { type Note } from '@/activities/types/Note';
import { type NoteTarget } from '@/activities/types/NoteTarget';
import { type Task } from '@/activities/types/Task';
import { type TaskTarget } from '@/activities/types/TaskTarget';
import { type CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { getRecordsFromRecordConnection } from '@/object-record/cache/utils/getRecordsFromRecordConnection';
import { type RecordGqlOperationOrderBy } from '@/object-record/graphql/types/RecordGqlOperationOrderBy';
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
import { useRecoilCallback } from 'recoil';
import { isDefined } from 'twenty-shared/utils';
export const useActivities = <T extends Task | Note>({
objectNameSingular,
targetableObjects,
activityTargetsOrderByVariables,
skip,
limit,
}: {
objectNameSingular: CoreObjectNameSingular.Note | CoreObjectNameSingular.Task;
targetableObjects: ActivityTargetableObject[];
activityTargetsOrderByVariables: RecordGqlOperationOrderBy;
skip?: boolean;
limit: number;
}) => {
const updateActivitiesInStore = useRecoilCallback(
({ set }) =>
(activityTargets: (TaskTarget | NoteTarget)[]) => {
for (const activityTarget of activityTargets) {
const activity = activityTarget[objectNameSingular];
set(recordStoreFamilyState(activity.id), activity);
}
},
[objectNameSingular],
);
const {
activityTargets,
loadingActivityTargets,
totalCountActivityTargets,
fetchMoreActivityTargets,
hasNextPage,
} = useActivityTargetsForTargetableObjects({
objectNameSingular,
targetableObjects,
skip: skip,
activityTargetsOrderByVariables,
onCompleted: updateActivitiesInStore,
limit,
});
const activities = activityTargets.map((activityTarget) => {
return activityTarget[objectNameSingular];
}) as T[];
const fetchMoreActivities = async () => {
const result = await fetchMoreActivityTargets();
if (!isDefined(result?.data)) {
return [];
}
const activityTargets = getRecordsFromRecordConnection<
TaskTarget | NoteTarget
>({
recordConnection: result.data,
});
updateActivitiesInStore(activityTargets);
return activityTargets.map((activityTarget) => {
return activityTarget[objectNameSingular];
}) as T[];
};
return {
activities: activities as T[],
loading: loadingActivityTargets,
totalCountActivities: totalCountActivityTargets,
fetchMoreActivities,
hasNextPage,
};
};