twentyhq / twenty

Building a modern alternative to Salesforce, powered by the community.
https://twenty.com
GNU Affero General Public License v3.0
15.78k stars 1.73k forks source link

Refactor getRecordIdentifier memoization at object metadata items fetching level. #5636

Closed lucasbordeau closed 2 weeks ago

lucasbordeau commented 3 months ago

Scope & Context

We had to revert a refactor on getRecordIdentifier for each relation field type, because it didn't work everywhere.

Technical inputs

We should get the refactor done not a RecordTable level but for the whole app at the object metadata items initialization level.

That way we'll have a memoized and pre-computed function for each relation field.

greptile-apps[bot] commented 3 months ago

Disclaimer: This comment was automatically generated with AI. It can give some useful hints as to where to look for, but sometimes it can also give very inaccurate answers so takes this with a pinch of salt :).

To refactor getRecordIdentifier memoization at the object metadata items fetching level, follow these steps:

  1. Locate Initialization Code: Identify where object metadata items are initialized. This is likely in a central initialization or configuration file.

  2. Memoize getRecordIdentifier: Modify the initialization to memoize getRecordIdentifier for each relation field type.

  3. Update Usage: Ensure all usages of getRecordIdentifier across the app utilize the memoized version.

Example Implementation

Step 1: Locate Initialization Code

Check objectMetadataItemsState or similar state management files where object metadata items are fetched and initialized.

Step 2: Memoize getRecordIdentifier

In the initialization file, add memoization logic:

import memoize from 'lodash/memoize';
import { getObjectRecordIdentifier } from '@/object-metadata/utils/getObjectRecordIdentifier';

const memoizedGetRecordIdentifier = memoize(getObjectRecordIdentifier);

// Initialize object metadata items with memoized function
const initializeObjectMetadataItems = (items) => {
  return items.map(item => {
    item.getRecordIdentifier = memoizedGetRecordIdentifier;
    return item;
  });
};

Step 3: Update Usage

Ensure all components and hooks use the memoized version:

// Example in a component or hook
const recordIdentifier = objectMetadataItem.getRecordIdentifier(record);

This ensures getRecordIdentifier is memoized and pre-computed for each relation field type at the initialization level.

References

/packages/twenty-front/src/modules/object-record/cache/utils/getRecordNodeFromRecord.ts /packages/twenty-front/src/modules/object-record/record-store/states/selectors/recordStoreIdentifierSelector.ts /packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataItemsRelationPickerEffect.tsx /packages/twenty-front/src/modules/object-metadata/utils/mapObjectMetadataToGraphQLQuery.ts /packages/twenty-front/src/modules/apollo/optimistic-effect/utils/getRelationDefinition.ts /packages/twenty-front/src/modules/object-metadata/utils/getObjectRecordIdentifier.ts /packages/twenty-front/src/modules/object-record/cache/utils/getRecordFromCache.ts /packages/twenty-front/src/modules/object-record/cache/hooks/useGetRecordFromCache.ts /packages/twenty-front/src/modules/object-metadata/hooks/useMapToObjectRecordIdentifier.ts /packages/twenty-front/src/modules/object-record/record-index/hooks/useRecordBoardRecordGqlFields.ts

Ask Greptile