diff --git a/packages/twenty-front/src/modules/context-store/components/MainContextStoreProvider.tsx b/packages/twenty-front/src/modules/context-store/components/MainContextStoreProvider.tsx index 787c50822c..a735597211 100644 --- a/packages/twenty-front/src/modules/context-store/components/MainContextStoreProvider.tsx +++ b/packages/twenty-front/src/modules/context-store/components/MainContextStoreProvider.tsx @@ -2,8 +2,8 @@ import { MainContextStoreProviderEffect } from '@/context-store/components/MainC import { useIsSettingsPage } from '@/navigation/hooks/useIsSettingsPage'; import { useLastVisitedView } from '@/navigation/hooks/useLastVisitedView'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; -import { prefetchIndexViewIdFromObjectMetadataItemFamilySelector } from '@/prefetch/states/selector/prefetchIndexViewIdFromObjectMetadataItemFamilySelector'; import { useShowAuthModal } from '@/ui/layout/hooks/useShowAuthModal'; +import { coreIndexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreIndexViewIdFromObjectMetadataItemFamilySelector'; import { useLocation, useParams, useSearchParams } from 'react-router-dom'; import { useRecoilValue } from 'recoil'; import { AppPath } from 'twenty-shared/types'; @@ -60,7 +60,7 @@ export const MainContextStoreProvider = () => { ); const indexViewId = useRecoilValue( - prefetchIndexViewIdFromObjectMetadataItemFamilySelector({ + coreIndexViewIdFromObjectMetadataItemFamilySelector({ objectMetadataItemId: objectMetadataItem?.id ?? '', }), ); diff --git a/packages/twenty-front/src/modules/context-store/components/MainContextStoreProviderEffect.tsx b/packages/twenty-front/src/modules/context-store/components/MainContextStoreProviderEffect.tsx index a95fc50b43..7c3c5d5f2e 100644 --- a/packages/twenty-front/src/modules/context-store/components/MainContextStoreProviderEffect.tsx +++ b/packages/twenty-front/src/modules/context-store/components/MainContextStoreProviderEffect.tsx @@ -6,8 +6,8 @@ import { getViewType } from '@/context-store/utils/getViewType'; import { useSetLastVisitedObjectMetadataId } from '@/navigation/hooks/useSetLastVisitedObjectMetadataId'; import { useSetLastVisitedViewForObjectMetadataNamePlural } from '@/navigation/hooks/useSetLastVisitedViewForObjectMetadataNamePlural'; import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentState'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { useEffect } from 'react'; import { useRecoilValue } from 'recoil'; @@ -53,7 +53,7 @@ export const MainContextStoreProviderEffect = ({ ); const view = useRecoilValue( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: viewId ?? '', }), ); diff --git a/packages/twenty-front/src/modules/object-metadata/components/NavigationDrawerItemForObjectMetadataItem.tsx b/packages/twenty-front/src/modules/object-metadata/components/NavigationDrawerItemForObjectMetadataItem.tsx index bbee3cdfed..e152f43612 100644 --- a/packages/twenty-front/src/modules/object-metadata/components/NavigationDrawerItemForObjectMetadataItem.tsx +++ b/packages/twenty-front/src/modules/object-metadata/components/NavigationDrawerItemForObjectMetadataItem.tsx @@ -2,12 +2,12 @@ import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainCo import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { lastVisitedViewPerObjectMetadataItemState } from '@/navigation/states/lastVisitedViewPerObjectMetadataItemState'; import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { prefetchViewsFromObjectMetadataItemFamilySelector } from '@/prefetch/states/selector/prefetchViewsFromObjectMetadataItemFamilySelector'; import { NavigationDrawerItem } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerItem'; import { NavigationDrawerItemsCollapsableContainer } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerItemsCollapsableContainer'; import { NavigationDrawerSubItem } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSubItem'; import { getNavigationSubItemLeftAdornment } from '@/ui/navigation/navigation-drawer/utils/getNavigationSubItemLeftAdornment'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; +import { coreViewsFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreViewsFromObjectMetadataItemFamilySelector'; import { useLocation } from 'react-router-dom'; import { useRecoilValue } from 'recoil'; import { AppPath } from 'twenty-shared/types'; @@ -23,7 +23,7 @@ export const NavigationDrawerItemForObjectMetadataItem = ({ objectMetadataItem, }: NavigationDrawerItemForObjectMetadataItemProps) => { const views = useRecoilValue( - prefetchViewsFromObjectMetadataItemFamilySelector({ + coreViewsFromObjectMetadataItemFamilySelector({ objectMetadataItemId: objectMetadataItem.id, }), ); diff --git a/packages/twenty-front/src/modules/object-record/object-options-dropdown/hooks/useSetViewTypeFromLayoutOptionsMenu.ts b/packages/twenty-front/src/modules/object-record/object-options-dropdown/hooks/useSetViewTypeFromLayoutOptionsMenu.ts index 7269552b0e..0261438bf4 100644 --- a/packages/twenty-front/src/modules/object-record/object-options-dropdown/hooks/useSetViewTypeFromLayoutOptionsMenu.ts +++ b/packages/twenty-front/src/modules/object-record/object-options-dropdown/hooks/useSetViewTypeFromLayoutOptionsMenu.ts @@ -4,9 +4,9 @@ import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/ import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; import { useLoadRecordIndexStates } from '@/object-record/record-index/hooks/useLoadRecordIndexStates'; import { recordIndexViewTypeState } from '@/object-record/record-index/states/recordIndexViewTypeState'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { usePersistViewGroupRecords } from '@/views/hooks/internal/usePersistViewGroupRecords'; import { useUpdateCurrentView } from '@/views/hooks/useUpdateCurrentView'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { type GraphQLView } from '@/views/types/GraphQLView'; import { type ViewGroup } from '@/views/types/ViewGroup'; import { ViewType, viewTypeIconMapping } from '@/views/types/ViewType'; @@ -78,7 +78,7 @@ export const useSetViewTypeFromLayoutOptionsMenu = () => { } const currentView = snapshot .getLoadable( - prefetchViewFromViewIdFamilySelector({ viewId: currentViewId }), + coreViewFromViewIdFamilySelector({ viewId: currentViewId }), ) .getValue(); if (!isDefined(currentView)) { diff --git a/packages/twenty-front/src/modules/object-record/record-field-list/record-detail-section/relation/components/RecordDetailRelationSection.tsx b/packages/twenty-front/src/modules/object-record/record-field-list/record-detail-section/relation/components/RecordDetailRelationSection.tsx index b29661e260..7f9811a33f 100644 --- a/packages/twenty-front/src/modules/object-record/record-field-list/record-detail-section/relation/components/RecordDetailRelationSection.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field-list/record-detail-section/relation/components/RecordDetailRelationSection.tsx @@ -19,10 +19,10 @@ import { getRecordFieldCardRelationPickerDropdownId } from '@/object-record/reco import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { AggregateOperations } from '@/object-record/record-table/constants/AggregateOperations'; import { type ObjectRecord } from '@/object-record/types/ObjectRecord'; -import { prefetchIndexViewIdFromObjectMetadataItemFamilySelector } from '@/prefetch/states/selector/prefetchIndexViewIdFromObjectMetadataItemFamilySelector'; import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState'; import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; +import { coreIndexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreIndexViewIdFromObjectMetadataItemFamilySelector'; import { useLingui } from '@lingui/react/macro'; import { AppPath, ViewFilterOperand } from 'twenty-shared/types'; import { getAppPath } from 'twenty-shared/utils'; @@ -81,7 +81,7 @@ export const RecordDetailRelationSection = ({ ); const indexViewId = useRecoilValue( - prefetchIndexViewIdFromObjectMetadataItemFamilySelector({ + coreIndexViewIdFromObjectMetadataItemFamilySelector({ objectMetadataItemId: relationObjectMetadataItem.id, }), ); diff --git a/packages/twenty-front/src/modules/object-record/record-field/hooks/useChangeRecordFieldVisibility.ts b/packages/twenty-front/src/modules/object-record/record-field/hooks/useChangeRecordFieldVisibility.ts index 547c9daffb..32eb9c9208 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/hooks/useChangeRecordFieldVisibility.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/useChangeRecordFieldVisibility.ts @@ -26,7 +26,7 @@ export const useChangeRecordFieldVisibility = ( const { saveViewFields } = useSaveCurrentViewFields(); - const changeRecordFieldVisibility = ({ + const changeRecordFieldVisibility = async ({ fieldMetadataId, isVisible, }: { @@ -56,7 +56,7 @@ export const useChangeRecordFieldVisibility = ( upsertRecordField(recordFieldToUpsert); - saveViewFields([mapRecordFieldToViewField(recordFieldToUpsert)]); + await saveViewFields([mapRecordFieldToViewField(recordFieldToUpsert)]); } else { updateRecordField(fieldMetadataId, { isVisible: shouldShowFieldMetadataItem, diff --git a/packages/twenty-front/src/modules/object-record/record-field/hooks/useMoveRecordField.ts b/packages/twenty-front/src/modules/object-record/record-field/hooks/useMoveRecordField.ts index a6b37dd52a..6d86bb1fed 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/hooks/useMoveRecordField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/useMoveRecordField.ts @@ -20,7 +20,7 @@ export const useMoveRecordField = (recordTableId?: string) => { // because otherwise it will just do nothing while moving left and right of non visible record fields const moveRecordField = useRecoilCallback( ({ snapshot }) => - ({ + async ({ direction, fieldMetadataItemIdToMove, }: { @@ -73,7 +73,7 @@ export const useMoveRecordField = (recordTableId?: string) => { position: currentRecordFieldNewPosition, }); - saveViewFields([ + await saveViewFields([ mapRecordFieldToViewField({ ...targetRecordField, position: targetRecordFieldNewPosition, diff --git a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexLoadBaseOnContextStoreEffect.tsx b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexLoadBaseOnContextStoreEffect.tsx index 8575c6b48c..817b11bed8 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexLoadBaseOnContextStoreEffect.tsx +++ b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexLoadBaseOnContextStoreEffect.tsx @@ -1,8 +1,8 @@ import { useContextStoreObjectMetadataItemOrThrow } from '@/context-store/hooks/useContextStoreObjectMetadataItemOrThrow'; import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { useLoadRecordIndexStates } from '@/object-record/record-index/hooks/useLoadRecordIndexStates'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { useEffect, useState } from 'react'; import { useRecoilValue } from 'recoil'; import { isDefined } from 'twenty-shared/utils'; @@ -18,7 +18,7 @@ export const RecordIndexLoadBaseOnContextStoreEffect = () => { ); const view = useRecoilValue( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: contextStoreCurrentViewId ?? '', }), ); diff --git a/packages/twenty-front/src/modules/object-record/record-table/hooks/useMoveTableColumn.ts b/packages/twenty-front/src/modules/object-record/record-table/hooks/useMoveTableColumn.ts index 85d18af254..dd10d856d5 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/hooks/useMoveTableColumn.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/hooks/useMoveTableColumn.ts @@ -17,7 +17,7 @@ export const useMoveTableColumn = ({ recordTableId }: useRecordTableProps) => { async (direction: 'left' | 'right', fieldMetadataItemId: string) => { unfocusRecordTableCell(); - moveRecordField({ + await moveRecordField({ direction: direction === 'left' ? 'before' : 'after', fieldMetadataItemIdToMove: fieldMetadataItemId, }); diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableColumnHeadDropdownMenu.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableColumnHeadDropdownMenu.tsx index 05270a5ebb..1df12bd145 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableColumnHeadDropdownMenu.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableColumnHeadDropdownMenu.tsx @@ -98,9 +98,9 @@ export const RecordTableColumnHeadDropdownMenu = ({ moveTableColumn('right', recordField.fieldMetadataItemId); }; - const handleColumnVisibility = () => { + const handleColumnVisibility = async () => { closeDropdownAndToggleScroll(); - changeRecordFieldVisibility({ + await changeRecordFieldVisibility({ fieldMetadataId: recordField.fieldMetadataItemId, isVisible: false, }); @@ -170,7 +170,7 @@ export const RecordTableColumnHeadDropdownMenu = ({ {canHide && ( await handleColumnVisibility()} text={t`Hide`} /> )} diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeaderPlusButtonContent.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeaderPlusButtonContent.tsx index 8953ed16cf..eac2378c55 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeaderPlusButtonContent.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-header/components/RecordTableHeaderPlusButtonContent.tsx @@ -31,9 +31,11 @@ export const RecordTableHeaderPlusButtonContent = () => { useChangeRecordFieldVisibility(recordTableId); const handleAddColumn = useCallback( - (column: Pick, 'fieldMetadataId'>) => { + async ( + column: Pick, 'fieldMetadataId'>, + ) => { closeDropdown(); - changeRecordFieldVisibility({ ...column, isVisible: true }); + await changeRecordFieldVisibility({ ...column, isVisible: true }); }, [changeRecordFieldVisibility, closeDropdown], ); @@ -60,8 +62,8 @@ export const RecordTableHeaderPlusButtonContent = () => { {availableFieldMetadataItemsToShow.map((fieldMetadataItem) => ( - handleAddColumn({ + onClick={async () => + await handleAddColumn({ fieldMetadataId: fieldMetadataItem.id, }) } diff --git a/packages/twenty-front/src/modules/prefetch/states/selector/prefetchViewIdsFromObjectMetadataItemFamilySelector.ts b/packages/twenty-front/src/modules/prefetch/states/selector/prefetchViewIdsFromObjectMetadataItemFamilySelector.ts deleted file mode 100644 index c4cc944e51..0000000000 --- a/packages/twenty-front/src/modules/prefetch/states/selector/prefetchViewIdsFromObjectMetadataItemFamilySelector.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { coreViewsState } from '@/views/states/coreViewState'; -import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView'; -import { selectorFamily } from 'recoil'; - -export const prefetchViewIdsFromObjectMetadataItemFamilySelector = - selectorFamily({ - key: 'prefetchViewIdsFromObjectMetadataItemFamilySelector', - get: - ({ objectMetadataItemId }) => - ({ get }) => { - const coreViews = get(coreViewsState); - - const views = coreViews.map(convertCoreViewToView); - - return views - .filter((view) => view.objectMetadataId === objectMetadataItemId) - .map((view) => view.id); - }, - }); diff --git a/packages/twenty-front/src/modules/views/components/ViewBarAnyFieldFilterEffect.tsx b/packages/twenty-front/src/modules/views/components/ViewBarAnyFieldFilterEffect.tsx index 1debdcf818..1fd442101c 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarAnyFieldFilterEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarAnyFieldFilterEffect.tsx @@ -1,11 +1,11 @@ import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { anyFieldFilterValueComponentState } from '@/object-record/record-filter/states/anyFieldFilterValueComponentState'; import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentFamilyState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyState'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; import { hasInitializedAnyFieldFilterComponentFamilyState } from '@/views/states/hasInitializedAnyFieldFilterComponentFamilyState'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { useEffect } from 'react'; import { useRecoilValue } from 'recoil'; import { isDefined } from 'twenty-shared/utils'; @@ -18,7 +18,7 @@ export const ViewBarAnyFieldFilterEffect = () => { const { objectMetadataItem } = useRecordIndexContextOrThrow(); const currentView = useRecoilValue( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: currentViewId ?? '', }), ); diff --git a/packages/twenty-front/src/modules/views/components/ViewBarRecordFieldEffect.tsx b/packages/twenty-front/src/modules/views/components/ViewBarRecordFieldEffect.tsx index f3ec4bf963..6bce7f34bd 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarRecordFieldEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarRecordFieldEffect.tsx @@ -1,11 +1,11 @@ import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { currentRecordFieldsComponentState } from '@/object-record/record-field/states/currentRecordFieldsComponentState'; import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentFamilyState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyState'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; import { hasInitializedCurrentRecordFieldsComponentFamilyState } from '@/views/states/hasInitializedCurrentRecordFieldsComponentFamilyState'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { mapViewFieldToRecordField } from '@/views/utils/mapViewFieldToRecordField'; import { useEffect } from 'react'; import { useRecoilValue } from 'recoil'; @@ -19,7 +19,7 @@ export const ViewBarRecordFieldEffect = () => { const { objectMetadataItem } = useRecordIndexContextOrThrow(); const currentView = useRecoilValue( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: currentViewId ?? '', }), ); diff --git a/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterEffect.tsx b/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterEffect.tsx index 8780d63d49..09500dfd0b 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterEffect.tsx @@ -1,12 +1,12 @@ import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentFamilyState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyState'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; import { useMapViewFiltersToFilters } from '@/views/hooks/useMapViewFiltersToFilters'; import { hasInitializedCurrentRecordFiltersComponentFamilyState } from '@/views/states/hasInitializedCurrentRecordFiltersComponentFamilyState'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { useEffect } from 'react'; import { useRecoilValue } from 'recoil'; import { isDefined } from 'twenty-shared/utils'; @@ -19,7 +19,7 @@ export const ViewBarRecordFilterEffect = () => { const { objectMetadataItem } = useRecordIndexContextOrThrow(); const currentView = useRecoilValue( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: currentViewId ?? '', }), ); diff --git a/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterGroupEffect.tsx b/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterGroupEffect.tsx index 71e5e0a0af..e554e1285f 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterGroupEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarRecordFilterGroupEffect.tsx @@ -1,11 +1,11 @@ import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { currentRecordFilterGroupsComponentState } from '@/object-record/record-filter-group/states/currentRecordFilterGroupsComponentState'; import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentFamilyState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyState'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; import { hasInitializedCurrentRecordFilterGroupsComponentFamilyState } from '@/views/states/hasInitializedCurrentRecordFilterGroupsComponentFamilyState'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { mapViewFilterGroupsToRecordFilterGroups } from '@/views/utils/mapViewFilterGroupsToRecordFilterGroups'; import { useEffect } from 'react'; import { useRecoilValue } from 'recoil'; @@ -19,7 +19,7 @@ export const ViewBarRecordFilterGroupEffect = () => { const { objectMetadataItem } = useRecordIndexContextOrThrow(); const currentView = useRecoilValue( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: currentViewId ?? '', }), ); diff --git a/packages/twenty-front/src/modules/views/components/ViewBarRecordSortEffect.tsx b/packages/twenty-front/src/modules/views/components/ViewBarRecordSortEffect.tsx index 024b5e0483..3080605936 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarRecordSortEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarRecordSortEffect.tsx @@ -1,11 +1,11 @@ import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentFamilyState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyState'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; import { hasInitializedCurrentRecordSortsComponentFamilyState } from '@/views/states/hasInitializedCurrentRecordSortsComponentFamilyState'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts'; import { useEffect } from 'react'; import { useRecoilValue } from 'recoil'; @@ -19,7 +19,7 @@ export const ViewBarRecordSortEffect = () => { const { objectMetadataItem } = useRecordIndexContextOrThrow(); const currentView = useRecoilValue( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: currentViewId ?? '', }), ); diff --git a/packages/twenty-front/src/modules/views/hooks/internal/usePersistViewFieldRecords.ts b/packages/twenty-front/src/modules/views/hooks/internal/usePersistViewFieldRecords.ts index 9a6f756473..baf6ab2508 100644 --- a/packages/twenty-front/src/modules/views/hooks/internal/usePersistViewFieldRecords.ts +++ b/packages/twenty-front/src/modules/views/hooks/internal/usePersistViewFieldRecords.ts @@ -1,35 +1,21 @@ import { useCallback } from 'react'; import { v4 } from 'uuid'; -import { triggerCreateRecordsOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerCreateRecordsOptimisticEffect'; -import { triggerUpdateRecordOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect'; -import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; -import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; -import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache'; -import { useObjectPermissions } from '@/object-record/hooks/useObjectPermissions'; import { CREATE_CORE_VIEW_FIELD } from '@/views/graphql/mutations/createCoreViewField'; import { UPDATE_CORE_VIEW_FIELD } from '@/views/graphql/mutations/updateCoreViewField'; +import { useTriggerViewFieldOptimisticEffect } from '@/views/optimistic-effects/hooks/useTriggerViewFieldOptimisticEffect'; import { type GraphQLView } from '@/views/types/GraphQLView'; import { type ViewField } from '@/views/types/ViewField'; import { useApolloClient } from '@apollo/client'; -import { isNull } from '@sniptt/guards'; import { isDefined } from 'twenty-shared/utils'; import { type CoreViewField } from '~/generated/graphql'; export const usePersistViewFieldRecords = () => { - const { objectMetadataItem } = useObjectMetadataItem({ - objectNameSingular: CoreObjectNameSingular.ViewField, - }); - - const getRecordFromCache = useGetRecordFromCache({ - objectNameSingular: CoreObjectNameSingular.ViewField, - }); - - const { objectMetadataItems } = useObjectMetadataItems(); - const { objectPermissionsByObjectMetadataId } = useObjectPermissions(); const apolloClient = useApolloClient(); + const { triggerViewFieldOptimisticEffect } = + useTriggerViewFieldOptimisticEffect(); + const createCoreViewFieldRecords = useCallback( ( viewFieldsToCreate: Omit[], @@ -50,28 +36,19 @@ export const usePersistViewFieldRecords = () => { size: viewField.size, } satisfies Partial, }, - update: (cache, { data }) => { + update: (_cache, { data }) => { const record = data?.['createCoreViewField']; if (!record) return; - triggerCreateRecordsOptimisticEffect({ - cache, - objectMetadataItem, - recordsToCreate: [record], - objectMetadataItems, - objectPermissionsByObjectMetadataId, + triggerViewFieldOptimisticEffect({ + createdViewFields: [record], }); }, }), ), ); }, - [ - apolloClient, - objectMetadataItem, - objectMetadataItems, - objectPermissionsByObjectMetadataId, - ], + [apolloClient, triggerViewFieldOptimisticEffect], ); const updateCoreViewFieldRecords = useCallback( @@ -91,29 +68,19 @@ export const usePersistViewFieldRecords = () => { aggregateOperation: viewField.aggregateOperation, } satisfies Partial, }, - update: (cache, { data }) => { + update: (_cache, { data }) => { const record = data?.['updateCoreViewField']; if (!isDefined(record)) return; - const cachedRecord = getRecordFromCache( - record.id, - cache, - ); - if (isNull(cachedRecord)) return; - - triggerUpdateRecordOptimisticEffect({ - cache, - objectMetadataItem, - currentRecord: cachedRecord, - updatedRecord: record, - objectMetadataItems, + triggerViewFieldOptimisticEffect({ + updatedViewFields: [record], }); }, }), ), ); }, - [apolloClient, getRecordFromCache, objectMetadataItem, objectMetadataItems], + [apolloClient, triggerViewFieldOptimisticEffect], ); return { diff --git a/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewAnyFieldFilterToAnyFieldFilter.ts b/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewAnyFieldFilterToAnyFieldFilter.ts index 8b878f08e0..277985f99f 100644 --- a/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewAnyFieldFilterToAnyFieldFilter.ts +++ b/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewAnyFieldFilterToAnyFieldFilter.ts @@ -1,8 +1,8 @@ import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { anyFieldFilterValueComponentState } from '@/object-record/record-filter/states/anyFieldFilterValueComponentState'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { useRecoilCallback } from 'recoil'; import { isDefined } from 'twenty-shared/utils'; @@ -20,7 +20,7 @@ export const useApplyCurrentViewAnyFieldFilterToAnyFieldFilter = () => { () => { const currentView = snapshot .getLoadable( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: currentViewId ?? '', }), ) diff --git a/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewFilterGroupsToCurrentRecordFilterGroups.ts b/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewFilterGroupsToCurrentRecordFilterGroups.ts index c95f406cc5..cc2f4e9dd8 100644 --- a/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewFilterGroupsToCurrentRecordFilterGroups.ts +++ b/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewFilterGroupsToCurrentRecordFilterGroups.ts @@ -1,9 +1,9 @@ import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { currentRecordFilterGroupsComponentState } from '@/object-record/record-filter-group/states/currentRecordFilterGroupsComponentState'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentCallbackState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackState'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { mapViewFilterGroupsToRecordFilterGroups } from '@/views/utils/mapViewFilterGroupsToRecordFilterGroups'; import { useRecoilCallback } from 'recoil'; import { isDefined } from 'twenty-shared/utils'; @@ -28,7 +28,7 @@ export const useApplyCurrentViewFilterGroupsToCurrentRecordFilterGroups = () => { const currentView = snapshot .getLoadable( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: currentViewId ?? '', }), ) diff --git a/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewFiltersToCurrentRecordFilters.ts b/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewFiltersToCurrentRecordFilters.ts index d4c7f043e6..c05cfb7843 100644 --- a/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewFiltersToCurrentRecordFilters.ts +++ b/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewFiltersToCurrentRecordFilters.ts @@ -1,8 +1,8 @@ import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { useRecoilCallback } from 'recoil'; import { isDefined } from 'twenty-shared/utils'; import { useMapViewFiltersToFilters } from './useMapViewFiltersToFilters'; @@ -23,7 +23,7 @@ export const useApplyCurrentViewFiltersToCurrentRecordFilters = () => { () => { const currentView = snapshot .getLoadable( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: currentViewId ?? '', }), ) diff --git a/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewSortsToCurrentRecordSorts.ts b/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewSortsToCurrentRecordSorts.ts index 693e2d8af0..6e41a7ed89 100644 --- a/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewSortsToCurrentRecordSorts.ts +++ b/packages/twenty-front/src/modules/views/hooks/useApplyCurrentViewSortsToCurrentRecordSorts.ts @@ -1,8 +1,8 @@ import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts'; import { useRecoilValue } from 'recoil'; import { isDefined } from 'twenty-shared/utils'; @@ -13,7 +13,7 @@ export const useApplyCurrentViewSortsToCurrentRecordSorts = () => { ); const currentView = useRecoilValue( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: currentViewId ?? '', }), ); diff --git a/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts b/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts index 4424036781..58734464ee 100644 --- a/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts +++ b/packages/twenty-front/src/modules/views/hooks/useCreateViewFromCurrentView.ts @@ -4,7 +4,6 @@ import { anyFieldFilterValueComponentState } from '@/object-record/record-filter import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentCallbackState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackState'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue'; @@ -15,6 +14,7 @@ import { usePersistViewGroupRecords } from '@/views/hooks/internal/usePersistVie import { usePersistViewSortRecords } from '@/views/hooks/internal/usePersistViewSortRecords'; import { useRefreshCoreViewsByObjectMetadataId } from '@/views/hooks/useRefreshCoreViewsByObjectMetadataId'; import { isPersistingViewFieldsState } from '@/views/states/isPersistingViewFieldsState'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { type GraphQLView } from '@/views/types/GraphQLView'; import { type ViewGroup } from '@/views/types/ViewGroup'; import { type ViewSort } from '@/views/types/ViewSort'; @@ -97,7 +97,7 @@ export const useCreateViewFromCurrentView = (viewBarComponentId?: string) => { const sourceView = snapshot .getLoadable( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: currentViewId, }), ) diff --git a/packages/twenty-front/src/modules/views/hooks/useDeleteView.ts b/packages/twenty-front/src/modules/views/hooks/useDeleteView.ts index 88d80776c1..16cf15841b 100644 --- a/packages/twenty-front/src/modules/views/hooks/useDeleteView.ts +++ b/packages/twenty-front/src/modules/views/hooks/useDeleteView.ts @@ -1,5 +1,5 @@ -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRefreshCoreViewsByObjectMetadataId } from '@/views/hooks/useRefreshCoreViewsByObjectMetadataId'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { useRecoilCallback } from 'recoil'; import { isDefined } from 'twenty-shared/utils'; import { useDeleteCoreViewMutation } from '~/generated/graphql'; @@ -14,7 +14,7 @@ export const useDeleteView = () => { async (viewId: string) => { const currentView = snapshot .getLoadable( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId, }), ) diff --git a/packages/twenty-front/src/modules/views/hooks/useGetCurrentViewOnly.ts b/packages/twenty-front/src/modules/views/hooks/useGetCurrentViewOnly.ts index 1b9b19333d..f783f74420 100644 --- a/packages/twenty-front/src/modules/views/hooks/useGetCurrentViewOnly.ts +++ b/packages/twenty-front/src/modules/views/hooks/useGetCurrentViewOnly.ts @@ -1,6 +1,6 @@ import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { useRecoilValue } from 'recoil'; @@ -10,7 +10,7 @@ export const useGetCurrentViewOnly = () => { ); const currentView = useRecoilValue( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: currentViewId ?? '', }), ); diff --git a/packages/twenty-front/src/modules/views/hooks/useGetViewFromPrefetchState.ts b/packages/twenty-front/src/modules/views/hooks/useGetViewFromPrefetchState.ts index 1dc1d35f3e..ba88eb8e12 100644 --- a/packages/twenty-front/src/modules/views/hooks/useGetViewFromPrefetchState.ts +++ b/packages/twenty-front/src/modules/views/hooks/useGetViewFromPrefetchState.ts @@ -1,4 +1,4 @@ -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { useRecoilCallback } from 'recoil'; export const useGetViewFromPrefetchState = () => { @@ -7,7 +7,7 @@ export const useGetViewFromPrefetchState = () => { (viewId: string) => { const view = snapshot .getLoadable( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: viewId, }), ) diff --git a/packages/twenty-front/src/modules/views/hooks/useRefreshCoreViewsByObjectMetadataId.ts b/packages/twenty-front/src/modules/views/hooks/useRefreshCoreViewsByObjectMetadataId.ts index 73bba01984..677f6b02b6 100644 --- a/packages/twenty-front/src/modules/views/hooks/useRefreshCoreViewsByObjectMetadataId.ts +++ b/packages/twenty-front/src/modules/views/hooks/useRefreshCoreViewsByObjectMetadataId.ts @@ -3,7 +3,7 @@ import { currentRecordFieldsComponentState } from '@/object-record/record-field/ import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState'; import { getRecordIndexIdFromObjectNamePluralAndViewId } from '@/object-record/utils/getRecordIndexIdFromObjectNamePluralAndViewId'; -import { coreViewsByObjectMetadataIdFamilySelector } from '@/views/states/coreViewsByObjectMetadataIdFamilySelector'; +import { coreViewsByObjectMetadataIdFamilySelector } from '@/views/states/selectors/coreViewsByObjectMetadataIdFamilySelector'; import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView'; import { getFilterableFieldsWithVectorSearch } from '@/views/utils/getFilterableFieldsWithVectorSearch'; diff --git a/packages/twenty-front/src/modules/views/hooks/useUpdateCurrentView.ts b/packages/twenty-front/src/modules/views/hooks/useUpdateCurrentView.ts index f0f4405015..e7856fe668 100644 --- a/packages/twenty-front/src/modules/views/hooks/useUpdateCurrentView.ts +++ b/packages/twenty-front/src/modules/views/hooks/useUpdateCurrentView.ts @@ -1,9 +1,9 @@ import { useRecoilCallback } from 'recoil'; import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentCallbackState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackState'; import { useRefreshCoreViewsByObjectMetadataId } from '@/views/hooks/useRefreshCoreViewsByObjectMetadataId'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { type GraphQLView } from '@/views/types/GraphQLView'; import { convertUpdateViewInputToCore } from '@/views/utils/convertUpdateViewInputToCore'; import { isDefined } from 'twenty-shared/utils'; @@ -28,7 +28,7 @@ export const useUpdateCurrentView = () => { const currentView = snapshot .getLoadable( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: currentViewId ?? '', }), ) diff --git a/packages/twenty-front/src/modules/views/hooks/useViewOrDefaultViewFromPrefetchedViews.ts b/packages/twenty-front/src/modules/views/hooks/useViewOrDefaultViewFromPrefetchedViews.ts index 26ee0b3279..9c592c4063 100644 --- a/packages/twenty-front/src/modules/views/hooks/useViewOrDefaultViewFromPrefetchedViews.ts +++ b/packages/twenty-front/src/modules/views/hooks/useViewOrDefaultViewFromPrefetchedViews.ts @@ -1,5 +1,5 @@ -import { prefetchIndexViewIdFromObjectMetadataItemFamilySelector } from '@/prefetch/states/selector/prefetchIndexViewIdFromObjectMetadataItemFamilySelector'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; +import { coreIndexViewIdFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreIndexViewIdFromObjectMetadataItemFamilySelector'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { useRecoilValue } from 'recoil'; export const useViewOrDefaultViewFromPrefetchedViews = ({ @@ -8,13 +8,13 @@ export const useViewOrDefaultViewFromPrefetchedViews = ({ objectMetadataItemId: string; }) => { const indexViewId = useRecoilValue( - prefetchIndexViewIdFromObjectMetadataItemFamilySelector({ + coreIndexViewIdFromObjectMetadataItemFamilySelector({ objectMetadataItemId, }), ); const indexView = useRecoilValue( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: indexViewId ?? '', }), ); diff --git a/packages/twenty-front/src/modules/views/optimistic-effects/hooks/useTriggerViewFieldOptimisticEffect.ts b/packages/twenty-front/src/modules/views/optimistic-effects/hooks/useTriggerViewFieldOptimisticEffect.ts new file mode 100644 index 0000000000..b031106f79 --- /dev/null +++ b/packages/twenty-front/src/modules/views/optimistic-effects/hooks/useTriggerViewFieldOptimisticEffect.ts @@ -0,0 +1,142 @@ +import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue'; +import { coreViewsState } from '@/views/states/coreViewState'; +import { type CoreViewWithRelations } from '@/views/types/CoreViewWithRelations'; +import { useApolloClient } from '@apollo/client'; +import { useRecoilCallback } from 'recoil'; +import { isDefined } from 'twenty-shared/utils'; +import { type CoreViewField } from '~/generated/graphql'; +import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; + +export const useTriggerViewFieldOptimisticEffect = () => { + const apolloClient = useApolloClient(); + + const cache = apolloClient.cache; + + const triggerViewFieldOptimisticEffect = useRecoilCallback( + ({ set, snapshot }) => + ({ + createdViewFields = [], + updatedViewFields = [], + deletedViewFields = [], + }: { + createdViewFields?: CoreViewField[]; + updatedViewFields?: CoreViewField[]; + deletedViewFields?: CoreViewField[]; + }) => { + const coreViews = getSnapshotValue(snapshot, coreViewsState); + let newCoreViews = [...coreViews]; + + createdViewFields.forEach((createdViewField) => { + cache.modify({ + id: cache.identify({ + __typename: 'CoreView', + id: createdViewField.viewId, + }), + fields: { + viewFields: (existingViewFields, { toReference }) => [ + ...(existingViewFields ?? []), + toReference(createdViewField), + ], + }, + }); + const toBeModifiedCoreView = newCoreViews.find( + (coreView) => coreView.id === createdViewField.viewId, + ); + if (isDefined(toBeModifiedCoreView)) { + newCoreViews = [ + ...newCoreViews.filter( + (coreView) => coreView.id !== createdViewField.viewId, + ), + { + ...toBeModifiedCoreView, + viewFields: [ + ...toBeModifiedCoreView.viewFields, + createdViewField, + ], + }, + ]; + } + }); + + updatedViewFields.forEach((updatedViewField) => { + cache.modify({ + id: cache.identify({ + __typename: 'CoreView', + id: updatedViewField.viewId, + }), + fields: { + viewFields: (existingViewFields, { readField, toReference }) => + existingViewFields.map((viewField) => { + const viewFieldId = readField('id', viewField); + if (viewFieldId === updatedViewField.id) { + return toReference(updatedViewField); + } + return viewField; + }), + }, + }); + const toBeModifiedCoreView = newCoreViews.find( + (coreView) => coreView.id === updatedViewField.viewId, + ); + if (isDefined(toBeModifiedCoreView)) { + newCoreViews = [ + ...newCoreViews.filter( + (coreView) => coreView.id !== updatedViewField.viewId, + ), + { + ...toBeModifiedCoreView, + viewFields: [ + ...toBeModifiedCoreView.viewFields.filter( + (viewField) => viewField.id !== updatedViewField.id, + ), + updatedViewField, + ], + }, + ]; + } + }); + + deletedViewFields.forEach((deletedViewField) => { + cache.modify({ + id: cache.identify({ + __typename: 'CoreView', + id: deletedViewField.viewId, + }), + fields: { + viewFields: (existingViewFields, { readField }) => + existingViewFields.filter( + (viewField) => + readField('id', viewField) !== deletedViewField.id, + ), + }, + }); + const toBeModifiedCoreView = newCoreViews.find( + (coreView) => coreView.id === deletedViewField.viewId, + ); + + if (isDefined(toBeModifiedCoreView)) { + newCoreViews = [ + ...newCoreViews.filter( + (coreView) => coreView.id !== deletedViewField.viewId, + ), + { + ...toBeModifiedCoreView, + viewFields: toBeModifiedCoreView.viewFields.filter( + (viewField) => viewField.id !== deletedViewField.id, + ), + }, + ]; + } + }); + + if (!isDeeplyEqual(coreViews, newCoreViews)) { + set(coreViewsState, newCoreViews); + } + }, + [cache], + ); + + return { + triggerViewFieldOptimisticEffect, + }; +}; diff --git a/packages/twenty-front/src/modules/prefetch/states/selector/prefetchIndexViewIdFromObjectMetadataItemFamilySelector.ts b/packages/twenty-front/src/modules/views/states/selectors/coreIndexViewIdFromObjectMetadataItemFamilySelector.ts similarity index 82% rename from packages/twenty-front/src/modules/prefetch/states/selector/prefetchIndexViewIdFromObjectMetadataItemFamilySelector.ts rename to packages/twenty-front/src/modules/views/states/selectors/coreIndexViewIdFromObjectMetadataItemFamilySelector.ts index 3ff7f55b2a..f20167ba57 100644 --- a/packages/twenty-front/src/modules/prefetch/states/selector/prefetchIndexViewIdFromObjectMetadataItemFamilySelector.ts +++ b/packages/twenty-front/src/modules/views/states/selectors/coreIndexViewIdFromObjectMetadataItemFamilySelector.ts @@ -3,9 +3,9 @@ import { ViewKey } from '@/views/types/ViewKey'; import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView'; import { selectorFamily } from 'recoil'; -export const prefetchIndexViewIdFromObjectMetadataItemFamilySelector = +export const coreIndexViewIdFromObjectMetadataItemFamilySelector = selectorFamily({ - key: 'prefetchIndexViewIdFromObjectMetadataItemFamilySelector', + key: 'coreIndexViewIdFromObjectMetadataItemFamilySelector', get: ({ objectMetadataItemId }) => ({ get }) => { diff --git a/packages/twenty-front/src/modules/prefetch/states/selector/prefetchViewFromViewIdFamilySelector.ts b/packages/twenty-front/src/modules/views/states/selectors/coreViewFromViewIdFamilySelector.ts similarity index 81% rename from packages/twenty-front/src/modules/prefetch/states/selector/prefetchViewFromViewIdFamilySelector.ts rename to packages/twenty-front/src/modules/views/states/selectors/coreViewFromViewIdFamilySelector.ts index 11fb3782df..123c936da2 100644 --- a/packages/twenty-front/src/modules/prefetch/states/selector/prefetchViewFromViewIdFamilySelector.ts +++ b/packages/twenty-front/src/modules/views/states/selectors/coreViewFromViewIdFamilySelector.ts @@ -3,11 +3,11 @@ import { type View } from '@/views/types/View'; import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView'; import { selectorFamily } from 'recoil'; -export const prefetchViewFromViewIdFamilySelector = selectorFamily< +export const coreViewFromViewIdFamilySelector = selectorFamily< View | undefined, { viewId: string } >({ - key: 'prefetchViewFromViewIdFamilySelector', + key: 'coreViewFromViewIdFamilySelector', get: ({ viewId }) => ({ get }) => { diff --git a/packages/twenty-front/src/modules/views/states/selectors/coreViewIdsFromObjectMetadataItemFamilySelector.ts b/packages/twenty-front/src/modules/views/states/selectors/coreViewIdsFromObjectMetadataItemFamilySelector.ts new file mode 100644 index 0000000000..5403c7733b --- /dev/null +++ b/packages/twenty-front/src/modules/views/states/selectors/coreViewIdsFromObjectMetadataItemFamilySelector.ts @@ -0,0 +1,21 @@ +import { coreViewsState } from '@/views/states/coreViewState'; +import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView'; +import { selectorFamily } from 'recoil'; + +export const coreViewIdsFromObjectMetadataItemFamilySelector = selectorFamily< + string[], + { objectMetadataItemId: string } +>({ + key: 'coreViewIdsFromObjectMetadataItemFamilySelector', + get: + ({ objectMetadataItemId }) => + ({ get }) => { + const coreViews = get(coreViewsState); + + const views = coreViews.map(convertCoreViewToView); + + return views + .filter((view) => view.objectMetadataId === objectMetadataItemId) + .map((view) => view.id); + }, +}); diff --git a/packages/twenty-front/src/modules/prefetch/states/selector/prefetchViewLengthFamilySelector.ts b/packages/twenty-front/src/modules/views/states/selectors/coreViewLengthFamilySelector.ts similarity index 67% rename from packages/twenty-front/src/modules/prefetch/states/selector/prefetchViewLengthFamilySelector.ts rename to packages/twenty-front/src/modules/views/states/selectors/coreViewLengthFamilySelector.ts index d8da98643a..cd8effa2a4 100644 --- a/packages/twenty-front/src/modules/prefetch/states/selector/prefetchViewLengthFamilySelector.ts +++ b/packages/twenty-front/src/modules/views/states/selectors/coreViewLengthFamilySelector.ts @@ -1,8 +1,8 @@ import { coreViewsState } from '@/views/states/coreViewState'; import { selector } from 'recoil'; -export const prefetchViewLengthSelector = selector({ - key: 'prefetchViewLengthSelector', +export const coreViewLengthFamilySelector = selector({ + key: 'coreViewLengthFamilySelector', get: ({ get }) => { const coreViews = get(coreViewsState); diff --git a/packages/twenty-front/src/modules/views/states/coreViewsByObjectMetadataIdFamilySelector.ts b/packages/twenty-front/src/modules/views/states/selectors/coreViewsByObjectMetadataIdFamilySelector.ts similarity index 100% rename from packages/twenty-front/src/modules/views/states/coreViewsByObjectMetadataIdFamilySelector.ts rename to packages/twenty-front/src/modules/views/states/selectors/coreViewsByObjectMetadataIdFamilySelector.ts diff --git a/packages/twenty-front/src/modules/prefetch/states/selector/prefetchViewsFromObjectMetadataItemFamilySelector.ts b/packages/twenty-front/src/modules/views/states/selectors/coreViewsFromObjectMetadataItemFamilySelector.ts similarity index 81% rename from packages/twenty-front/src/modules/prefetch/states/selector/prefetchViewsFromObjectMetadataItemFamilySelector.ts rename to packages/twenty-front/src/modules/views/states/selectors/coreViewsFromObjectMetadataItemFamilySelector.ts index 835ecfdc83..0719d922ab 100644 --- a/packages/twenty-front/src/modules/prefetch/states/selector/prefetchViewsFromObjectMetadataItemFamilySelector.ts +++ b/packages/twenty-front/src/modules/views/states/selectors/coreViewsFromObjectMetadataItemFamilySelector.ts @@ -3,11 +3,11 @@ import { type View } from '@/views/types/View'; import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView'; import { selectorFamily } from 'recoil'; -export const prefetchViewsFromObjectMetadataItemFamilySelector = selectorFamily< +export const coreViewsFromObjectMetadataItemFamilySelector = selectorFamily< View[], { objectMetadataItemId: string } >({ - key: 'prefetchViewsFromObjectMetadataItemFamilySelector', + key: 'coreViewsFromObjectMetadataItemFamilySelector', get: ({ objectMetadataItemId }) => ({ get }) => { diff --git a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerContentEffect.tsx b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerContentEffect.tsx index 596d5c5c73..5486c31443 100644 --- a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerContentEffect.tsx +++ b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerContentEffect.tsx @@ -1,10 +1,10 @@ import { useEffect } from 'react'; import { useContextStoreObjectMetadataItemOrThrow } from '@/context-store/hooks/useContextStoreObjectMetadataItemOrThrow'; -import { prefetchViewsFromObjectMetadataItemFamilySelector } from '@/prefetch/states/selector/prefetchViewsFromObjectMetadataItemFamilySelector'; import { useRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentState'; import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; import { useSetRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentState'; +import { coreViewsFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreViewsFromObjectMetadataItemFamilySelector'; import { viewTypeIconMapping } from '@/views/types/ViewType'; import { useGetAvailableFieldsForKanban } from '@/views/view-picker/hooks/useGetAvailableFieldsForKanban'; import { useViewPickerMode } from '@/views/view-picker/hooks/useViewPickerMode'; @@ -48,7 +48,7 @@ export const ViewPickerContentEffect = () => { const { objectMetadataItem } = useContextStoreObjectMetadataItemOrThrow(); const viewsOnCurrentObject = useRecoilValue( - prefetchViewsFromObjectMetadataItemFamilySelector({ + coreViewsFromObjectMetadataItemFamilySelector({ objectMetadataItemId: objectMetadataItem.id, }), ); diff --git a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerFavoriteFoldersDropdown.tsx b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerFavoriteFoldersDropdown.tsx index 0d7b8b9355..58311a3ddf 100644 --- a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerFavoriteFoldersDropdown.tsx +++ b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerFavoriteFoldersDropdown.tsx @@ -1,8 +1,8 @@ import { FavoriteFolderPicker } from '@/favorites/favorite-folder-picker/components/FavoriteFolderPicker'; import { FavoriteFolderPickerEffect } from '@/favorites/favorite-folder-picker/components/FavoriteFolderPickerEffect'; import { FavoriteFolderPickerInstanceContext } from '@/favorites/favorite-folder-picker/states/context/FavoriteFolderPickerInstanceContext'; -import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { useRecoilComponentState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentState'; +import { coreViewFromViewIdFamilySelector } from '@/views/states/selectors/coreViewFromViewIdFamilySelector'; import { VIEW_PICKER_DROPDOWN_ID } from '@/views/view-picker/constants/ViewPickerDropdownId'; import { viewPickerReferenceViewIdComponentState } from '@/views/view-picker/states/viewPickerReferenceViewIdComponentState'; import { useRecoilValue } from 'recoil'; @@ -13,7 +13,7 @@ export const ViewPickerFavoriteFoldersDropdown = () => { ); const view = useRecoilValue( - prefetchViewFromViewIdFamilySelector({ + coreViewFromViewIdFamilySelector({ viewId: viewPickerReferenceViewId ?? '', }), ); diff --git a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerListContent.tsx b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerListContent.tsx index 903c7f6c4b..6c0cb11ad2 100644 --- a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerListContent.tsx +++ b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerListContent.tsx @@ -3,7 +3,6 @@ import { type DropResult } from '@hello-pangea/dnd'; import { type MouseEvent, useCallback } from 'react'; import { useContextStoreObjectMetadataItemOrThrow } from '@/context-store/hooks/useContextStoreObjectMetadataItemOrThrow'; -import { prefetchViewsFromObjectMetadataItemFamilySelector } from '@/prefetch/states/selector/prefetchViewsFromObjectMetadataItemFamilySelector'; import { DraggableItem } from '@/ui/layout/draggable-list/components/DraggableItem'; import { DraggableList } from '@/ui/layout/draggable-list/components/DraggableList'; import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent'; @@ -15,6 +14,7 @@ import { useChangeView } from '@/views/hooks/useChangeView'; import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly'; import { useOpenCreateViewDropdown } from '@/views/hooks/useOpenCreateViewDropown'; import { useUpdateView } from '@/views/hooks/useUpdateView'; +import { coreViewsFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreViewsFromObjectMetadataItemFamilySelector'; import { ViewPickerOptionDropdown } from '@/views/view-picker/components/ViewPickerOptionDropdown'; import { VIEW_PICKER_DROPDOWN_ID } from '@/views/view-picker/constants/ViewPickerDropdownId'; import { useViewPickerMode } from '@/views/view-picker/hooks/useViewPickerMode'; @@ -35,7 +35,7 @@ export const ViewPickerListContent = () => { const { objectMetadataItem } = useContextStoreObjectMetadataItemOrThrow(); const viewsOnCurrentObject = useRecoilValue( - prefetchViewsFromObjectMetadataItemFamilySelector({ + coreViewsFromObjectMetadataItemFamilySelector({ objectMetadataItemId: objectMetadataItem.id, }), ); diff --git a/packages/twenty-front/src/modules/views/view-picker/hooks/useDeleteViewFromCurrentState.ts b/packages/twenty-front/src/modules/views/view-picker/hooks/useDeleteViewFromCurrentState.ts index 6db7f5ceb9..325eb561fa 100644 --- a/packages/twenty-front/src/modules/views/view-picker/hooks/useDeleteViewFromCurrentState.ts +++ b/packages/twenty-front/src/modules/views/view-picker/hooks/useDeleteViewFromCurrentState.ts @@ -1,12 +1,12 @@ import { useRecoilCallback, useRecoilValue } from 'recoil'; import { useContextStoreObjectMetadataItemOrThrow } from '@/context-store/hooks/useContextStoreObjectMetadataItemOrThrow'; -import { prefetchViewsFromObjectMetadataItemFamilySelector } from '@/prefetch/states/selector/prefetchViewsFromObjectMetadataItemFamilySelector'; import { useRecoilComponentCallbackState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackState'; import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue'; import { useChangeView } from '@/views/hooks/useChangeView'; import { useDeleteView } from '@/views/hooks/useDeleteView'; import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly'; +import { coreViewsFromObjectMetadataItemFamilySelector } from '@/views/states/selectors/coreViewsFromObjectMetadataItemFamilySelector'; import { useCloseAndResetViewPicker } from '@/views/view-picker/hooks/useCloseAndResetViewPicker'; import { viewPickerIsDirtyComponentState } from '@/views/view-picker/states/viewPickerIsDirtyComponentState'; import { viewPickerIsPersistingComponentState } from '@/views/view-picker/states/viewPickerIsPersistingComponentState'; @@ -34,7 +34,7 @@ export const useDeleteViewFromCurrentState = (viewBarInstanceId?: string) => { const { objectMetadataItem } = useContextStoreObjectMetadataItemOrThrow(); const viewsOnCurrentObject = useRecoilValue( - prefetchViewsFromObjectMetadataItemFamilySelector({ + coreViewsFromObjectMetadataItemFamilySelector({ objectMetadataItemId: objectMetadataItem.id, }), ); diff --git a/packages/twenty-ui/package.json b/packages/twenty-ui/package.json index 3867bba9ee..d36989f015 100644 --- a/packages/twenty-ui/package.json +++ b/packages/twenty-ui/package.json @@ -46,8 +46,8 @@ }, "files": [ "dist", - "assets", "accessibility", + "assets", "components", "display", "feedback",