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
This commit is contained in:
Charles Bochet
2026-03-17 00:31:13 +01:00
parent 267d8ca3b0
commit 8fb086e880
103 changed files with 352 additions and 455 deletions
+169
View File
@@ -0,0 +1,169 @@
# Twenty Frontend — Dead Code & Duplication Report
## 1. Unused Code (safe to delete)
### 1.1 Unused Hooks
| Hook | File | Notes |
|------|------|-------|
| `useWorkflowRunUnsafe` | `modules/workflow/hooks/useWorkflowRunUnsafe.ts` | Never imported. Duplicate of `useWorkflowRun` without schema validation. |
| `useGetViewById` | `modules/views/hooks/useGetViewById.ts` | Never imported. `useViewById` is used instead. |
| `useCreateViewFieldGroup` | `modules/views/hooks/useCreateViewFieldGroup.ts` | Never imported. CRUD done via `usePerformViewFieldGroupAPIPersist`. |
| `useDeleteViewFieldGroup` | `modules/views/hooks/useDeleteViewFieldGroup.ts` | Same as above. |
| `useUpdateViewFieldGroup` | `modules/views/hooks/useUpdateViewFieldGroup.ts` | Same as above. |
| `useCreateManyViewFieldGroups` | `modules/views/hooks/useCreateManyViewFieldGroups.ts` | Same as above. |
| `useMoveViewColumns` | `modules/views/hooks/useMoveViewColumns.ts` | Only imported by its own test file — no production usage. |
### 1.2 Unused Components
| Component | File | Notes |
|-----------|------|-------|
| `SettingsSummaryCard` | `modules/settings/components/SettingsSummaryCard.tsx` | Never imported anywhere. |
### 1.3 Unused Utilities
| Export | File | Notes |
|--------|------|-------|
| `createEventContext` + `EventContext` | `utils/createEventContext.ts` | Entire file is unused — zero imports. |
### 1.4 Filename Typo
| File | Issue |
|------|-------|
| `modules/views/hooks/useOpenCreateViewDropown.ts` | "Dropown" should be "Dropdown". The exported hook is correctly named `useOpenCreateViewDropdown`. |
---
## 2. Duplicated Logic
### 2.1 Search/filter reimplementations — **Low effort, High impact**
A central `filterBySearchQuery` utility exists in `utils/filterBySearchQuery.ts` with proper diacritic normalization, but several places reimplement search inline with plain `.toLowerCase().includes()`:
| File | Inline pattern |
|------|----------------|
| `modules/workflow/workflow-trigger/components/WorkflowEditTriggerDatabaseEventForm.tsx` | `option.label.toLowerCase().includes(searchValue.toLowerCase())` |
| `modules/workflow/workflow-variables/hooks/useVariableDropdown.ts` | `value.label?.toLowerCase().includes(searchInputValue.toLowerCase())` |
| `modules/settings/roles/.../SettingsRolePermissionsObjectLevelRecordLevelPermissionMeValueSelect.tsx` | `item.label.toLowerCase().includes(searchInput.toLowerCase())` |
| `pages/settings/ai/components/SettingsAIModelsTab.tsx` | Multi-field inline search |
**Fix:** Replace with `filterBySearchQuery` to get consistent diacritic-aware search for free.
### 2.2 `SelectInput` vs `SubMatchingSelectInput` — **Medium effort, High impact**
Both components in `modules/ui/input/components/SelectInput.tsx` and `modules/spreadsheet-import/.../SubMatchingSelectInput.tsx` have nearly identical logic:
- Same `optionsToSelect` memo with `normalizeSearchText`
- Same `optionsInDropDown` ordering (selected first)
- Same `handleOptionChange` pattern
**Fix:** Extract a shared `useSelectWithSearch(options, selectedOption)` hook.
### 2.3 `objectMetadataItemsState` + `.find()` — **Medium effort, High impact**
45+ files read `objectMetadataItemsState` and then do `.find(item => item.nameSingular === ...)` or similar lookups. Selectors like `objectMetadataItemFamilySelector` and `objectMetadataItemsByNameSingularMapSelector` already exist but are underused.
**Fix:** Introduce a `useObjectMetadataItemByName(name, 'singular' | 'plural')` hook and migrate call sites.
### 2.4 Object metadata sorting — **Low effort, Medium impact**
`a.labelSingular.localeCompare(b.labelSingular)` appears in 5+ places across hooks and utils. Same for `labelPlural`.
**Fix:** Add a shared `sortObjectMetadataByLabel(key)` comparator.
### 2.5 `objectMetadataItemsByNamePluralMapSelector` / `...SingularMapSelector` — **Low effort, Medium impact**
These two selectors are identical except for the map key (`namePlural` vs `nameSingular`).
**Fix:** Create a factory `createObjectMetadataItemsMapSelector(key)` and derive both from it.
### 2.6 Chart dropdown components — **Medium effort, Medium impact**
7 chart dropdown components share the same structure: `DropdownMenuSearchInput` + `filterBySearchQuery` + `DropdownMenuItemsContainer` + item rendering.
Files: `ChartGroupByFieldSelectionDropdownContentBase`, `ChartDataSourceDropdownContent`, `ChartRatioOptionValueSelectionDropdownContent`, `ChartAggregateOperationSelectionDropdownContent`, `ChartColorSelectionDropdownContent`, `ChartFieldSelectionForAggregateOperationDropdownContent`, `ChartGroupByFieldSelectionRelationFieldView`.
**Fix:** Extract a `ChartSettingsDropdown` wrapper that handles search + layout and accepts items via render prop.
### 2.7 Settings table row components — **Low effort, Medium impact**
6 settings table row components duplicate nearly identical styled components (`StyledNameContainer`, `StyledNameLabel`, `StyledInactiveLabel`):
- `SettingsObjectItemTableRow`
- `SettingsObjectFieldItemTableRow`
- `SettingsObjectRelationItemTableRow`
- `SettingsRolePermissionsObjectLevelObjectFieldPermissionTableRow`
- `SettingsRolePermissionsObjectLevelTableRow`
- `SettingsRoleAssignmentTableRow`
**Fix:** Extract shared styled components into `modules/settings/components/SettingsTableRowPrimitives.tsx`.
### 2.8 Date formatting scattered across 5+ files — **High effort, Medium impact**
Date utilities are spread across:
- `utils/date-utils.ts`
- `utils/format/formatDate.ts`
- `utils/string/formatDateString.ts`
- `utils/string/formatDateTimeString.ts`
- `utils/dates/formatZonedDateTimeDatePart.ts` / `formatZonedDateTimeTimePart.ts`
**Fix:** Consolidate under `utils/dates/` with clear responsibilities (parse, format, relative display).
---
## 3. Repeated Inline Patterns
### 3.1 Text truncation CSS — ~50 occurrences
```css
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
```
`EllipsisDisplay` exists in `modules/ui/field/display/components/EllipsisDisplay.tsx` but is rarely used.
**Fix:** Add a `truncateTextMixin` in shared styles. Use it in styled components instead of repeating these 3 lines.
### 3.2 Flex centering CSS — ~100+ occurrences
```css
display: flex;
align-items: center;
/* optional: justify-content: center */
```
**Fix:** Add `flexRowCenter` / `flexCenter` CSS mixins.
### 3.3 `e.stopPropagation()` wrapper — ~40 occurrences
`onClick={(e) => { e.stopPropagation(); ... }}` appears throughout.
A `StopPropagationContainer` exists in `modules/object-record/record-board/record-board-card/components/` but is barely reused.
**Fix:** Move `StopPropagationContainer` to a shared location and use it more broadly. Or add a `withStopPropagation(handler)` utility.
---
## 4. Priority Matrix
| # | Item | Effort | Impact | Type |
|---|------|--------|--------|------|
| 1 | Delete 7 unused hooks | **Very Low** | Medium | Dead code |
| 2 | Delete `SettingsSummaryCard` | **Very Low** | Low | Dead code |
| 3 | Delete `createEventContext.ts` | **Very Low** | Low | Dead code |
| 4 | Fix `useOpenCreateViewDropown` filename typo | **Very Low** | Low | Hygiene |
| 5 | Replace inline search filters with `filterBySearchQuery` | **Low** | High | Dedup |
| 6 | Add `truncateTextMixin` for ellipsis CSS | **Low** | High | Dedup |
| 7 | Extract shared settings table row styled components | **Low** | Medium | Dedup |
| 8 | Create `objectMetadataItemsMapSelector` factory | **Low** | Medium | Dedup |
| 9 | Add shared `sortObjectMetadataByLabel` comparator | **Low** | Medium | Dedup |
| 10 | Extract `useSelectWithSearch` from SelectInput/SubMatchingSelectInput | **Medium** | High | Dedup |
| 11 | Introduce `useObjectMetadataItemByName` hook | **Medium** | High | Dedup |
| 12 | Extract shared chart dropdown wrapper | **Medium** | Medium | Dedup |
| 13 | Consolidate date formatting utilities | **High** | Medium | Dedup |
Items 14 are pure low-hanging fruit — just deletions and a rename, no risk of regressions.
Items 59 are small refactors that pay off quickly across many files.
Items 1013 are larger but high-value unifications.
@@ -6,7 +6,7 @@ import { returnToPathState } from '@/auth/states/returnToPathState';
import { calendarBookingPageIdState } from '@/client-config/states/calendarBookingPageIdState';
import { useIsCurrentLocationOnAWorkspace } from '@/domain-manager/hooks/useIsCurrentLocationOnAWorkspace';
import { useDefaultHomePagePath } from '@/navigation/hooks/useDefaultHomePagePath';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useOnboardingStatus } from '@/onboarding/hooks/useOnboardingStatus';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { useIsWorkspaceActivationStatusEqualsTo } from '@/workspace/hooks/useIsWorkspaceActivationStatusEqualsTo';
@@ -40,7 +40,7 @@ export const usePageChangeEffectNavigateLocation = () => {
appPaths.some((appPath) => isMatchingLocation(location, appPath));
const objectNamePlural = useParams().objectNamePlural ?? '';
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const objectMetadataItem = objectMetadataItems?.find(
(objectMetadataItem) => objectMetadataItem.namePlural === objectNamePlural,
);
@@ -3,7 +3,7 @@ import { type NoteTarget } from '@/activities/types/NoteTarget';
import { type Task } from '@/activities/types/Task';
import { type TaskTarget } from '@/activities/types/TaskTarget';
import { getActivityTargetObjectRecords } from '@/activities/utils/getActivityTargetObjectRecords';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
import { useAtomFamilyStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilyStateValue';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -14,7 +14,7 @@ export const useActivityTargetObjectRecords = (
activityRecordId?: string,
activityTargets?: Nullable<NoteTarget[] | TaskTarget[]>,
) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const activity = useAtomFamilyStateValue(
recordStoreFamilyState,
@@ -8,7 +8,7 @@ import { type ActivityTargetableObject } from '@/activities/types/ActivityTarget
import { type NoteTarget } from '@/activities/types/NoteTarget';
import { type TaskTarget } from '@/activities/types/TaskTarget';
import { getActivityTargetsFilter } from '@/activities/utils/getActivityTargetsFilter';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
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';
@@ -35,7 +35,7 @@ export const useActivityTargetsForTargetableObjects = ({
limit: number;
}) => {
const objectMetadataItems = useAtomStateValue<ObjectMetadataItem[]>(
objectMetadataItemsState,
objectMetadataItemsSelector,
);
const isNoteTargetMigrated = useIsFeatureEnabled(
FeatureFlagKey.IS_NOTE_TARGET_MIGRATED,
@@ -1,5 +1,5 @@
import { type ActivityTargetWithTargetRecord } from '@/activities/types/ActivityTargetObject';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { CoreObjectNameSingular } from 'twenty-shared/types';
import { useMultipleRecordPickerOpen } from '@/object-record/record-picker/multiple-record-picker/hooks/useMultipleRecordPickerOpen';
import { useMultipleRecordPickerPerformSearch } from '@/object-record/record-picker/multiple-record-picker/hooks/useMultipleRecordPickerPerformSearch';
@@ -31,7 +31,7 @@ export const useOpenActivityTargetCellEditMode = () => {
activityTargetObjectRecords,
}: OpenActivityTargetCellEditModeProps) => {
const objectMetadataItems = store
.get(objectMetadataItemsState.atom)
.get(objectMetadataItemsSelector.atom)
.filter(
(objectMetadataItem) =>
objectMetadataItem.isSearchable &&
@@ -3,7 +3,7 @@ import { type NoteTarget } from '@/activities/types/NoteTarget';
import { type TaskTarget } from '@/activities/types/TaskTarget';
import { getActivityTargetFieldNameForObject } from '@/activities/utils/getActivityTargetFieldNameForObject';
import { getJoinObjectNameSingular } from '@/activities/utils/getJoinObjectNameSingular';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { CoreObjectNameSingular } from 'twenty-shared/types';
import { useCreateOneRecord } from '@/object-record/hooks/useCreateOneRecord';
import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord';
@@ -81,7 +81,7 @@ export const useUpdateActivityTargetFromCell = ({
? 'task'
: 'note';
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
const pickedObjectMetadataItem = objectMetadataItems.find(
(objectMetadataItem) =>
@@ -1,10 +1,10 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
export const useLinkedObjectObjectMetadataItem = (id: string | null) => {
const objectMetadataItems: ObjectMetadataItem[] = useAtomStateValue(
objectMetadataItemsState,
objectMetadataItemsSelector,
);
if (id === null) {
@@ -10,7 +10,7 @@ import { contextStoreCurrentViewTypeComponentState } from '@/context-store/state
import { contextStoreFiltersComponentState } from '@/context-store/states/contextStoreFiltersComponentState';
import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
import { ContextStoreViewType } from '@/context-store/types/ContextStoreViewType';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { getTabListInstanceIdFromPageLayoutId } from '@/page-layout/utils/getTabListInstanceIdFromPageLayoutId';
import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
@@ -35,7 +35,7 @@ export const useGetBrowsingContext = () => {
}),
);
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
const objectMetadataItem = objectMetadataItems.find(
(item) => item.id === objectMetadataItemId,
@@ -1,5 +1,5 @@
import { MentionRecordChip } from '@/mention/components/MentionRecordChip';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { RecordChip } from '@/object-record/components/RecordChip';
import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord';
import { createReactInlineContentSpec } from '@blocknote/react';
@@ -32,7 +32,7 @@ const LegacyMentionRenderer = ({
recordId: string;
objectMetadataId: string;
}) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const objectMetadataItem = objectMetadataItems.find(
(item) => item.id === objectMetadataId,
@@ -2,7 +2,7 @@ import { type CommandMenuContextType } from '@/command-menu-item/contexts/Comman
import { CommandMenuContextProviderDefault } from '@/command-menu-item/contexts/CommandMenuContextProviderDefault';
import { CommandMenuContextProviderWorkflowObjects } from '@/command-menu-item/contexts/CommandMenuContextProviderWorkflowObjects';
import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { CoreObjectNameSingular } from 'twenty-shared/types';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
@@ -23,7 +23,7 @@ export const CommandMenuContextProviderLegacy = ({
contextStoreCurrentObjectMetadataItemIdComponentState,
);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const objectMetadataItem =
objectMetadataItemOverride ??
@@ -7,7 +7,7 @@ import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context
import { contextStoreIsPageInEditModeComponentState } from '@/context-store/states/contextStoreIsPageInEditModeComponentState';
import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
import { useMountHeadlessFrontComponent } from '@/front-components/hooks/useMountHeadlessFrontComponent';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useOpenFrontComponentInSidePanel } from '@/side-panel/hooks/useOpenFrontComponentInSidePanel';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -180,7 +180,7 @@ export const useCommandMenuItemFrontComponentCommands = (
contextStoreTargetedRecordsRuleComponentState,
);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const currentObjectMetadataItem = objectMetadataItems.find(
(item) => item.id === contextStoreCurrentObjectMetadataItemId,
@@ -27,7 +27,7 @@ import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context
import { contextStoreCurrentViewTypeComponentState } from '@/context-store/states/contextStoreCurrentViewTypeComponentState';
import { ContextStoreComponentInstanceContext } from '@/context-store/states/contexts/ContextStoreComponentInstanceContext';
import { ContextStoreViewType } from '@/context-store/types/ContextStoreViewType';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { RecordComponentInstanceContextsWrapper } from '@/object-record/components/RecordComponentInstanceContextsWrapper';
import { SidePanelRouter } from '@/side-panel/components/SidePanelRouter';
import { SIDE_PANEL_COMPONENT_INSTANCE_ID } from '@/side-panel/constants/SidePanelComponentInstanceId';
@@ -102,7 +102,7 @@ const meta: Meta<typeof SidePanelRootPage> = {
},
]);
const objectMetadataItems = jotaiStore.get(objectMetadataItemsState.atom);
const objectMetadataItems = jotaiStore.get(objectMetadataItemsSelector.atom);
const companyMetadataItem = objectMetadataItems.find(
(item) => item.nameSingular === 'company',
);
@@ -2,7 +2,7 @@ import { MainContextStoreProviderEffect } from '@/context-store/components/MainC
import { metadataStoreState } from '@/metadata-store/states/metadataStoreState';
import { useIsSettingsPage } from '@/navigation/hooks/useIsSettingsPage';
import { useLastVisitedView } from '@/navigation/hooks/useLastVisitedView';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useShowAuthModal } from '@/ui/layout/hooks/useShowAuthModal';
import { useAtomFamilyStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilyStateValue';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -60,7 +60,7 @@ export const MainContextStoreProvider = () => {
const [searchParams] = useSearchParams();
const viewIdQueryParamRaw = searchParams.get('viewId');
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const metadataStore = useAtomFamilyStateValue(metadataStoreState, 'views');
const views = useAtomStateValue(viewsSelector);
@@ -1,5 +1,5 @@
import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -11,7 +11,7 @@ export const useContextStoreObjectMetadataItem = (
contextStoreInstanceId,
);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const objectMetadataItem = objectMetadataItems.find(
(objectMetadataItemToFind) =>
@@ -5,7 +5,7 @@ import { contextStoreFiltersComponentState } from '@/context-store/states/contex
import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
import { computeContextStoreFilters } from '@/context-store/utils/computeContextStoreFilters';
import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
import { useFilterValueDependencies } from '@/object-record/record-filter/hooks/useFilterValueDependencies';
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
@@ -50,7 +50,7 @@ export const useFindManyRecordsSelectedInContextStore = ({
const { filterValueDependencies } = useFilterValueDependencies();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const allFieldMetadataItems = objectMetadataItems.flatMap(
(objectMetadataItem) => objectMetadataItem.fields,
@@ -32,7 +32,7 @@ import { getNavigationMenuItemLabel } from '@/navigation-menu-item/utils/getNavi
import { getNavigationMenuItemObjectNameSingular } from '@/navigation-menu-item/utils/getNavigationMenuItemObjectNameSingular';
import { getNavigationMenuItemSecondaryLabel } from '@/navigation-menu-item/utils/getNavigationMenuItemSecondaryLabel';
import { isLocationMatchingNavigationMenuItem } from '@/navigation-menu-item/utils/isLocationMatchingNavigationMenuItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { DraggableItem } from '@/ui/layout/draggable-list/components/DraggableItem';
import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown';
import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState';
@@ -69,7 +69,7 @@ export const CurrentWorkspaceMemberNavigationMenuItems = ({
isWorkspaceFolder = false,
}: CurrentWorkspaceMemberNavigationMenuItemsProps) => {
const { t } = useLingui();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const views = useAtomStateValue(viewsSelector);
const location = useLocation();
const navigate = useNavigate();
@@ -19,7 +19,7 @@ import { getNavigationMenuItemLabel } from '@/navigation-menu-item/utils/getNavi
import { getNavigationMenuItemObjectNameSingular } from '@/navigation-menu-item/utils/getNavigationMenuItemObjectNameSingular';
import { getNavigationMenuItemSecondaryLabel } from '@/navigation-menu-item/utils/getNavigationMenuItemSecondaryLabel';
import { isLocationMatchingNavigationMenuItem } from '@/navigation-menu-item/utils/isLocationMatchingNavigationMenuItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { DraggableItem } from '@/ui/layout/draggable-list/components/DraggableItem';
@@ -34,7 +34,7 @@ const StyledOrphanNavigationMenuItemsContainer = styled.div`
`;
export const CurrentWorkspaceMemberOrphanNavigationMenuItems = () => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const views = useAtomStateValue(viewsSelector);
const { navigationMenuItemsSorted } = useSortedNavigationMenuItems();
const { deleteNavigationMenuItem } = useDeleteNavigationMenuItem();
@@ -10,7 +10,7 @@ import { getNavigationMenuItemComputedLink } from '@/navigation-menu-item/utils/
import { getNavigationMenuItemLabel } from '@/navigation-menu-item/utils/getNavigationMenuItemLabel';
import { getNavigationMenuItemObjectNameSingular } from '@/navigation-menu-item/utils/getNavigationMenuItemObjectNameSingular';
import { getNavigationMenuItemSecondaryLabel } from '@/navigation-menu-item/utils/getNavigationMenuItemSecondaryLabel';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { DraggableItem } from '@/ui/layout/draggable-list/components/DraggableItem';
import { NavigationDrawerItem } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerItem';
@@ -27,7 +27,7 @@ export const NavigationMenuItemFolderContent = ({
folderId,
navigationMenuItems,
}: NavigationMenuItemFolderContentProps) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const views = useAtomStateValue(viewsSelector);
const { deleteNavigationMenuItem } = useDeleteNavigationMenuItem();
@@ -16,7 +16,7 @@ import { getNavigationMenuItemLabel } from '@/navigation-menu-item/utils/getNavi
import { getNavigationMenuItemObjectNameSingular } from '@/navigation-menu-item/utils/getNavigationMenuItemObjectNameSingular';
import { recordIdentifierToObjectRecordIdentifier } from '@/navigation-menu-item/utils/recordIdentifierToObjectRecordIdentifier';
import { useGetStandardObjectIcon } from '@/object-metadata/hooks/useGetStandardObjectIcon';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { ViewKey } from '@/views/types/ViewKey';
@@ -27,7 +27,7 @@ export const NavigationMenuItemIcon = ({
navigationMenuItem: NavigationMenuItem;
}) => {
const { getIcon } = useIcons();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const views = useAtomStateValue(viewsSelector);
const objectNameSingular =
@@ -12,7 +12,7 @@ import { NavigationMenuItemIcon } from '@/navigation-menu-item/components/Naviga
import { getNavigationMenuItemLabel } from '@/navigation-menu-item/utils/getNavigationMenuItemLabel';
import { getNavigationMenuItemObjectNameSingular } from '@/navigation-menu-item/utils/getNavigationMenuItemObjectNameSingular';
import { getNavigationMenuItemSecondaryLabel } from '@/navigation-menu-item/utils/getNavigationMenuItemSecondaryLabel';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { NavigationDrawerSubItem } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSubItem';
import { getNavigationSubItemLeftAdornment } from '@/ui/navigation/navigation-drawer/utils/getNavigationSubItemLeftAdornment';
@@ -37,7 +37,7 @@ export const WorkspaceNavigationMenuItemFolderDragClone = ({
selectedNavigationMenuItemIndex,
}: WorkspaceNavigationMenuItemFolderDragCloneProps) => {
const { theme } = useContext(ThemeContext);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const views = useAtomStateValue(viewsSelector);
const navigationMenuItem = navigationMenuItems[rubric.source.index];
@@ -10,7 +10,7 @@ import { getNavigationMenuItemLabel } from '@/navigation-menu-item/utils/getNavi
import { getNavigationMenuItemObjectNameSingular } from '@/navigation-menu-item/utils/getNavigationMenuItemObjectNameSingular';
import { getNavigationMenuItemSecondaryLabel } from '@/navigation-menu-item/utils/getNavigationMenuItemSecondaryLabel';
import { getObjectMetadataForNavigationMenuItem } from '@/navigation-menu-item/utils/getObjectMetadataForNavigationMenuItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { NavigationDrawerSubItem } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSubItem';
import { getNavigationSubItemLeftAdornment } from '@/ui/navigation/navigation-drawer/utils/getNavigationSubItemLeftAdornment';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -39,7 +39,7 @@ export const WorkspaceNavigationMenuItemFolderSubItem = ({
const isNavigationMenuInEditMode = useAtomStateValue(
isNavigationMenuInEditModeState,
);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const views = useAtomStateValue(viewsSelector);
const objectMetadataItem =
@@ -29,7 +29,7 @@ import { getNavigationMenuItemComputedLink } from '@/navigation-menu-item/utils/
import { getNavigationMenuItemLabel } from '@/navigation-menu-item/utils/getNavigationMenuItemLabel';
import { preloadWorkspaceDndKit } from '@/navigation/preloadWorkspaceDndKit';
import { NavigationDrawerSectionForWorkspaceItems } from '@/object-metadata/components/NavigationDrawerSectionForWorkspaceItems';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { navigationMenuItemsSelector } from '@/navigation-menu-item/states/navigationMenuItemsSelector';
import { useNavigateSidePanel } from '@/side-panel/hooks/useNavigateSidePanel';
@@ -48,7 +48,7 @@ const StyledRightIconsContainer = styled.div`
export const WorkspaceNavigationMenuItems = () => {
const items = useWorkspaceSectionItems();
const { workspaceNavigationMenuItemsSorted } = useSortedNavigationMenuItems();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const views = useAtomStateValue(viewsSelector);
const store = useStore();
const enterEditMode = () => {
@@ -4,7 +4,7 @@ import { isDefined } from 'twenty-shared/utils';
import type { NavigationMenuItem } from '~/generated-metadata/graphql';
import { navigationMenuItemsDraftState } from '@/navigation-menu-item/states/navigationMenuItemsDraftState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { computeInsertIndexAndPosition } from '@/navigation-menu-item/utils/computeInsertIndexAndPosition';
@@ -24,7 +24,7 @@ export const useAddRecordToNavigationMenuDraft = () => {
const setNavigationMenuItemsDraft = useSetAtomState(
navigationMenuItemsDraftState,
);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const addRecordToDraft = (
searchRecord: SearchRecordWithOptionalMetadataId,
@@ -4,14 +4,14 @@ import { useMutation } from '@apollo/client/react';
import { CreateNavigationMenuItemDocument } from '~/generated-metadata/graphql';
import { useNavigationMenuItemsData } from '@/navigation-menu-item/hooks/useNavigationMenuItemsData';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { type ObjectRecord } from '@/object-record/types/ObjectRecord';
export const useCreateNavigationMenuItem = () => {
const { navigationMenuItems, currentWorkspaceMemberId } =
useNavigationMenuItemsData();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const [createNavigationMenuItemMutation] = useMutation(
CreateNavigationMenuItemDocument,
@@ -3,7 +3,7 @@ import { type NavigationMenuItem } from '~/generated-metadata/graphql';
import { filterAndSortNavigationMenuItems } from '@/navigation-menu-item/utils/filterAndSortNavigationMenuItems';
import { isNavigationMenuItemFolder } from '@/navigation-menu-item/utils/isNavigationMenuItemFolder';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -24,7 +24,7 @@ type NavigationMenuItemFolderEntry = Pick<
export const useNavigationMenuItemsByFolder = () => {
const views = useAtomStateValue(viewsSelector);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { navigationMenuItems, workspaceNavigationMenuItems } =
useNavigationMenuItemsData();
@@ -15,7 +15,7 @@ import { isNavigationMenuItemLink } from '@/navigation-menu-item/utils/isNavigat
import { orderFoldersForCreation } from '@/navigation-menu-item/utils/orderFoldersForCreation';
import { navigationMenuItemsSelector } from '@/navigation-menu-item/states/navigationMenuItemsSelector';
import { useUpdateOneObjectMetadataItem } from '@/object-metadata/hooks/useUpdateOneObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useStore } from 'jotai';
export const useSaveNavigationMenuItemsDraft = () => {
@@ -37,7 +37,7 @@ export const useSaveNavigationMenuItemsDraft = () => {
if (!draft) return;
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
for (const draftItem of draft) {
if (draftItem.type !== NavigationMenuItemType.OBJECT) {
@@ -4,7 +4,7 @@ import { type NavigationMenuItem } from '~/generated-metadata/graphql';
import { getNavigationMenuItemLabel } from '@/navigation-menu-item/utils/getNavigationMenuItemLabel';
import { useSelectedNavigationMenuItemEditItem } from '@/navigation-menu-item/hooks/useSelectedNavigationMenuItemEditItem';
import { useSelectedNavigationMenuItemEditItemObjectMetadata } from '@/navigation-menu-item/hooks/useSelectedNavigationMenuItemEditItemObjectMetadata';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -35,7 +35,7 @@ export const useSelectedNavigationMenuItemEditItemLabel = () => {
const { selectedItem } = useSelectedNavigationMenuItemEditItem();
const { selectedItemObjectMetadata } =
useSelectedNavigationMenuItemEditItemObjectMetadata();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const views = useAtomStateValue(viewsSelector);
const selectedItemLabel = selectedItem
@@ -1,7 +1,7 @@
import { useMemo } from 'react';
import { filterAndSortNavigationMenuItems } from '@/navigation-menu-item/utils/filterAndSortNavigationMenuItems';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -11,7 +11,7 @@ export const useSortedNavigationMenuItems = () => {
const { navigationMenuItems, workspaceNavigationMenuItems } =
useNavigationMenuItemsData();
const views = useAtomStateValue(viewsSelector);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const navigationMenuItemsSorted = useMemo(() => {
return filterAndSortNavigationMenuItems(
@@ -8,7 +8,7 @@ import { type NavigationMenuItem } from '~/generated-metadata/graphql';
import { openNavigationMenuItemFolderIdsState } from '@/navigation-menu-item/states/openNavigationMenuItemFolderIdsState';
import { getNavigationMenuItemComputedLink } from '@/navigation-menu-item/utils/getNavigationMenuItemComputedLink';
import { isLocationMatchingNavigationMenuItem } from '@/navigation-menu-item/utils/isLocationMatchingNavigationMenuItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { currentNavigationMenuItemFolderIdState } from '@/ui/navigation/navigation-drawer/states/currentNavigationMenuItemFolderIdState';
import { useAtomState } from '@/ui/utilities/state/jotai/hooks/useAtomState';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -29,7 +29,7 @@ export const useWorkspaceFolderOpenState = ({
const currentPath = location.pathname;
const currentViewPath = location.pathname + location.search;
const isMobile = useIsMobile();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const views = useAtomStateValue(viewsSelector);
const [openNavigationMenuItemFolderIds, setOpenNavigationMenuItemFolderIds] =
@@ -5,7 +5,7 @@ import { NavigationMenuItemType } from 'twenty-shared/types';
import { getObjectMetadataForNavigationMenuItem } from '@/navigation-menu-item/utils/getObjectMetadataForNavigationMenuItem';
import { isNavigationMenuItemFolder } from '@/navigation-menu-item/utils/isNavigationMenuItemFolder';
import { getObjectPermissionsForObject } from '@/object-metadata/utils/getObjectPermissionsForObject';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -27,7 +27,7 @@ export const useWorkspaceSectionItems = (): NavigationMenuItem[] => {
const { workspaceNavigationMenuItemsByFolder } =
useNavigationMenuItemsByFolder();
const views = useAtomStateValue(viewsSelector);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const flatWorkspaceItems = workspaceNavigationMenuItems
@@ -1,5 +1,5 @@
import { lastVisitedObjectMetadataItemIdState } from '@/navigation/states/lastVisitedObjectMetadataItemIdState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useCallback } from 'react';
import { isDefined } from 'twenty-shared/utils';
import { useStore } from 'jotai';
@@ -8,7 +8,7 @@ export const useSetLastVisitedObjectMetadataId = () => {
const store = useStore();
const setLastVisitedObjectMetadataId = useCallback(
({ objectMetadataItemId }: { objectMetadataItemId: string }) => {
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
const objectMetadataItem = objectMetadataItems.find(
(item) => item.id === objectMetadataItemId,
@@ -1,5 +1,5 @@
import { lastVisitedViewPerObjectMetadataItemState } from '@/navigation/states/lastVisitedViewPerObjectMetadataItemState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
import { type ViewWithRelations } from '@/views/types/ViewWithRelations';
import { useCallback } from 'react';
@@ -20,7 +20,7 @@ export const useSetLastVisitedViewForObjectMetadataNamePlural = () => {
const view = views.find((view: ViewWithRelations) => view.id === viewId);
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
const objectMetadataItem = objectMetadataItems.find(
(item) => item.namePlural === objectNamePlural,
@@ -5,7 +5,7 @@ import { getNavigationMenuItemComputedLink } from '@/navigation-menu-item/utils/
import { getNavigationMenuItemLabel } from '@/navigation-menu-item/utils/getNavigationMenuItemLabel';
import { recordIdentifierToObjectRecordIdentifier } from '@/navigation-menu-item/utils/recordIdentifierToObjectRecordIdentifier';
import { lastVisitedViewPerObjectMetadataItemState } from '@/navigation/states/lastVisitedViewPerObjectMetadataItemState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { NavigationDrawerItem } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerItem';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -44,7 +44,7 @@ export const NavigationDrawerItemForObjectMetadataItem = ({
const lastVisitedViewPerObjectMetadataItem = useAtomStateValue(
lastVisitedViewPerObjectMetadataItemState,
);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const views = useAtomStateValue(viewsSelector);
const lastVisitedViewId =
@@ -2,7 +2,7 @@ import { NavigationMenuItemIcon } from '@/navigation-menu-item/components/Naviga
import { isNavigationMenuInEditModeState } from '@/navigation-menu-item/states/isNavigationMenuInEditModeState';
import { getNavigationMenuItemComputedLink } from '@/navigation-menu-item/utils/getNavigationMenuItemComputedLink';
import { getNavigationMenuItemLabel } from '@/navigation-menu-item/utils/getNavigationMenuItemLabel';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import type { WorkspaceSectionItemContentProps } from '@/object-metadata/components/WorkspaceSectionItemContentProps';
import { NavigationDrawerItem } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerItem';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -21,7 +21,7 @@ export const NavigationDrawerSectionForWorkspaceItemLinkContent = ({
const isNavigationMenuInEditMode = useAtomStateValue(
isNavigationMenuInEditModeState,
);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const views = useAtomStateValue(viewsSelector);
const label = getNavigationMenuItemLabel(item, objectMetadataItems, views);
@@ -1,7 +1,7 @@
import { getObjectMetadataForNavigationMenuItem } from '@/navigation-menu-item/utils/getObjectMetadataForNavigationMenuItem';
import { NavigationDrawerItemForObjectMetadataItem } from '@/object-metadata/components/NavigationDrawerItemForObjectMetadataItem';
import type { WorkspaceSectionItemContentProps } from '@/object-metadata/components/WorkspaceSectionItemContentProps';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { viewsSelector } from '@/views/states/selectors/viewsSelector';
@@ -14,7 +14,7 @@ export const NavigationDrawerSectionForWorkspaceItemObjectContent = ({
isDragging,
onActiveObjectMetadataItemClick,
}: NavigationDrawerSectionForWorkspaceItemObjectContentProps) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const views = useAtomStateValue(viewsSelector);
const objectMetadataItem = getObjectMetadataForNavigationMenuItem(
item,
@@ -12,7 +12,7 @@ import { getObjectMetadataForNavigationMenuItem } from '@/navigation-menu-item/u
import type { EditModeProps } from '@/object-metadata/components/EditModeProps';
import { NavigationDrawerSectionForWorkspaceItemsListReadOnly } from '@/object-metadata/components/NavigationDrawerSectionForWorkspaceItemsListReadOnly';
import { WorkspaceSectionListEditModeFallback } from '@/object-metadata/components/WorkspaceSectionListEditModeFallback';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { getObjectPermissionsForObject } from '@/object-metadata/utils/getObjectPermissionsForObject';
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
@@ -63,7 +63,7 @@ export const NavigationDrawerSectionForWorkspaceItems = ({
const views = useAtomStateValue(viewsSelector);
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { addToNavigationFallbackDestination } = useContext(
NavigationDropTargetContext,
);
@@ -3,13 +3,13 @@ import React, { useMemo } from 'react';
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { PreComputedChipGeneratorsContext } from '@/object-metadata/contexts/PreComputedChipGeneratorsContext';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { getRecordChipGenerators } from '@/object-record/utils/getRecordChipGenerators';
export const PreComputedChipGeneratorsProvider = ({
children,
}: React.PropsWithChildren) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const allowRequestsToTwentyIcons = useAtomStateValue(
allowRequestsToTwentyIconsState,
);
@@ -1,9 +1,9 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { getFieldMetadataItemById } from '@/object-metadata/utils/getFieldMetadataItemById';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
export const useFieldMetadataItemById = (fieldMetadataId: string) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
return getFieldMetadataItemById({
fieldMetadataId,
@@ -1,9 +1,9 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { getFieldMetadataItemByIdOrThrow } from '@/object-metadata/utils/getFieldMetadataItemByIdOrThrow';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
export const useFieldMetadataItemByIdOrThrow = (fieldMetadataId: string) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
return getFieldMetadataItemByIdOrThrow({
fieldMetadataId,
@@ -1,6 +1,6 @@
import { useCallback } from 'react';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { getFieldMetadataItemByIdOrThrow } from '@/object-metadata/utils/getFieldMetadataItemByIdOrThrow';
@@ -15,7 +15,7 @@ export const useGetFieldMetadataItemByIdOrThrow = () => {
const store = useStore();
const getFieldMetadataItemByIdOrThrowCallback = useCallback(
(fieldMetadataId: string): GetFieldMetadataItemByIdOrThrowResult => {
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
return getFieldMetadataItemByIdOrThrow({
fieldMetadataId,
@@ -1,9 +1,9 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { CustomError, isDefined } from 'twenty-shared/utils';
export const useGetObjectMetadataItemById = () => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const getObjectMetadataItemById = (objectId: string) => {
const objectMetadataItem = objectMetadataItems.find(
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { getObjectRecordIdentifier } from '@/object-metadata/utils/getObjectRecordIdentifier';
import { type ObjectRecordIdentifier } from '@/object-record/types/ObjectRecordIdentifier';
@@ -6,7 +6,7 @@ import { type ObjectRecordIdentifier } from '@/object-record/types/ObjectRecordI
export const useGetObjectRecordIdentifierByNameSingular = (
allowRequestsToTwentyIcons: boolean,
) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
return (record: any, objectNameSingular: string): ObjectRecordIdentifier => {
const objectMetadataItem = objectMetadataItems.find(
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { CustomError, isDefined } from 'twenty-shared/utils';
@@ -7,7 +7,7 @@ export const useObjectMetadataItemById = ({
}: {
objectId: string;
}) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const objectMetadataItem = objectMetadataItems.find(
(objectMetadataItem) => objectMetadataItem.id === objectId,
@@ -2,9 +2,9 @@ import { objectMetadataItemsWithFieldsSelector } from '@/object-metadata/states/
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { createAtomSelector } from '@/ui/utilities/state/jotai/utils/createAtomSelector';
export const objectMetadataItemsState = createAtomSelector<
export const objectMetadataItemsSelector = createAtomSelector<
ObjectMetadataItem[]
>({
key: 'objectMetadataItemsState',
key: 'objectMetadataItemsSelector',
get: ({ get }) => get(objectMetadataItemsWithFieldsSelector),
});
@@ -1,5 +1,5 @@
import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { getRecordConnectionFromRecords } from '@/object-record/cache/utils/getRecordConnectionFromRecords';
@@ -15,7 +15,7 @@ export const useUpsertFindManyRecordsQueryInCache = ({
}) => {
const apolloCoreClient = useApolloCoreClient();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const upsertFindManyRecordsQueryInCache = <
@@ -1,7 +1,7 @@
import gql from 'graphql-tag';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { EMPTY_MUTATION } from '@/object-record/constants/EmptyMutation';
@@ -24,7 +24,7 @@ export const useCreateManyRecordsMutation = ({
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
if (isUndefinedOrNull(objectMetadataItem)) {
return { createManyRecordsMutation: EMPTY_MUTATION };
@@ -1,5 +1,5 @@
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { generateCreateOneRecordMutation } from '@/object-metadata/utils/generateCreateOneRecordMutation';
import { EMPTY_MUTATION } from '@/object-record/constants/EmptyMutation';
@@ -18,7 +18,7 @@ export const useCreateOneRecordMutation = ({
objectNameSingular,
});
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
@@ -2,7 +2,7 @@ import gql from 'graphql-tag';
import { useMemo } from 'react';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { isAggregationEnabled } from '@/object-metadata/utils/isAggregationEnabled';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
@@ -21,7 +21,7 @@ export const useFindDuplicateRecordsQuery = ({
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const findDuplicateRecordsQuery = useMemo(
() => gql`
@@ -1,7 +1,7 @@
import { useMemo } from 'react';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
import { generateFindManyRecordsQuery } from '@/object-record/utils/generateFindManyRecordsQuery';
@@ -25,7 +25,7 @@ export const useFindManyRecordsQuery = ({
objectNameSingular,
});
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
@@ -2,7 +2,7 @@ import gql from 'graphql-tag';
import { useMemo } from 'react';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { type RecordGqlOperationGqlRecordFields } from 'twenty-shared/types';
@@ -22,7 +22,7 @@ export const useFindOneRecordQuery = ({
objectNameSingular,
});
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
@@ -1,7 +1,7 @@
import { useMemo } from 'react';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { type RecordGqlOperationGqlRecordFields } from 'twenty-shared/types';
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
@@ -20,7 +20,7 @@ export const useGroupByRecordsQuery = ({
objectNameSingular,
});
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
@@ -1,7 +1,7 @@
import gql from 'graphql-tag';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { EMPTY_MUTATION } from '@/object-record/constants/EmptyMutation';
@@ -30,7 +30,7 @@ export const useMergeManyRecordsMutation = ({
const appliedRecordGqlFields = recordGqlFields ?? depthOneRecordGqlFields;
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
@@ -2,7 +2,7 @@ import { gql } from '@apollo/client';
import { isNonEmptyArray, isUndefined } from '@sniptt/guards';
import { useMemo } from 'react';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { getObjectPermissionsForObject } from '@/object-metadata/utils/getObjectPermissionsForObject';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
@@ -18,7 +18,7 @@ export const useGenerateCombinedFindManyRecordsQuery = ({
}: {
operationSignatures: RecordGqlOperationSignature[];
}) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
return useMemo(() => {
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
@@ -16,7 +16,7 @@ export const fieldMetadataItemUsedInDropdownComponentSelector =
componentStateKey,
);
const objectMetadataItems = get(objectMetadataItemsState);
const objectMetadataItems = get(objectMetadataItemsSelector);
const correspondingFieldMetadataItem = objectMetadataItems
.flatMap((objectMetadataItem) => objectMetadataItem.fields)
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { hasObjectMetadataItemPositionField } from '@/object-metadata/utils/hasObjectMetadataItemPositionField';
import { RecordCalendarComponentInstanceContext } from '@/object-record/record-calendar/states/contexts/RecordCalendarComponentInstanceContext';
@@ -26,7 +26,7 @@ export const calendarDayRecordIdsComponentFamilySelector =
recordIndexCalendarFieldMetadataIdState,
);
const objectMetadataItems = get(objectMetadataItemsState);
const objectMetadataItems = get(objectMetadataItemsSelector);
const objectMetadataItem = objectMetadataItems.find(
(objectMetadataItem) =>
objectMetadataItem.fields.some(
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { isActiveFieldMetadataItem } from '@/object-metadata/utils/isActiveFieldMetadataItem';
import { RecordFieldsComponentInstanceContext } from '@/object-record/record-field/states/context/RecordFieldsComponentInstanceContext';
@@ -21,7 +21,7 @@ export const visibleRecordFieldsComponentSelector = createAtomComponentSelector<
componentStateKey,
);
const objectMetadataItems = get(objectMetadataItemsState);
const objectMetadataItems = get(objectMetadataItemsSelector);
return filterVisibleAndReadableRecordFields(
currentRecordFields,
@@ -1,7 +1,7 @@
import { useCallback, useContext } from 'react';
import { useStore } from 'jotai';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
import { generateEmptyFieldValue } from '@/object-record/utils/generateEmptyFieldValue';
@@ -20,7 +20,7 @@ export const useClearField = () => {
const [updateRecord] = useUpdateRecord();
const clearField = useCallback(() => {
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
const foundObjectMetadataItem = objectMetadataItems.find(
(item) =>
@@ -5,7 +5,7 @@ import { type Task } from '@/activities/types/Task';
import { type TaskTarget } from '@/activities/types/TaskTarget';
import { getActivityTargetObjectRecords } from '@/activities/utils/getActivityTargetObjectRecords';
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
import { useOpenJunctionRelationFieldInput } from '@/object-record/record-field/ui/hooks/useOpenJunctionRelationFieldInput';
import { useOpenFilesFieldInput } from '@/object-record/record-field/ui/meta-types/input/hooks/useOpenFilesFieldInput';
@@ -71,7 +71,7 @@ export const useOpenFieldInputEditMode = () => {
recordId: string;
prefix?: string;
}) => {
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
const currentWorkspace = store.get(currentWorkspaceState.atom);
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type FieldDefinition } from '@/object-record/record-field/ui/types/FieldDefinition';
import {
type FieldRelationFromManyValue,
@@ -37,7 +37,7 @@ export const useOpenJunctionRelationFieldInput = () => {
recordId: string;
prefix?: string;
}) => {
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
const sourceObjectMetadataId = objectMetadataItems.find(
(item) =>
@@ -1,6 +1,6 @@
import { useStore } from 'jotai';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type FieldDefinition } from '@/object-record/record-field/ui/types/FieldDefinition';
import { type FieldMorphRelationMetadata } from '@/object-record/record-field/ui/types/FieldMetadata';
@@ -55,7 +55,7 @@ export const useOpenMorphRelationOneToManyFieldInput = () => {
),
);
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
const objectMetadataItemArray = objectMetadataItems.filter(
(objectMetadataItem) =>
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import {
type FieldRelationFromManyValue,
type FieldRelationValue,
@@ -47,7 +47,7 @@ export const useOpenRelationFromManyFieldInput = () => {
recordStoreFamilySelector.selectorFamily({ recordId, fieldName }),
) as FieldRelationValue<FieldRelationFromManyValue>) ?? [];
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
const objectMetadataItem = objectMetadataItems.find(
(objectMetadataItem) =>
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { RecordFiltersComponentInstanceContext } from '@/object-record/record-filter/states/context/RecordFiltersComponentInstanceContext';
import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState';
import { type RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
@@ -12,7 +12,7 @@ export const hasAnySoftDeleteFilterOnViewComponentSelector =
get:
(componentStateKey) =>
({ get }) => {
const objectMetadataItems = get(objectMetadataItemsState);
const objectMetadataItems = get(objectMetadataItemsSelector);
const currentRecordFilters = get(
currentRecordFiltersComponentState,
componentStateKey,
@@ -1,6 +1,6 @@
import { useStore } from 'jotai';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { recordGroupDefinitionFamilyState } from '@/object-record/record-group/states/recordGroupDefinitionFamilyState';
import { recordGroupIdsComponentState } from '@/object-record/record-group/states/recordGroupIdsComponentState';
@@ -28,7 +28,7 @@ export const useSetRecordGroups = () => {
recordIndexId: string;
objectMetadataItemId: string;
}) => {
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
const objectMetadataItem = objectMetadataItems.find(
(objectMetadataItem) => objectMetadataItem.id === objectMetadataItemId,
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { getObjectRecordIdentifier } from '@/object-metadata/utils/getObjectRecordIdentifier';
import { type ObjectRecordIdentifier } from '@/object-record/types/ObjectRecordIdentifier';
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
@@ -26,7 +26,7 @@ export const recordStoreIdentifierFamilySelector = createAtomFamilySelector<
recordFromStore?.__typename ?? '',
);
const objectMetadataItems = get(objectMetadataItemsState);
const objectMetadataItems = get(objectMetadataItemsSelector);
const objectMetadataItem = objectMetadataItems.find(
(item) => item.nameSingular === objectNameSingular,
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { getObjectRecordIdentifier } from '@/object-metadata/utils/getObjectRecordIdentifier';
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
import { type ObjectRecordIdentifier } from '@/object-record/types/ObjectRecordIdentifier';
@@ -16,7 +16,7 @@ export const recordStoreIdentifiersFamilySelector = createAtomFamilySelector<
get:
({ recordIds, allowRequestsToTwentyIcons }) =>
({ get }) => {
const objectMetadataItems = get(objectMetadataItemsState);
const objectMetadataItems = get(objectMetadataItemsSelector);
return recordIds
.map((recordId) => {
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { isCompositeFieldType } from '@/object-record/object-filter-dropdown/utils/isCompositeFieldType';
@@ -25,7 +25,7 @@ import { FieldMetadataType, RelationType } from '~/generated-metadata/graphql';
export const useBuildSpreadsheetImportFields = () => {
const { getIcon } = useIcons();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const buildSpreadsheetImportFields = (
fieldMetadataItems: FieldMetadataItem[],
@@ -4,7 +4,7 @@ import { type NoteTarget } from '@/activities/types/NoteTarget';
import { type Task } from '@/activities/types/Task';
import { type TaskTarget } from '@/activities/types/TaskTarget';
import { getActivityTargetObjectRecords } from '@/activities/utils/getActivityTargetObjectRecords';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useOpenMorphRelationManyToOneFieldInput } from '@/object-record/record-field/ui/meta-types/input/hooks/useOpenMorphRelationManyToOneFieldInput';
import { useOpenMorphRelationOneToManyFieldInput } from '@/object-record/record-field/ui/meta-types/input/hooks/useOpenMorphRelationOneToManyFieldInput';
import { useOpenRelationFromManyFieldInput } from '@/object-record/record-field/ui/meta-types/input/hooks/useOpenRelationFromManyFieldInput';
@@ -75,7 +75,7 @@ export const useOpenFieldWidgetFieldInputEditMode = () => {
const activity = store.get(recordStoreFamilyState.atomFamily(recordId));
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
const activityTargetObjectRecords = getActivityTargetObjectRecords({
activityRecord: activity as Task | Note,
@@ -1,41 +0,0 @@
import { styled } from '@linaria/react';
import { type ReactNode } from 'react';
import { Card, CardContent } from 'twenty-ui/layout';
import { themeCssVariables } from 'twenty-ui/theme-constants';
type SettingsSummaryCardProps = {
title: ReactNode;
rightComponent: ReactNode;
};
const StyledCardContentContainer = styled.div`
> * {
align-items: center;
display: flex;
gap: ${themeCssVariables.spacing[2]};
min-height: ${themeCssVariables.spacing[6]};
padding: ${themeCssVariables.spacing[2]};
}
`;
const StyledTitle = styled.div`
color: ${themeCssVariables.font.color.primary};
display: flex;
font-weight: ${themeCssVariables.font.weight.medium};
gap: ${themeCssVariables.spacing[2]};
margin-right: auto;
`;
export const SettingsSummaryCard = ({
title,
rightComponent,
}: SettingsSummaryCardProps) => (
<Card>
<StyledCardContentContainer>
<CardContent>
<StyledTitle>{title}</StyledTitle>
{rightComponent}
</CardContent>
</StyledCardContentContainer>
</Card>
);
@@ -1,7 +1,7 @@
import { isDefined } from 'twenty-shared/utils';
import { styled } from '@linaria/react';
import { Handle, Position } from '@xyflow/react';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { useIcons } from 'twenty-ui/display';
@@ -28,7 +28,7 @@ const StyledFieldName = styled.div`
export const ObjectFieldRow = ({ field }: ObjectFieldRowProps) => {
const { theme } = useContext(ThemeContext);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { getIcon } = useIcons();
const relatedObjectId = field.relation?.targetObjectMetadata.id;
@@ -4,7 +4,7 @@ import { SIDE_PANEL_COMPONENT_INSTANCE_ID } from '@/side-panel/constants/SidePan
import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState';
import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState';
import { ContextStoreComponentInstanceContext } from '@/context-store/states/contexts/ContextStoreComponentInstanceContext';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { RecordComponentInstanceContextsWrapper } from '@/object-record/components/RecordComponentInstanceContextsWrapper';
import { getRecordIndexIdFromObjectNamePluralAndViewId } from '@/object-record/utils/getRecordIndexIdFromObjectNamePluralAndViewId';
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
@@ -34,7 +34,7 @@ export const SidePanelContainer = ({ children }: SidePanelContainerProps) => {
);
const isMobile = useIsMobile();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const objectMetadataItem = objectMetadataItems.find(
(objectMetadataItem) =>
@@ -24,7 +24,7 @@ export const useOpenCalendarEventInSidePanel = () => {
// TODO: Uncomment this once we need to calendar event title in the navigation
// const objectMetadataItem = snapshot
// .getLoadable(objectMetadataItemsState)
// .getLoadable(objectMetadataItemsSelector)
// .getValue()
// .find(
// ({ nameSingular }) =>
@@ -24,7 +24,7 @@ export const useOpenEmailThreadInSidePanel = () => {
// TODO: Uncomment this once we need to show the thread title in the navigation
// const objectMetadataItem = snapshot
// .getLoadable(objectMetadataItemsState)
// .getLoadable(objectMetadataItemsSelector)
// .getValue()
// .find(
// ({ nameSingular }) =>
@@ -4,7 +4,7 @@ import { useSidePanelHistory } from '@/side-panel/hooks/useSidePanelHistory';
import { sidePanelNavigationMorphItemsByPageState } from '@/side-panel/states/sidePanelNavigationMorphItemsByPageState';
import { sidePanelNavigationStackState } from '@/side-panel/states/sidePanelNavigationStackState';
import { allowRequestsToTwentyIconsState } from '@/client-config/states/allowRequestsToTwentyIcons';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { recordStoreIdentifiersFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreIdentifiersSelector';
import { recordStoreRecordsSelector } from '@/object-record/record-store/states/selectors/recordStoreRecordsSelector';
import { useAtomFamilySelectorValue } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorValue';
@@ -25,7 +25,7 @@ export const useSidePanelContextChips = () => {
allowRequestsToTwentyIconsState,
);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { navigateSidePanelHistory } = useSidePanelHistory();
@@ -3,7 +3,7 @@ import { navigationMenuItemsSelector } from '@/navigation-menu-item/states/navig
import { getEffectiveNavigationMenuItemColor } from '@/navigation-menu-item/utils/getEffectiveNavigationMenuItemColor';
import { getNavigationMenuItemObjectNameSingular } from '@/navigation-menu-item/utils/getNavigationMenuItemObjectNameSingular';
import { parseThemeColor } from '@/navigation-menu-item/utils/parseThemeColor';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { SidePanelGroup } from '@/side-panel/components/SidePanelGroup';
import { SidePanelList } from '@/side-panel/components/SidePanelList';
import { SidePanelEditColorOption } from '@/side-panel/pages/navigation-menu-item/components/SidePanelEditColorOption';
@@ -39,7 +39,7 @@ export const SidePanelEditObjectViewBase = ({
}: SidePanelEditObjectViewBaseProps) => {
const { t } = useLingui();
const selectableItemIds = getOrganizeActionsSelectableItemIds(true);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const views = useAtomStateValue(viewsSelector);
const objectNameSingular = isDefined(selectedItem)
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { pageLayoutDraftComponentState } from '@/page-layout/states/pageLayoutDraftComponentState';
import { pageLayoutEditingWidgetIdComponentState } from '@/page-layout/states/pageLayoutEditingWidgetIdComponentState';
import { ChartFiltersSettings } from '@/side-panel/pages/page-layout/components/ChartFiltersSettings';
@@ -25,7 +25,7 @@ export const SidePanelChartFilterSubPage = () => {
.flatMap((tab) => tab.widgets)
.find((widget) => widget.id === pageLayoutEditingWidgetId);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
if (
!isDefined(widgetInEditMode) ||
@@ -6,7 +6,7 @@ import { getChartAxisNameDisplayOptions } from '@/side-panel/pages/page-layout/u
import { getChartFilterRulesCount } from '@/side-panel/pages/page-layout/utils/getChartFilterRulesCount';
import { getDateGranularityLabel } from '@/side-panel/pages/page-layout/utils/getDateGranularityLabel';
import { getFieldLabelWithSubField } from '@/side-panel/pages/page-layout/utils/getFieldLabelWithSubField';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { getAggregateOperationLabel } from '@/object-record/record-board/record-board-column/utils/getAggregateOperationLabel';
import { convertAggregateOperationToExtendedAggregateOperation } from '@/object-record/utils/convertAggregateOperationToExtendedAggregateOperation';
import { plural, t } from '@lingui/core/macro';
@@ -22,7 +22,7 @@ export const useChartSettingsValues = ({
objectMetadataId: string;
configuration?: ChartConfiguration;
}) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const objectMetadataItem = objectMetadataItems.find(
(objectMetadataItem) => objectMetadataItem.id === objectMetadataId,
@@ -1,6 +1,6 @@
import { getFieldLabelWithSubField } from '@/side-panel/pages/page-layout/utils/getFieldLabelWithSubField';
import { getSortLabelSuffixForFieldType } from '@/side-panel/pages/page-layout/utils/getSortLabelSuffixForFieldType';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { t } from '@lingui/core/macro';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { type CompositeFieldSubFieldName } from 'twenty-shared/types';
@@ -12,7 +12,7 @@ export const useGraphGroupBySortOptionLabels = ({
}: {
objectMetadataId: string;
}) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const objectMetadataItem = objectMetadataItems.find(
(objectMetadataItem) => objectMetadataItem.id === objectMetadataId,
@@ -1,6 +1,6 @@
import { getFieldLabelWithSubField } from '@/side-panel/pages/page-layout/utils/getFieldLabelWithSubField';
import { getSortLabelSuffixForFieldType } from '@/side-panel/pages/page-layout/utils/getSortLabelSuffixForFieldType';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { getAggregateOperationLabel } from '@/object-record/record-board/record-board-column/utils/getAggregateOperationLabel';
import { type ExtendedAggregateOperations } from '@/object-record/record-table/types/ExtendedAggregateOperations';
import { t } from '@lingui/core/macro';
@@ -14,7 +14,7 @@ export const useGraphXSortOptionLabels = ({
}: {
objectMetadataId: string;
}) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const objectMetadataItem = objectMetadataItems.find(
(objectMetadataItem) => objectMetadataItem.id === objectMetadataId,
@@ -5,7 +5,7 @@ import { SIDE_PANEL_RESET_CONTEXT_TO_SELECTION } from '@/side-panel/constants/Si
import { useResetPreviousSidePanelContext } from '@/side-panel/pages/root/hooks/useResetPreviousSidePanelContext';
import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState';
import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { SelectableListItem } from '@/ui/layout/selectable-list/components/SelectableListItem';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -24,7 +24,7 @@ export const SidePanelResetContextToSelectionButton = () => {
SIDE_PANEL_PREVIOUS_COMPONENT_INSTANCE_ID,
);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const objectMetadataItem = objectMetadataItems.find(
(objectMetadataItem) =>
@@ -1,7 +1,7 @@
import { NavigationDrawer } from '@/ui/navigation/navigation-drawer/components/NavigationDrawer';
import { NavigationDrawerSectionForObjectMetadataItems } from '@/object-metadata/components/NavigationDrawerSectionForObjectMetadataItems';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { NavigationDrawerItem } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerItem';
import { NavigationDrawerSection } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSection';
import { DEFAULT_WORKSPACE_NAME } from '@/ui/navigation/navigation-drawer/constants/DefaultWorkspaceName';
@@ -34,7 +34,7 @@ export const SignInAppNavigationDrawerMock = ({
}: SignInAppNavigationDrawerMockProps) => {
const isMobile = useIsMobile();
const { t } = useLingui();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
return (
<NavigationDrawer className={className} title={DEFAULT_WORKSPACE_NAME}>
@@ -4,7 +4,7 @@ import { CommandMenuComponentInstanceContext } from '@/command-menu/states/conte
import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId';
import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState';
import { ContextStoreComponentInstanceContext } from '@/context-store/states/contexts/ContextStoreComponentInstanceContext';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { RecordComponentInstanceContextsWrapper } from '@/object-record/components/RecordComponentInstanceContextsWrapper';
import { RecordIndexContextProvider } from '@/object-record/record-index/contexts/RecordIndexContext';
import { useRecordIndexFieldMetadataDerivedStates } from '@/object-record/record-index/hooks/useRecordIndexFieldMetadataDerivedStates';
@@ -29,7 +29,7 @@ export const SignInBackgroundMockContainer = () => {
const recordIndexId = 'sign-up-mock-record-table-id';
const viewBarId = 'companies-mock';
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const contextStoreCurrentObjectMetadataItemId = useAtomComponentStateValue(
contextStoreCurrentObjectMetadataItemIdComponentState,
@@ -1,6 +1,6 @@
import { useHasAccessTokenPair } from '@/auth/hooks/useHasAccessTokenPair';
import { currentUserState } from '@/auth/states/currentUserState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { useTriggerEventStreamCreation } from '@/sse-db-event/hooks/useTriggerEventStreamCreation';
import { useTriggerEventStreamDestroy } from '@/sse-db-event/hooks/useTriggerEventStreamDestroy';
import { isCreatingSseEventStreamState } from '@/sse-db-event/states/isCreatingSseEventStreamState';
@@ -14,7 +14,7 @@ import { isDefined, isNonEmptyArray } from 'twenty-shared/utils';
import { OnboardingStatus } from '~/generated-metadata/graphql';
export const SSEEventStreamEffect = () => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const sseEventStreamId = useAtomStateValue(sseEventStreamIdState);
const isCreatingSseEventStream = useAtomStateValue(
@@ -1,5 +1,5 @@
import { dispatchObjectRecordOperationBrowserEvent } from '@/browser-event/utils/dispatchObjectRecordOperationBrowserEvent';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { groupObjectRecordSseEventsByObjectMetadataItemNameSingular } from '@/sse-db-event/utils/groupObjectRecordSseEventsByObjectMetadataItemNameSingular';
import { turnSseObjectRecordEventsToObjectRecordOperationBrowserEvents } from '@/sse-db-event/utils/turnSseObjectRecordEventToObjectRecordOperationBrowserEvent';
import { useStore } from 'jotai';
@@ -25,7 +25,7 @@ export const useDispatchObjectRecordEventsFromSseToBrowserEvents = () => {
objectRecordEventsByObjectMetadataItemNameSingular.keys(),
);
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
for (const objectMetadataItemNameSingular of objectMetadataItemNamesSingular) {
const objectRecordEventsForThisObjectMetadataItem =
@@ -1,47 +0,0 @@
import { renderHook } from '@testing-library/react';
import { useMoveViewColumns } from '@/views/hooks/useMoveViewColumns';
describe('useMoveViewColumns', () => {
it('should move columns to the left correctly', () => {
const { result } = renderHook(() => useMoveViewColumns());
const initialArray = [{ position: 0 }, { position: 1 }, { position: 2 }];
const movedArray = result.current.handleColumnMove('left', 1, initialArray);
expect(movedArray).toEqual([
{ position: 0, index: 0 },
{ position: 1, index: 1 },
{ position: 2 },
]);
});
it('should move columns to the right correctly', () => {
const { result } = renderHook(() => useMoveViewColumns());
const initialArray = [{ position: 0 }, { position: 1 }, { position: 2 }];
const movedArray = result.current.handleColumnMove(
'right',
1,
initialArray,
);
expect(movedArray).toEqual([
{ position: 0 },
{ position: 1, index: 1 },
{ position: 2, index: 2 },
]);
});
it('should handle invalid moves without modifying the array', () => {
const { result } = renderHook(() => useMoveViewColumns());
const initialArray = [{ position: 0 }, { position: 1 }, { position: 2 }];
const movedArray = result.current.handleColumnMove('left', 0, initialArray);
expect(movedArray).toEqual(initialArray);
});
});
@@ -1,22 +0,0 @@
import { usePerformViewFieldGroupAPIPersist } from '@/views/hooks/internal/usePerformViewFieldGroupAPIPersist';
type CreateViewFieldGroupInput = {
id: string;
name: string;
position: number;
isVisible: boolean;
viewId: string;
};
export const useCreateManyViewFieldGroups = () => {
const { performViewFieldGroupAPICreate } =
usePerformViewFieldGroupAPIPersist();
const createManyViewFieldGroups = async (
inputs: CreateViewFieldGroupInput[],
) => {
return performViewFieldGroupAPICreate({ inputs });
};
return { createManyViewFieldGroups };
};
@@ -1,22 +0,0 @@
import { usePerformViewFieldGroupAPIPersist } from '@/views/hooks/internal/usePerformViewFieldGroupAPIPersist';
type CreateViewFieldGroupInput = {
id: string;
name: string;
position: number;
isVisible: boolean;
viewId: string;
};
export const useCreateViewFieldGroup = () => {
const { performViewFieldGroupAPICreate } =
usePerformViewFieldGroupAPIPersist();
const createViewFieldGroup = async (input: CreateViewFieldGroupInput) => {
return performViewFieldGroupAPICreate({
inputs: [input],
});
};
return { createViewFieldGroup };
};
@@ -1,14 +0,0 @@
import { usePerformViewFieldGroupAPIPersist } from '@/views/hooks/internal/usePerformViewFieldGroupAPIPersist';
export const useDeleteViewFieldGroup = () => {
const { performViewFieldGroupAPIDelete } =
usePerformViewFieldGroupAPIPersist();
const deleteViewFieldGroup = async (viewFieldGroupId: string) => {
return performViewFieldGroupAPIDelete([
{ input: { id: viewFieldGroupId } },
]);
};
return { deleteViewFieldGroup };
};
@@ -1,24 +0,0 @@
import { viewFromViewIdFamilySelector } from '@/views/states/selectors/viewFromViewIdFamilySelector';
import { useStore } from 'jotai';
import { useCallback } from 'react';
export const useGetViewById = () => {
const store = useStore();
const getViewById = useCallback(
(viewId: string | null) => {
const view = store.get(
viewFromViewIdFamilySelector.selectorFamily({
viewId: viewId ?? '',
}),
);
return { view };
},
[store],
);
return {
getViewById,
};
};
@@ -1,39 +0,0 @@
export const useMoveViewColumns = () => {
const handleColumnMove = <T extends { position: number }>(
direction: 'left' | 'right',
currentArrayindex: number,
targetArray: T[],
) => {
const targetArrayIndex =
direction === 'left' ? currentArrayindex - 1 : currentArrayindex + 1;
const targetArraySize = targetArray.length - 1;
if (
currentArrayindex >= 0 &&
targetArrayIndex >= 0 &&
currentArrayindex <= targetArraySize &&
targetArrayIndex <= targetArraySize
) {
const currentEntity = targetArray[currentArrayindex];
const targetEntity = targetArray[targetArrayIndex];
const newArray = [...targetArray];
newArray[currentArrayindex] = {
...targetEntity,
index: currentEntity.position,
};
newArray[targetArrayIndex] = {
...currentEntity,
index: targetEntity.position,
};
return newArray.map((column, index) => ({
...column,
position: index,
}));
}
return targetArray;
};
return { handleColumnMove };
};
@@ -1,35 +0,0 @@
import { usePerformViewFieldGroupAPIPersist } from '@/views/hooks/internal/usePerformViewFieldGroupAPIPersist';
type UpdateViewFieldGroupInput = {
id: string;
name?: string;
position?: number;
isVisible?: boolean;
};
export const useUpdateViewFieldGroup = () => {
const { performViewFieldGroupAPIUpdate } =
usePerformViewFieldGroupAPIPersist();
const updateViewFieldGroup = async ({
id,
name,
position,
isVisible,
}: UpdateViewFieldGroupInput) => {
return performViewFieldGroupAPIUpdate([
{
input: {
id,
update: {
name,
position,
isVisible,
},
},
},
]);
};
return { updateViewFieldGroup };
};
@@ -1,11 +1,11 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type ViewGroup } from '@/views/types/ViewGroup';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { isDefined } from 'twenty-shared/utils';
import { v4 } from 'uuid';
const useViewsSideEffectsOnViewGroups = () => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const triggerViewGroupOptimisticEffectAtViewCreation = ({
mainGroupByFieldMetadataId,
@@ -1,7 +1,7 @@
import { useCallback } from 'react';
import { useLocation } from 'react-router-dom';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { navigationMemorizedUrlState } from '@/ui/navigation/states/navigationMemorizedUrlState';
import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
@@ -15,7 +15,7 @@ export const useGetAvailableFieldsForCalendar = () => {
const viewObjectMetadataId = useAtomComponentStateValue(
viewObjectMetadataIdComponentState,
);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const setNavigationMemorizedUrl = useSetAtomState(
navigationMemorizedUrlState,
);
@@ -1,7 +1,7 @@
import { useCallback } from 'react';
import { useLocation } from 'react-router-dom';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { navigationMemorizedUrlState } from '@/ui/navigation/states/navigationMemorizedUrlState';
import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState';
import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
@@ -16,7 +16,7 @@ export const useGetAvailableFieldsToGroupRecordsBy = () => {
const viewObjectMetadataId = useAtomComponentStateValue(
viewObjectMetadataIdComponentState,
);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const setNavigationMemorizedUrl = useSetAtomState(
navigationMemorizedUrlState,
);
@@ -1,6 +1,6 @@
import { useSidePanelWorkflowNavigation } from '@/side-panel/pages/workflow/hooks/useSidePanelWorkflowNavigation';
import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { getRecordFromCache } from '@/object-record/cache/utils/getRecordFromCache';
import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions';
@@ -35,7 +35,7 @@ export const useRunWorkflowRunOpeningInSidePanelEffects = () => {
objectMetadataItem: ObjectMetadataItem;
recordId: string;
}) => {
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
const workflowRunRecord = getRecordFromCache<WorkflowRun>({
objectMetadataItem,
@@ -1,16 +0,0 @@
import { CoreObjectNameSingular } from 'twenty-shared/types';
import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord';
import { type WorkflowRun } from '@/workflow/types/Workflow';
export const useWorkflowRunUnsafe = ({
workflowRunId,
}: {
workflowRunId: string;
}) => {
const { record } = useFindOneRecord<WorkflowRun>({
objectNameSingular: CoreObjectNameSingular.WorkflowRun,
objectRecordId: workflowRunId,
});
return record;
};
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type WorkflowVersion } from '@/workflow/types/Workflow';
import { getStepOutputSchemaFamilyStateKey } from '@/workflow/utils/getStepOutputSchemaFamilyStateKey';
import { getActionIcon } from '@/workflow/workflow-steps/workflow-actions/utils/getActionIcon';
@@ -24,7 +24,7 @@ export const useStepsOutputSchema = () => {
const populateStepsOutputSchema = useCallback(
(workflowVersion: WorkflowVersion) => {
const objectMetadataItems = store.get(objectMetadataItemsState.atom);
const objectMetadataItems = store.get(objectMetadataItemsSelector.atom);
workflowVersion.steps?.forEach((step) => {
const stepKey = getStepOutputSchemaFamilyStateKey(
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { isHiddenSystemField } from '@/object-metadata/utils/isHiddenSystemField';
import { SettingsLogicFunctionsTable } from '@/settings/logic-functions/components/SettingsLogicFunctionsTable';
import { t } from '@lingui/core/macro';
@@ -23,7 +23,7 @@ export const SettingsApplicationDetailContentTab = ({
objects: { id: string }[];
};
}) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const applicationObjectIds = useMemo(
() => application?.objects.map((object) => object.id) ?? [],
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { SettingsRolesQueryEffect } from '@/settings/roles/components/SettingsRolesQueryEffect';
@@ -283,7 +283,7 @@ const MarketplaceRoleEffect = ({
items: ObjectMetadataItem[],
) => void;
}) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const setSettingsDraftRole = useSetAtomFamilyState(
settingsDraftRoleFamilyState,
defaultRole.id,
@@ -1,4 +1,4 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { t } from '@lingui/core/macro';
import { useMemo } from 'react';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
@@ -18,7 +18,7 @@ export const SettingsAvailableApplicationDetailContentTab = ({
}: {
application: MarketplaceApp;
}) => {
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const { objects, fields, logicFunctions, frontComponents } = application;
@@ -1,5 +1,5 @@
import { useCreateOneObjectMetadataItem } from '@/object-metadata/hooks/useCreateOneObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { objectMetadataItemsSelector } from '@/object-metadata/states/objectMetadataItemsSelector';
import { SaveAndCancelButtons } from '@/settings/components/SaveAndCancelButtons/SaveAndCancelButtons';
import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer';
import { SETTINGS_OBJECT_MODEL_IS_LABEL_SYNCED_WITH_NAME_LABEL_DEFAULT_VALUE } from '@/settings/constants/SettingsObjectModel';
@@ -26,7 +26,7 @@ export const SettingsNewObject = () => {
const navigate = useNavigateSettings();
const [isLoading, setIsLoading] = useState(false);
const { createOneObjectMetadataItem } = useCreateOneObjectMetadataItem();
const objectMetadataItems = useAtomStateValue(objectMetadataItemsState);
const objectMetadataItems = useAtomStateValue(objectMetadataItemsSelector);
const formConfig = useForm<SettingsDataModelObjectAboutFormValues>({
mode: 'onChange',

Some files were not shown because too many files have changed in this diff Show More