Files
twenty/packages/twenty-front/src/modules/activities/hooks/useActivityTargetsForTargetableObjects.ts
T
Charles Bochet 8fb086e880 chore: remove dead code and rename objectMetadataItemsState to objectMetadataItemsSelector
Delete unused hooks (useWorkflowRunUnsafe, useGetViewById, useCreateViewFieldGroup,
useDeleteViewFieldGroup, useUpdateViewFieldGroup, useCreateManyViewFieldGroups,
useMoveViewColumns), unused SettingsSummaryCard component, and unused createEventContext
utility. Rename objectMetadataItemsState to objectMetadataItemsSelector across ~85 files
to better reflect that it is a derived selector, not a base atom.

Made-with: Cursor
2026-03-17 00:31:13 +01:00

92 lines
3.3 KiB
TypeScript

import {
CoreObjectNameSingular,
type RecordGqlOperationOrderBy,
} from 'twenty-shared/types';
import { findActivityTargetsOperationSignatureFactory } from '@/activities/graphql/operation-signatures/factories/findActivityTargetsOperationSignatureFactory';
import { type ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity';
import { type NoteTarget } from '@/activities/types/NoteTarget';
import { type TaskTarget } from '@/activities/types/TaskTarget';
import { getActivityTargetsFilter } from '@/activities/utils/getActivityTargetsFilter';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { FeatureFlagKey } from '~/generated-metadata/graphql';
export const useActivityTargetsForTargetableObjects = ({
objectNameSingular,
targetableObjects,
skip,
onCompleted,
activityTargetsOrderByVariables,
limit,
}: {
objectNameSingular: CoreObjectNameSingular.Note | CoreObjectNameSingular.Task;
targetableObjects: Pick<
ActivityTargetableObject,
'id' | 'targetObjectNameSingular'
>[];
skip?: boolean;
onCompleted?: (activityTargets: (TaskTarget | NoteTarget)[]) => void;
activityTargetsOrderByVariables: RecordGqlOperationOrderBy;
limit: number;
}) => {
const objectMetadataItems = useAtomStateValue<ObjectMetadataItem[]>(
objectMetadataItemsSelector,
);
const isNoteTargetMigrated = useIsFeatureEnabled(
FeatureFlagKey.IS_NOTE_TARGET_MIGRATED,
);
const isTaskTargetMigrated = useIsFeatureEnabled(
FeatureFlagKey.IS_TASK_TARGET_MIGRATED,
);
const isMorphRelation =
objectNameSingular === CoreObjectNameSingular.Task
? isTaskTargetMigrated
: isNoteTargetMigrated;
const activityTargetsFilter = getActivityTargetsFilter({
targetableObjects: targetableObjects,
activityObjectNameSingular: objectNameSingular,
objectMetadataItems,
isMorphRelation,
});
const FIND_ACTIVITY_TARGETS_OPERATION_SIGNATURE =
findActivityTargetsOperationSignatureFactory({
objectNameSingular,
objectMetadataItems,
});
// TODO: We want to optimistically remove from this request
// If we are on a show page and we remove the current show page object corresponding activity target
// See also if we need to update useTimelineActivities
const {
records: activityTargets,
loading: loadingActivityTargets,
totalCount: totalCountActivityTargets,
fetchMoreRecords: fetchMoreActivityTargets,
hasNextPage,
} = useFindManyRecords<TaskTarget | NoteTarget>({
skip,
objectNameSingular:
FIND_ACTIVITY_TARGETS_OPERATION_SIGNATURE.objectNameSingular,
filter: activityTargetsFilter,
recordGqlFields: FIND_ACTIVITY_TARGETS_OPERATION_SIGNATURE.fields,
onCompleted,
orderBy: activityTargetsOrderByVariables,
limit,
});
return {
activityTargets,
loadingActivityTargets,
totalCountActivityTargets: totalCountActivityTargets ?? 0,
fetchMoreActivityTargets,
hasNextPage,
};
};