diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RecordActionMenuEntriesSetter.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RecordActionMenuEntriesSetter.tsx
index 06217adc7..3e83e18e9 100644
--- a/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RecordActionMenuEntriesSetter.tsx
+++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RecordActionMenuEntriesSetter.tsx
@@ -27,10 +27,6 @@ export const RecordActionMenuEntriesSetter = () => {
FeatureFlagKey.IsWorkflowEnabled,
);
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
-
if (!isDefined(contextStoreCurrentObjectMetadataItem)) {
return null;
}
@@ -40,10 +36,7 @@ export const RecordActionMenuEntriesSetter = () => {
contextStoreTargetedRecordsRule,
);
- const actionConfig = getActionConfig(
- contextStoreCurrentObjectMetadataItem,
- isCommandMenuV2Enabled,
- );
+ const actionConfig = getActionConfig(contextStoreCurrentObjectMetadataItem);
const actionsToRegister = isDefined(viewType)
? Object.values(actionConfig ?? {}).filter((action) =>
diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useDeleteSingleRecordAction.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useDeleteSingleRecordAction.tsx
index acc44cc28..88fd6a02d 100644
--- a/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useDeleteSingleRecordAction.tsx
+++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useDeleteSingleRecordAction.tsx
@@ -1,6 +1,5 @@
import { useSelectedRecordIdOrThrow } from '@/action-menu/actions/record-actions/single-record/hooks/useSelectedRecordIdOrThrow';
import { ActionHookWithObjectMetadataItem } from '@/action-menu/actions/types/ActionHook';
-import { ActionMenuContext } from '@/action-menu/contexts/ActionMenuContext';
import { useDeleteFavorite } from '@/favorites/hooks/useDeleteFavorite';
import { useFavorites } from '@/favorites/hooks/useFavorites';
import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord';
@@ -8,10 +7,9 @@ import { recordStoreFamilyState } from '@/object-record/record-store/states/reco
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
import { useHasObjectReadOnlyPermission } from '@/settings/roles/hooks/useHasObjectReadOnlyPermission';
import { ConfirmationModal } from '@/ui/layout/modal/components/ConfirmationModal';
-import { useRightDrawer } from '@/ui/layout/right-drawer/hooks/useRightDrawer';
import { t } from '@lingui/core/macro';
import { isNull } from '@sniptt/guards';
-import { useCallback, useContext, useState } from 'react';
+import { useCallback, useState } from 'react';
import { useRecoilValue } from 'recoil';
import { isDefined } from 'twenty-shared';
import { getOsControlSymbol } from 'twenty-ui';
@@ -39,8 +37,6 @@ export const useDeleteSingleRecordAction: ActionHookWithObjectMetadataItem = ({
const { sortedFavorites: favorites } = useFavorites();
const { deleteFavorite } = useDeleteFavorite();
- const { closeRightDrawer } = useRightDrawer();
-
const handleDeleteClick = useCallback(async () => {
resetTableRowSelection();
@@ -63,8 +59,6 @@ export const useDeleteSingleRecordAction: ActionHookWithObjectMetadataItem = ({
const isRemoteObject = objectMetadataItem.isRemote;
- const { isInRightDrawer } = useContext(ActionMenuContext);
-
const shouldBeRegistered =
!isRemoteObject &&
isNull(selectedRecord?.deletedAt) &&
@@ -91,9 +85,6 @@ export const useDeleteSingleRecordAction: ActionHookWithObjectMetadataItem = ({
subtitle={t`Are you sure you want to delete this record? It can be recovered from the Command menu (${osControlSymbol} + K).`}
onConfirmClick={() => {
handleDeleteClick();
- if (isInRightDrawer) {
- closeRightDrawer({ emitCloseEvent: false });
- }
}}
confirmButtonText={'Delete Record'}
/>
diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useDestroySingleRecordAction.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useDestroySingleRecordAction.tsx
index ca017aef1..2962e44d0 100644
--- a/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useDestroySingleRecordAction.tsx
+++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useDestroySingleRecordAction.tsx
@@ -1,14 +1,12 @@
import { useSelectedRecordIdOrThrow } from '@/action-menu/actions/record-actions/single-record/hooks/useSelectedRecordIdOrThrow';
import { ActionHookWithObjectMetadataItem } from '@/action-menu/actions/types/ActionHook';
-import { ActionMenuContext } from '@/action-menu/contexts/ActionMenuContext';
import { useDestroyOneRecord } from '@/object-record/hooks/useDestroyOneRecord';
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
import { useHasObjectReadOnlyPermission } from '@/settings/roles/hooks/useHasObjectReadOnlyPermission';
import { AppPath } from '@/types/AppPath';
import { ConfirmationModal } from '@/ui/layout/modal/components/ConfirmationModal';
-import { useRightDrawer } from '@/ui/layout/right-drawer/hooks/useRightDrawer';
-import { useCallback, useContext, useState } from 'react';
+import { useCallback, useState } from 'react';
import { useRecoilValue } from 'recoil';
import { isDefined } from 'twenty-shared';
import { useNavigateApp } from '~/hooks/useNavigateApp';
@@ -35,8 +33,6 @@ export const useDestroySingleRecordAction: ActionHookWithObjectMetadataItem = ({
const selectedRecord = useRecoilValue(recordStoreFamilyState(recordId));
- const { closeRightDrawer } = useRightDrawer();
-
const handleDeleteClick = useCallback(async () => {
resetTableRowSelection();
@@ -54,8 +50,6 @@ export const useDestroySingleRecordAction: ActionHookWithObjectMetadataItem = ({
const isRemoteObject = objectMetadataItem.isRemote;
- const { isInRightDrawer } = useContext(ActionMenuContext);
-
const shouldBeRegistered =
!hasObjectReadOnlyPermission &&
!isRemoteObject &&
@@ -82,9 +76,6 @@ export const useDestroySingleRecordAction: ActionHookWithObjectMetadataItem = ({
}
onConfirmClick={async () => {
await handleDeleteClick();
- if (isInRightDrawer) {
- closeRightDrawer();
- }
}}
confirmButtonText={'Permanently Destroy Record'}
/>
diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useRestoreSingleRecordAction.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useRestoreSingleRecordAction.tsx
index 1462ba37d..80abc8c22 100644
--- a/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useRestoreSingleRecordAction.tsx
+++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/single-record/hooks/useRestoreSingleRecordAction.tsx
@@ -1,6 +1,5 @@
import { useSelectedRecordIdOrThrow } from '@/action-menu/actions/record-actions/single-record/hooks/useSelectedRecordIdOrThrow';
import { ActionHookWithObjectMetadataItem } from '@/action-menu/actions/types/ActionHook';
-import { ActionMenuContext } from '@/action-menu/contexts/ActionMenuContext';
import { contextStoreCurrentViewTypeComponentState } from '@/context-store/states/contextStoreCurrentViewTypeComponentState';
import { ContextStoreViewType } from '@/context-store/types/ContextStoreViewType';
import { useRestoreManyRecords } from '@/object-record/hooks/useRestoreManyRecords';
@@ -9,9 +8,8 @@ import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTabl
import { isSoftDeleteFilterActiveComponentState } from '@/object-record/record-table/states/isSoftDeleteFilterActiveComponentState';
import { useHasObjectReadOnlyPermission } from '@/settings/roles/hooks/useHasObjectReadOnlyPermission';
import { ConfirmationModal } from '@/ui/layout/modal/components/ConfirmationModal';
-import { useRightDrawer } from '@/ui/layout/right-drawer/hooks/useRightDrawer';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
-import { useCallback, useContext, useState } from 'react';
+import { useCallback, useState } from 'react';
import { useRecoilValue } from 'recoil';
import { isDefined } from 'twenty-shared';
@@ -35,8 +33,6 @@ export const useRestoreSingleRecordAction: ActionHookWithObjectMetadataItem = ({
const selectedRecord = useRecoilValue(recordStoreFamilyState(recordId));
- const { closeRightDrawer } = useRightDrawer();
-
const handleRestoreClick = useCallback(async () => {
resetTableRowSelection();
@@ -55,8 +51,6 @@ export const useRestoreSingleRecordAction: ActionHookWithObjectMetadataItem = ({
useRecoilComponentValueV2(contextStoreCurrentViewTypeComponentState) ===
ContextStoreViewType.ShowPage;
- const { isInRightDrawer } = useContext(ActionMenuContext);
-
const shouldBeRegistered =
!isRemoteObject &&
isDefined(selectedRecord?.deletedAt) &&
@@ -73,9 +67,6 @@ export const useRestoreSingleRecordAction: ActionHookWithObjectMetadataItem = ({
const handleConfirmClick = () => {
handleRestoreClick();
- if (isInRightDrawer) {
- closeRightDrawer({ emitCloseEvent: false });
- }
};
return {
diff --git a/packages/twenty-front/src/modules/action-menu/actions/utils/getActionConfig.ts b/packages/twenty-front/src/modules/action-menu/actions/utils/getActionConfig.ts
index c63566eda..a7df5d492 100644
--- a/packages/twenty-front/src/modules/action-menu/actions/utils/getActionConfig.ts
+++ b/packages/twenty-front/src/modules/action-menu/actions/utils/getActionConfig.ts
@@ -1,4 +1,3 @@
-import { DEFAULT_ACTIONS_CONFIG_V1 } from '@/action-menu/actions/record-actions/constants/DefaultActionsConfigV1';
import { DEFAULT_ACTIONS_CONFIG_V2 } from '@/action-menu/actions/record-actions/constants/DefaultActionsConfigV2';
import { WORKFLOW_ACTIONS_CONFIG } from '@/action-menu/actions/record-actions/constants/WorkflowActionsConfig';
import { WORKFLOW_RUNS_ACTIONS_CONFIG } from '@/action-menu/actions/record-actions/constants/WorkflowRunsActionsConfig';
@@ -6,10 +5,7 @@ import { WORKFLOW_VERSIONS_ACTIONS_CONFIG } from '@/action-menu/actions/record-a
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
-export const getActionConfig = (
- objectMetadataItem: ObjectMetadataItem,
- isCommandMenuV2Enabled: boolean,
-) => {
+export const getActionConfig = (objectMetadataItem: ObjectMetadataItem) => {
switch (objectMetadataItem.nameSingular) {
case CoreObjectNameSingular.Workflow:
return WORKFLOW_ACTIONS_CONFIG;
@@ -18,8 +14,6 @@ export const getActionConfig = (
case CoreObjectNameSingular.WorkflowRun:
return WORKFLOW_RUNS_ACTIONS_CONFIG;
default:
- return isCommandMenuV2Enabled
- ? DEFAULT_ACTIONS_CONFIG_V2
- : DEFAULT_ACTIONS_CONFIG_V1;
+ return DEFAULT_ACTIONS_CONFIG_V2;
}
};
diff --git a/packages/twenty-front/src/modules/action-menu/components/CmdEnterActionButton.tsx b/packages/twenty-front/src/modules/action-menu/components/CmdEnterActionButton.tsx
index bbc492cb8..1d113e000 100644
--- a/packages/twenty-front/src/modules/action-menu/components/CmdEnterActionButton.tsx
+++ b/packages/twenty-front/src/modules/action-menu/components/CmdEnterActionButton.tsx
@@ -1,10 +1,7 @@
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
+import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
import { Key } from 'ts-key-enum';
import { Button, getOsControlSymbol } from 'twenty-ui';
-import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
-import { RightDrawerHotkeyScope } from '@/ui/layout/right-drawer/types/RightDrawerHotkeyScope';
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
-import { FeatureFlagKey } from '~/generated/graphql';
export const CmdEnterActionButton = ({
title,
@@ -15,15 +12,10 @@ export const CmdEnterActionButton = ({
onClick: () => void;
disabled?: boolean;
}) => {
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
useScopedHotkeys(
[`${Key.Control}+${Key.Enter}`, `${Key.Meta}+${Key.Enter}`],
() => onClick(),
- isCommandMenuV2Enabled
- ? AppHotkeyScope.CommandMenuOpen
- : RightDrawerHotkeyScope.RightDrawer,
+ AppHotkeyScope.CommandMenuOpen,
[onClick],
);
diff --git a/packages/twenty-front/src/modules/action-menu/components/RecordIndexActionMenu.tsx b/packages/twenty-front/src/modules/action-menu/components/RecordIndexActionMenu.tsx
index 6bad7e63a..ee57a95c9 100644
--- a/packages/twenty-front/src/modules/action-menu/components/RecordIndexActionMenu.tsx
+++ b/packages/twenty-front/src/modules/action-menu/components/RecordIndexActionMenu.tsx
@@ -3,10 +3,8 @@ import { MultipleRecordsActionKeys } from '@/action-menu/actions/record-actions/
import { RecordAgnosticActionMenuEntriesSetter } from '@/action-menu/actions/record-agnostic-actions/components/RecordAgnosticActionMenuEntriesSetter';
import { RunWorkflowRecordAgnosticActionMenuEntriesSetter } from '@/action-menu/actions/record-agnostic-actions/components/RunWorkflowRecordAgnosticActionMenuEntriesSetter';
import { ActionMenuConfirmationModals } from '@/action-menu/components/ActionMenuConfirmationModals';
-import { RecordIndexActionMenuBar } from '@/action-menu/components/RecordIndexActionMenuBar';
import { RecordIndexActionMenuButtons } from '@/action-menu/components/RecordIndexActionMenuButtons';
import { RecordIndexActionMenuDropdown } from '@/action-menu/components/RecordIndexActionMenuDropdown';
-import { RecordIndexActionMenuEffect } from '@/action-menu/components/RecordIndexActionMenuEffect';
import { ActionMenuContext } from '@/action-menu/contexts/ActionMenuContext';
import { contextStoreCurrentObjectMetadataItemComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemComponentState';
import { isRecordIndexLoadMoreLockedComponentState } from '@/object-record/record-index/states/isRecordIndexLoadMoreLockedComponentState';
@@ -21,10 +19,6 @@ export const RecordIndexActionMenu = ({ indexId }: { indexId: string }) => {
contextStoreCurrentObjectMetadataItemComponentState,
);
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
-
const isWorkflowEnabled = useIsFeatureEnabled(
FeatureFlagKey.IsWorkflowEnabled,
);
@@ -54,14 +48,9 @@ export const RecordIndexActionMenu = ({ indexId }: { indexId: string }) => {
},
}}
>
- {isCommandMenuV2Enabled ? (
- <>{!isMobile && }>
- ) : (
-
- )}
+ {!isMobile && }
-
{isWorkflowEnabled && (
diff --git a/packages/twenty-front/src/modules/action-menu/components/RecordIndexActionMenuBar.tsx b/packages/twenty-front/src/modules/action-menu/components/RecordIndexActionMenuBar.tsx
deleted file mode 100644
index bdecf9e79..000000000
--- a/packages/twenty-front/src/modules/action-menu/components/RecordIndexActionMenuBar.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { RecordIndexActionMenuBarAllActionsButton } from '@/action-menu/components/RecordIndexActionMenuBarAllActionsButton';
-import { RecordIndexActionMenuBarEntry } from '@/action-menu/components/RecordIndexActionMenuBarEntry';
-import { actionMenuEntriesComponentSelector } from '@/action-menu/states/actionMenuEntriesComponentSelector';
-import { ActionMenuComponentInstanceContext } from '@/action-menu/states/contexts/ActionMenuComponentInstanceContext';
-import { ActionBarHotkeyScope } from '@/action-menu/types/ActionBarHotKeyScope';
-import { getActionBarIdFromActionMenuId } from '@/action-menu/utils/getActionBarIdFromActionMenuId';
-import { contextStoreNumberOfSelectedRecordsComponentState } from '@/context-store/states/contextStoreNumberOfSelectedRecordsComponentState';
-import { BottomBar } from '@/ui/layout/bottom-bar/components/BottomBar';
-import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
-import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
-import styled from '@emotion/styled';
-
-const StyledLabel = styled.div`
- color: ${({ theme }) => theme.font.color.tertiary};
- font-size: ${({ theme }) => theme.font.size.md};
- font-weight: ${({ theme }) => theme.font.weight.medium};
- padding-left: ${({ theme }) => theme.spacing(2)};
- padding-right: ${({ theme }) => theme.spacing(2)};
-`;
-
-export const RecordIndexActionMenuBar = () => {
- const contextStoreNumberOfSelectedRecords = useRecoilComponentValueV2(
- contextStoreNumberOfSelectedRecordsComponentState,
- );
-
- const actionMenuId = useAvailableComponentInstanceIdOrThrow(
- ActionMenuComponentInstanceContext,
- );
-
- const actionMenuEntries = useRecoilComponentValueV2(
- actionMenuEntriesComponentSelector,
- );
-
- const pinnedEntries = actionMenuEntries.filter((entry) => entry.isPinned);
- if (contextStoreNumberOfSelectedRecords === 0) {
- return null;
- }
-
- return (
-
- {contextStoreNumberOfSelectedRecords} selected:
- {pinnedEntries.map((entry, index) => (
-
- ))}
-
-
- );
-};
diff --git a/packages/twenty-front/src/modules/action-menu/components/RecordIndexActionMenuEffect.tsx b/packages/twenty-front/src/modules/action-menu/components/RecordIndexActionMenuEffect.tsx
deleted file mode 100644
index 66d49da9a..000000000
--- a/packages/twenty-front/src/modules/action-menu/components/RecordIndexActionMenuEffect.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import { useActionMenu } from '@/action-menu/hooks/useActionMenu';
-import { ActionMenuComponentInstanceContext } from '@/action-menu/states/contexts/ActionMenuComponentInstanceContext';
-import { getActionBarIdFromActionMenuId } from '@/action-menu/utils/getActionBarIdFromActionMenuId';
-import { getActionMenuDropdownIdFromActionMenuId } from '@/action-menu/utils/getActionMenuDropdownIdFromActionMenuId';
-import { isCommandMenuOpenedState } from '@/command-menu/states/isCommandMenuOpenedState';
-import { contextStoreNumberOfSelectedRecordsComponentState } from '@/context-store/states/contextStoreNumberOfSelectedRecordsComponentState';
-import { isBottomBarOpenedComponentState } from '@/ui/layout/bottom-bar/states/isBottomBarOpenedComponentState';
-import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState';
-import { useRightDrawer } from '@/ui/layout/right-drawer/hooks/useRightDrawer';
-import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
-import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
-import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
-import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState';
-import { useEffect } from 'react';
-import { useRecoilValue } from 'recoil';
-
-export const RecordIndexActionMenuEffect = () => {
- const contextStoreNumberOfSelectedRecords = useRecoilComponentValueV2(
- contextStoreNumberOfSelectedRecordsComponentState,
- );
-
- const actionMenuId = useAvailableComponentInstanceIdOrThrow(
- ActionMenuComponentInstanceContext,
- );
-
- const { openActionBar, closeActionBar } = useActionMenu(actionMenuId);
-
- // Using closeActionBar here was causing a bug because it goes back to the
- // previous hotkey scope, and we don't want that here.
- const setIsBottomBarOpened = useSetRecoilComponentStateV2(
- isBottomBarOpenedComponentState,
- getActionBarIdFromActionMenuId(actionMenuId),
- );
-
- const isDropdownOpen = useRecoilValue(
- extractComponentState(
- isDropdownOpenComponentState,
- getActionMenuDropdownIdFromActionMenuId(actionMenuId),
- ),
- );
- const { isRightDrawerOpen } = useRightDrawer();
-
- const isCommandMenuOpened = useRecoilValue(isCommandMenuOpenedState);
-
- useEffect(() => {
- if (
- contextStoreNumberOfSelectedRecords > 0 &&
- !isDropdownOpen &&
- !isRightDrawerOpen &&
- !isCommandMenuOpened
- ) {
- // We only handle opening the ActionMenuBar here, not the Dropdown.
- // The Dropdown is already managed by sync handlers for events like
- // right-click to open and click outside to close.
- openActionBar();
- }
- if (contextStoreNumberOfSelectedRecords === 0 && isDropdownOpen) {
- closeActionBar();
- }
- }, [
- contextStoreNumberOfSelectedRecords,
- openActionBar,
- closeActionBar,
- isDropdownOpen,
- isRightDrawerOpen,
- isCommandMenuOpened,
- ]);
-
- useEffect(() => {
- if (isRightDrawerOpen || isCommandMenuOpened) {
- setIsBottomBarOpened(false);
- }
- }, [isRightDrawerOpen, isCommandMenuOpened, setIsBottomBarOpened]);
-
- return null;
-};
diff --git a/packages/twenty-front/src/modules/action-menu/components/RecordShowActionMenu.tsx b/packages/twenty-front/src/modules/action-menu/components/RecordShowActionMenu.tsx
index cdc648865..bc6c74b76 100644
--- a/packages/twenty-front/src/modules/action-menu/components/RecordShowActionMenu.tsx
+++ b/packages/twenty-front/src/modules/action-menu/components/RecordShowActionMenu.tsx
@@ -5,40 +5,19 @@ import { ActionMenuConfirmationModals } from '@/action-menu/components/ActionMen
import { RecordShowActionMenuButtons } from '@/action-menu/components/RecordShowActionMenuButtons';
import { ActionMenuContext } from '@/action-menu/contexts/ActionMenuContext';
import { contextStoreCurrentObjectMetadataItemComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemComponentState';
-import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
-import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { FeatureFlagKey } from '~/generated/graphql';
-import { RecordShowPageBaseHeader } from '~/pages/object-record/RecordShowPageBaseHeader';
-export const RecordShowActionMenu = ({
- isFavorite,
- record,
- objectMetadataItem,
- objectNameSingular,
- handleFavoriteButtonClick,
-}: {
- isFavorite: boolean;
- record: ObjectRecord | undefined;
- objectMetadataItem: ObjectMetadataItem;
- objectNameSingular: string;
- handleFavoriteButtonClick: () => void;
-}) => {
+export const RecordShowActionMenu = () => {
const contextStoreCurrentObjectMetadataItem = useRecoilComponentValueV2(
contextStoreCurrentObjectMetadataItemComponentState,
);
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
-
const isWorkflowEnabled = useIsFeatureEnabled(
FeatureFlagKey.IsWorkflowEnabled,
);
- // TODO: refactor RecordShowPageBaseHeader to use the context store
-
return (
<>
{contextStoreCurrentObjectMetadataItem && (
@@ -48,19 +27,7 @@ export const RecordShowActionMenu = ({
onActionExecutedCallback: () => {},
}}
>
- {isCommandMenuV2Enabled ? (
-
- ) : (
-
- )}
+
diff --git a/packages/twenty-front/src/modules/action-menu/components/RightDrawerActionMenuDropdown.tsx b/packages/twenty-front/src/modules/action-menu/components/RightDrawerActionMenuDropdown.tsx
index b7e7f219e..cedd1f732 100644
--- a/packages/twenty-front/src/modules/action-menu/components/RightDrawerActionMenuDropdown.tsx
+++ b/packages/twenty-front/src/modules/action-menu/components/RightDrawerActionMenuDropdown.tsx
@@ -6,17 +6,14 @@ import { getRightDrawerActionMenuDropdownIdFromActionMenuId } from '@/action-men
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
import { useDropdownV2 } from '@/ui/layout/dropdown/hooks/useDropdownV2';
-import { RightDrawerHotkeyScope } from '@/ui/layout/right-drawer/types/RightDrawerHotkeyScope';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { useTheme } from '@emotion/react';
import { i18n } from '@lingui/core';
import { Key } from 'ts-key-enum';
-import { Button, MenuItem, getOsControlSymbol } from 'twenty-ui';
-import { FeatureFlagKey } from '~/generated/graphql';
+import { Button, getOsControlSymbol, MenuItem } from 'twenty-ui';
export const RightDrawerActionMenuDropdown = () => {
const actionMenuEntries = useRecoilComponentValueV2(
@@ -31,10 +28,6 @@ export const RightDrawerActionMenuDropdown = () => {
const theme = useTheme();
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
-
useScopedHotkeys(
[Key.Escape, 'ctrl+o,meta+o'],
() => {
@@ -53,9 +46,7 @@ export const RightDrawerActionMenuDropdown = () => {
getRightDrawerActionMenuDropdownIdFromActionMenuId(actionMenuId),
);
},
- isCommandMenuV2Enabled
- ? AppHotkeyScope.CommandMenuOpen
- : RightDrawerHotkeyScope.RightDrawer,
+ AppHotkeyScope.CommandMenuOpen,
[openDropdown],
);
diff --git a/packages/twenty-front/src/modules/action-menu/components/__stories__/RecordIndexActionMenuBar.stories.tsx b/packages/twenty-front/src/modules/action-menu/components/__stories__/RecordIndexActionMenuBar.stories.tsx
deleted file mode 100644
index 539f45776..000000000
--- a/packages/twenty-front/src/modules/action-menu/components/__stories__/RecordIndexActionMenuBar.stories.tsx
+++ /dev/null
@@ -1,141 +0,0 @@
-import { RecordIndexActionMenuBar } from '@/action-menu/components/RecordIndexActionMenuBar';
-import { actionMenuEntriesComponentState } from '@/action-menu/states/actionMenuEntriesComponentState';
-import { ActionMenuComponentInstanceContext } from '@/action-menu/states/contexts/ActionMenuComponentInstanceContext';
-import {
- ActionMenuEntry,
- ActionMenuEntryScope,
- ActionMenuEntryType,
-} from '@/action-menu/types/ActionMenuEntry';
-import { getActionBarIdFromActionMenuId } from '@/action-menu/utils/getActionBarIdFromActionMenuId';
-import { contextStoreNumberOfSelectedRecordsComponentState } from '@/context-store/states/contextStoreNumberOfSelectedRecordsComponentState';
-import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
-import { ContextStoreComponentInstanceContext } from '@/context-store/states/contexts/ContextStoreComponentInstanceContext';
-import { RecordFilterGroupsComponentInstanceContext } from '@/object-record/record-filter-group/states/context/RecordFilterGroupsComponentInstanceContext';
-import { RecordFiltersComponentInstanceContext } from '@/object-record/record-filter/states/context/RecordFiltersComponentInstanceContext';
-import { RecordSortsComponentInstanceContext } from '@/object-record/record-sort/states/context/RecordSortsComponentInstanceContext';
-import { isBottomBarOpenedComponentState } from '@/ui/layout/bottom-bar/states/isBottomBarOpenedComponentState';
-import { msg } from '@lingui/core/macro';
-import { expect, jest } from '@storybook/jest';
-import { Meta, StoryObj } from '@storybook/react';
-import { userEvent, waitFor, within } from '@storybook/test';
-import { RecoilRoot } from 'recoil';
-import { IconTrash, RouterDecorator } from 'twenty-ui';
-import { I18nFrontDecorator } from '~/testing/decorators/I18nFrontDecorator';
-
-const deleteMock = jest.fn();
-
-const meta: Meta = {
- title: 'Modules/ActionMenu/RecordIndexActionMenuBar',
- component: RecordIndexActionMenuBar,
- decorators: [
- RouterDecorator,
- I18nFrontDecorator,
- (Story) => (
-
-
-
-
- {
- set(
- contextStoreTargetedRecordsRuleComponentState.atomFamily({
- instanceId: 'story-action-menu',
- }),
- {
- mode: 'selection',
- selectedRecordIds: ['1', '2', '3'],
- },
- );
- set(
- contextStoreNumberOfSelectedRecordsComponentState.atomFamily(
- {
- instanceId: 'story-action-menu',
- },
- ),
- 3,
- );
- const map = new Map();
- map.set('delete', {
- isPinned: true,
- scope: ActionMenuEntryScope.RecordSelection,
- type: ActionMenuEntryType.Standard,
- key: 'delete',
- label: msg`Delete`,
- position: 0,
- Icon: IconTrash,
- onClick: deleteMock,
- });
- set(
- actionMenuEntriesComponentState.atomFamily({
- instanceId: 'story-action-menu',
- }),
- map,
- );
- set(
- isBottomBarOpenedComponentState.atomFamily({
- instanceId:
- getActionBarIdFromActionMenuId('story-action-menu'),
- }),
- true,
- );
- }}
- >
-
-
-
-
-
-
-
-
- ),
- ],
- args: {
- actionMenuId: 'story-action-menu',
- },
-};
-
-export default meta;
-
-type Story = StoryObj;
-
-export const Default: Story = {
- args: {
- actionMenuId: 'story-action-menu',
- },
-};
-
-export const WithCustomSelection: Story = {
- args: {
- actionMenuId: 'story-action-menu',
- },
- play: async ({ canvasElement }) => {
- const canvas = within(canvasElement);
- const selectionText = await canvas.findByText('3 selected:');
- expect(selectionText).toBeInTheDocument();
- },
-};
-
-export const WithButtonClicks: Story = {
- args: {
- actionMenuId: 'story-action-menu',
- },
- play: async ({ canvasElement }) => {
- const canvas = within(canvasElement);
- const deleteButton = await canvas.findByText('Delete');
- await userEvent.click(deleteButton);
- await waitFor(() => {
- expect(deleteMock).toHaveBeenCalled();
- });
- },
-};
diff --git a/packages/twenty-front/src/modules/action-menu/hooks/__tests__/useActionMenu.test.ts b/packages/twenty-front/src/modules/action-menu/hooks/__tests__/useActionMenu.test.ts
deleted file mode 100644
index aa0078596..000000000
--- a/packages/twenty-front/src/modules/action-menu/hooks/__tests__/useActionMenu.test.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import { getActionBarIdFromActionMenuId } from '@/action-menu/utils/getActionBarIdFromActionMenuId';
-import { getActionMenuDropdownIdFromActionMenuId } from '@/action-menu/utils/getActionMenuDropdownIdFromActionMenuId';
-import { renderHook } from '@testing-library/react';
-import { act } from 'react';
-import { useActionMenu } from '../useActionMenu';
-
-const openBottomBar = jest.fn();
-const closeBottomBar = jest.fn();
-const openDropdown = jest.fn();
-const closeDropdown = jest.fn();
-
-jest.mock('@/ui/layout/bottom-bar/hooks/useBottomBar', () => ({
- useBottomBar: jest.fn(() => ({
- openBottomBar: openBottomBar,
- closeBottomBar: closeBottomBar,
- })),
-}));
-
-jest.mock('@/ui/layout/dropdown/hooks/useDropdownV2', () => ({
- useDropdownV2: jest.fn(() => ({
- openDropdown: openDropdown,
- closeDropdown: closeDropdown,
- })),
-}));
-
-describe('useActionMenu', () => {
- const actionMenuId = 'test-action-menu';
- const actionBarId = getActionBarIdFromActionMenuId(actionMenuId);
- const actionMenuDropdownId =
- getActionMenuDropdownIdFromActionMenuId(actionMenuId);
-
- it('should return the correct functions', () => {
- const { result } = renderHook(() => useActionMenu(actionMenuId));
-
- expect(result.current).toHaveProperty('openActionMenuDropdown');
- expect(result.current).toHaveProperty('openActionBar');
- expect(result.current).toHaveProperty('closeActionBar');
- expect(result.current).toHaveProperty('closeActionMenuDropdown');
- });
-
- it('should call the correct functions when opening action menu dropdown', () => {
- const { result } = renderHook(() => useActionMenu(actionMenuId));
-
- act(() => {
- result.current.openActionMenuDropdown();
- });
-
- expect(closeBottomBar).toHaveBeenCalledWith(actionBarId);
- expect(openDropdown).toHaveBeenCalledWith(actionMenuDropdownId);
- });
-
- it('should call the correct functions when opening action bar', () => {
- const { result } = renderHook(() => useActionMenu(actionMenuId));
-
- act(() => {
- result.current.openActionBar();
- });
-
- expect(closeDropdown).toHaveBeenCalledWith(actionMenuDropdownId);
- expect(openBottomBar).toHaveBeenCalledWith(actionBarId);
- });
-
- it('should call the correct function when closing action menu dropdown', () => {
- const { result } = renderHook(() => useActionMenu(actionMenuId));
-
- act(() => {
- result.current.closeActionMenuDropdown();
- });
-
- expect(closeDropdown).toHaveBeenCalledWith(actionMenuDropdownId);
- });
-
- it('should call the correct function when closing action bar', () => {
- const { result } = renderHook(() => useActionMenu(actionMenuId));
-
- act(() => {
- result.current.closeActionBar();
- });
-
- expect(closeBottomBar).toHaveBeenCalledWith(actionBarId);
- });
-});
diff --git a/packages/twenty-front/src/modules/action-menu/hooks/useActionMenu.ts b/packages/twenty-front/src/modules/action-menu/hooks/useActionMenu.ts
deleted file mode 100644
index 109bd1ee5..000000000
--- a/packages/twenty-front/src/modules/action-menu/hooks/useActionMenu.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import { getActionBarIdFromActionMenuId } from '@/action-menu/utils/getActionBarIdFromActionMenuId';
-import { getActionMenuDropdownIdFromActionMenuId } from '@/action-menu/utils/getActionMenuDropdownIdFromActionMenuId';
-import { useBottomBar } from '@/ui/layout/bottom-bar/hooks/useBottomBar';
-import { useDropdownV2 } from '@/ui/layout/dropdown/hooks/useDropdownV2';
-
-export const useActionMenu = (actionMenuId: string) => {
- const { openDropdown, closeDropdown } = useDropdownV2();
- const { openBottomBar, closeBottomBar } = useBottomBar();
-
- const actionBarId = getActionBarIdFromActionMenuId(actionMenuId);
- const actionMenuDropdownId =
- getActionMenuDropdownIdFromActionMenuId(actionMenuId);
-
- const openActionMenuDropdown = () => {
- closeBottomBar(actionBarId);
- openDropdown(actionMenuDropdownId);
- };
-
- const openActionBar = () => {
- closeDropdown(actionMenuDropdownId);
- openBottomBar(actionBarId);
- };
-
- const closeActionMenuDropdown = () => {
- closeDropdown(actionMenuDropdownId);
- };
-
- const closeActionBar = () => {
- closeBottomBar(actionBarId);
- };
-
- return {
- openActionMenuDropdown,
- openActionBar,
- closeActionBar,
- closeActionMenuDropdown,
- };
-};
diff --git a/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventParticipantsResponseStatusField.tsx b/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventParticipantsResponseStatusField.tsx
index 2f29177c5..1e9e1a761 100644
--- a/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventParticipantsResponseStatusField.tsx
+++ b/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventParticipantsResponseStatusField.tsx
@@ -1,7 +1,6 @@
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled';
import { useRef } from 'react';
-import { useRecoilValue } from 'recoil';
import { IconCheck, IconQuestionMark, IconX } from 'twenty-ui';
import { CalendarEventParticipant } from '@/activities/calendar/types/CalendarEventParticipant';
@@ -9,7 +8,6 @@ import { ParticipantChip } from '@/activities/components/ParticipantChip';
import { PropertyBox } from '@/object-record/record-inline-cell/property-box/components/PropertyBox';
import { EllipsisDisplay } from '@/ui/field/display/components/EllipsisDisplay';
import { ExpandableList } from '@/ui/layout/expandable-list/components/ExpandableList';
-import { isRightDrawerAnimationCompletedState } from '@/ui/layout/right-drawer/states/isRightDrawerAnimationCompletedState';
const StyledInlineCellBaseContainer = styled.div`
align-items: center;
@@ -68,9 +66,6 @@ export const CalendarEventParticipantsResponseStatusField = ({
participants: CalendarEventParticipant[];
}) => {
const theme = useTheme();
- const isRightDrawerAnimationCompleted = useRecoilValue(
- isRightDrawerAnimationCompletedState,
- );
const Icon = {
Yes: ,
@@ -103,9 +98,7 @@ export const CalendarEventParticipantsResponseStatusField = ({
- {isRightDrawerAnimationCompleted && (
- {styledChips}
- )}
+ {styledChips}
diff --git a/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventRow.tsx b/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventRow.tsx
index 9d986988c..60deb9f74 100644
--- a/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventRow.tsx
+++ b/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventRow.tsx
@@ -6,13 +6,11 @@ import { useRecoilValue } from 'recoil';
import { CalendarCurrentEventCursor } from '@/activities/calendar/components/CalendarCurrentEventCursor';
import { CalendarContext } from '@/activities/calendar/contexts/CalendarContext';
-import { useOpenCalendarEventRightDrawer } from '@/activities/calendar/right-drawer/hooks/useOpenCalendarEventRightDrawer';
import { getCalendarEventEndDate } from '@/activities/calendar/utils/getCalendarEventEndDate';
import { getCalendarEventStartDate } from '@/activities/calendar/utils/getCalendarEventStartDate';
import { hasCalendarEventEnded } from '@/activities/calendar/utils/hasCalendarEventEnded';
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { isDefined } from 'twenty-shared';
import {
Avatar,
@@ -24,7 +22,6 @@ import {
} from 'twenty-ui';
import {
CalendarChannelVisibility,
- FeatureFlagKey,
TimelineCalendarEvent,
} from '~/generated-metadata/graphql';
@@ -117,11 +114,7 @@ export const CalendarEventRow = ({
const theme = useTheme();
const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState);
const { displayCurrentEventCursor = false } = useContext(CalendarContext);
- const { openCalendarEventRightDrawer } = useOpenCalendarEventRightDrawer();
const { openCalendarEventInCommandMenu } = useCommandMenu();
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
const startsAt = getCalendarEventStartDate(calendarEvent);
const endsAt = getCalendarEventEndDate(calendarEvent);
@@ -145,11 +138,7 @@ export const CalendarEventRow = ({
onClick={
showTitle
? () => {
- if (isCommandMenuV2Enabled) {
- openCalendarEventInCommandMenu(calendarEvent.id);
- } else {
- openCalendarEventRightDrawer(calendarEvent.id);
- }
+ openCalendarEventInCommandMenu(calendarEvent.id);
}
: undefined
}
diff --git a/packages/twenty-front/src/modules/activities/calendar/right-drawer/components/RightDrawerCalendarEvent.tsx b/packages/twenty-front/src/modules/activities/calendar/right-drawer/components/RightDrawerCalendarEvent.tsx
deleted file mode 100644
index 4e3ee38ae..000000000
--- a/packages/twenty-front/src/modules/activities/calendar/right-drawer/components/RightDrawerCalendarEvent.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { useRecoilValue } from 'recoil';
-
-import { CalendarEventDetails } from '@/activities/calendar/components/CalendarEventDetails';
-import { CalendarEventDetailsEffect } from '@/activities/calendar/components/CalendarEventDetailsEffect';
-import { FIND_ONE_CALENDAR_EVENT_OPERATION_SIGNATURE } from '@/activities/calendar/graphql/operation-signatures/FindOneCalendarEventOperationSignature';
-import { CalendarEvent } from '@/activities/calendar/types/CalendarEvent';
-import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord';
-import { viewableRecordIdState } from '@/object-record/record-right-drawer/states/viewableRecordIdState';
-import { RecordValueSetterEffect } from '@/object-record/record-store/components/RecordValueSetterEffect';
-import { RecordFieldValueSelectorContextProvider } from '@/object-record/record-store/contexts/RecordFieldValueSelectorContext';
-import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore';
-
-export const RightDrawerCalendarEvent = () => {
- const { upsertRecords } = useUpsertRecordsInStore();
- const viewableRecordId = useRecoilValue(viewableRecordIdState);
-
- const { record: calendarEvent } = useFindOneRecord({
- objectNameSingular:
- FIND_ONE_CALENDAR_EVENT_OPERATION_SIGNATURE.objectNameSingular,
- objectRecordId: viewableRecordId ?? '',
- recordGqlFields: FIND_ONE_CALENDAR_EVENT_OPERATION_SIGNATURE.fields,
- onCompleted: (record) => upsertRecords([record]),
- });
-
- if (!calendarEvent) {
- return null;
- }
-
- return (
-
-
-
-
-
- );
-};
diff --git a/packages/twenty-front/src/modules/activities/calendar/right-drawer/hooks/__tests__/useOpenCalendarEventRightDrawer.test.tsx b/packages/twenty-front/src/modules/activities/calendar/right-drawer/hooks/__tests__/useOpenCalendarEventRightDrawer.test.tsx
deleted file mode 100644
index 980160850..000000000
--- a/packages/twenty-front/src/modules/activities/calendar/right-drawer/hooks/__tests__/useOpenCalendarEventRightDrawer.test.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import { act, renderHook } from '@testing-library/react';
-import { RecoilRoot, useRecoilValue } from 'recoil';
-
-import { useOpenCalendarEventRightDrawer } from '@/activities/calendar/right-drawer/hooks/useOpenCalendarEventRightDrawer';
-import { viewableRecordIdState } from '@/object-record/record-right-drawer/states/viewableRecordIdState';
-import { isRightDrawerOpenState } from '@/ui/layout/right-drawer/states/isRightDrawerOpenState';
-
-describe('useOpenCalendarEventRightDrawer', () => {
- it('opens the right drawer with the calendar event', () => {
- const { result } = renderHook(
- () => {
- const isRightDrawerOpen = useRecoilValue(isRightDrawerOpenState);
- const viewableRecordId = useRecoilValue(viewableRecordIdState);
- return {
- ...useOpenCalendarEventRightDrawer(),
- isRightDrawerOpen,
- viewableRecordId,
- };
- },
- { wrapper: RecoilRoot },
- );
-
- expect(result.current.isRightDrawerOpen).toBe(false);
- expect(result.current.viewableRecordId).toBeNull();
-
- act(() => {
- result.current.openCalendarEventRightDrawer('1234');
- });
-
- expect(result.current.isRightDrawerOpen).toBe(true);
- expect(result.current.viewableRecordId).toBe('1234');
- });
-});
diff --git a/packages/twenty-front/src/modules/activities/calendar/right-drawer/hooks/useOpenCalendarEventRightDrawer.ts b/packages/twenty-front/src/modules/activities/calendar/right-drawer/hooks/useOpenCalendarEventRightDrawer.ts
deleted file mode 100644
index 4575eb875..000000000
--- a/packages/twenty-front/src/modules/activities/calendar/right-drawer/hooks/useOpenCalendarEventRightDrawer.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { useSetRecoilState } from 'recoil';
-
-import { viewableRecordIdState } from '@/object-record/record-right-drawer/states/viewableRecordIdState';
-import { useRightDrawer } from '@/ui/layout/right-drawer/hooks/useRightDrawer';
-import { RightDrawerHotkeyScope } from '@/ui/layout/right-drawer/types/RightDrawerHotkeyScope';
-import { RightDrawerPages } from '@/ui/layout/right-drawer/types/RightDrawerPages';
-import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
-import { IconCalendarEvent } from 'twenty-ui';
-
-export const useOpenCalendarEventRightDrawer = () => {
- const { openRightDrawer } = useRightDrawer();
- const setHotkeyScope = useSetHotkeyScope();
- const setViewableRecordId = useSetRecoilState(viewableRecordIdState);
-
- const openCalendarEventRightDrawer = (calendarEventId: string) => {
- setHotkeyScope(RightDrawerHotkeyScope.RightDrawer, { goto: false });
- openRightDrawer(RightDrawerPages.ViewCalendarEvent, {
- title: 'Calendar Event',
- Icon: IconCalendarEvent,
- });
- setViewableRecordId(calendarEventId);
- };
-
- return { openCalendarEventRightDrawer };
-};
diff --git a/packages/twenty-front/src/modules/activities/components/ActivityRichTextEditor.tsx b/packages/twenty-front/src/modules/activities/components/ActivityRichTextEditor.tsx
index 036f2510e..112a9694f 100644
--- a/packages/twenty-front/src/modules/activities/components/ActivityRichTextEditor.tsx
+++ b/packages/twenty-front/src/modules/activities/components/ActivityRichTextEditor.tsx
@@ -1,38 +1,35 @@
import { useApolloClient } from '@apollo/client';
-import { PartialBlock } from '@blocknote/core';
-import { useCreateBlockNote } from '@blocknote/react';
-import { isArray, isNonEmptyString } from '@sniptt/guards';
import { useCallback, useMemo } from 'react';
import { useRecoilCallback, useRecoilState } from 'recoil';
-import { Key } from 'ts-key-enum';
-import { useDebouncedCallback } from 'use-debounce';
import { v4 } from 'uuid';
+import { BLOCK_SCHEMA } from '@/activities/blocks/constants/Schema';
+import { useUploadAttachmentFile } from '@/activities/files/hooks/useUploadAttachmentFile';
import { useUpsertActivity } from '@/activities/hooks/useUpsertActivity';
import { canCreateActivityState } from '@/activities/states/canCreateActivityState';
import { ActivityEditorHotkeyScope } from '@/activities/types/ActivityEditorHotkeyScope';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
+import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { modifyRecordFromCache } from '@/object-record/cache/utils/modifyRecordFromCache';
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
-import { RightDrawerHotkeyScope } from '@/ui/layout/right-drawer/types/RightDrawerHotkeyScope';
import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
+import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
import { isNonTextWritingKey } from '@/ui/utilities/hotkey/utils/isNonTextWritingKey';
+import { Key } from 'ts-key-enum';
import { isDefined } from 'twenty-shared';
+import { useDebouncedCallback } from 'use-debounce';
-import { BLOCK_SCHEMA } from '@/activities/blocks/constants/Schema';
import { ActivityRichTextEditorChangeOnActivityIdEffect } from '@/activities/components/ActivityRichTextEditorChangeOnActivityIdEffect';
-import { useUploadAttachmentFile } from '@/activities/files/hooks/useUploadAttachmentFile';
import { Note } from '@/activities/types/Note';
import { Task } from '@/activities/types/Task';
-import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { BlockEditor } from '@/ui/input/editor/components/BlockEditor';
-import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
+import { PartialBlock } from '@blocknote/core';
import '@blocknote/core/fonts/inter.css';
import '@blocknote/mantine/style.css';
+import { useCreateBlockNote } from '@blocknote/react';
import '@blocknote/react/style.css';
-import { FeatureFlagKey } from '~/generated/graphql';
+import { isArray, isNonEmptyString } from '@sniptt/guards';
type ActivityRichTextEditorProps = {
activityId: string;
@@ -50,10 +47,6 @@ export const ActivityRichTextEditor = ({
const cache = useApolloClient().cache;
const activity = activityInStore as Task | Note | null;
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
-
const { objectMetadataItem: objectMetadataItemActivity } =
useObjectMetadataItem({
objectNameSingular: activityObjectNameSingular,
@@ -280,9 +273,7 @@ export const ActivityRichTextEditor = ({
editor.setTextCursorPosition(newBlockId, 'end');
editor.focus();
},
- isCommandMenuV2Enabled
- ? AppHotkeyScope.CommandMenuOpen
- : RightDrawerHotkeyScope.RightDrawer,
+ AppHotkeyScope.CommandMenuOpen,
[],
{
preventDefault: false,
diff --git a/packages/twenty-front/src/modules/activities/copilot/right-drawer/components/RightDrawerAIChat.tsx b/packages/twenty-front/src/modules/activities/copilot/right-drawer/components/RightDrawerAIChat.tsx
deleted file mode 100644
index 4ad2c423c..000000000
--- a/packages/twenty-front/src/modules/activities/copilot/right-drawer/components/RightDrawerAIChat.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-import styled from '@emotion/styled';
-import { useSetRecoilState } from 'recoil';
-
-import { copilotQueryState } from '@/activities/copilot/right-drawer/states/copilotQueryState';
-import {
- AutosizeTextInput,
- AutosizeTextInputVariant,
-} from '@/ui/input/components/AutosizeTextInput';
-
-const StyledContainer = styled.div`
- box-sizing: border-box;
- display: flex;
- flex-direction: column;
- height: 100%;
- justify-content: flex-start;
- overflow-y: auto;
- position: relative;
-`;
-
-const StyledChatArea = styled.div`
- flex: 1;
- display: flex;
- flex-direction: column;
- overflow-y: scroll;
- padding: ${({ theme }) => theme.spacing(6)};
- padding-bottom: 0px;
-`;
-
-const StyledNewMessageArea = styled.div`
- display: flex;
- flex-direction: column;
- padding: ${({ theme }) => theme.spacing(6)};
- padding-top: 0px;
-`;
-
-export const RightDrawerAIChat = () => {
- const setCopilotQuery = useSetRecoilState(copilotQueryState);
-
- return (
-
- {/* TODO */}
-
- {
- setCopilotQuery(text);
- }}
- />
-
-
- );
-};
diff --git a/packages/twenty-front/src/modules/activities/copilot/right-drawer/hooks/useOpenCopilotRightDrawer.ts b/packages/twenty-front/src/modules/activities/copilot/right-drawer/hooks/useOpenCopilotRightDrawer.ts
deleted file mode 100644
index 8b3e8b4cb..000000000
--- a/packages/twenty-front/src/modules/activities/copilot/right-drawer/hooks/useOpenCopilotRightDrawer.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { useRightDrawer } from '@/ui/layout/right-drawer/hooks/useRightDrawer';
-import { RightDrawerHotkeyScope } from '@/ui/layout/right-drawer/types/RightDrawerHotkeyScope';
-import { RightDrawerPages } from '@/ui/layout/right-drawer/types/RightDrawerPages';
-import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
-import { IconSparkles } from 'twenty-ui';
-
-export const useOpenCopilotRightDrawer = () => {
- const { openRightDrawer } = useRightDrawer();
- const setHotkeyScope = useSetHotkeyScope();
-
- return () => {
- setHotkeyScope(RightDrawerHotkeyScope.RightDrawer, { goto: false });
- openRightDrawer(RightDrawerPages.Copilot, {
- title: 'Copilot',
- Icon: IconSparkles,
- });
- };
-};
diff --git a/packages/twenty-front/src/modules/activities/copilot/right-drawer/states/copilotQueryState.ts b/packages/twenty-front/src/modules/activities/copilot/right-drawer/states/copilotQueryState.ts
deleted file mode 100644
index b2782ace4..000000000
--- a/packages/twenty-front/src/modules/activities/copilot/right-drawer/states/copilotQueryState.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { createState } from '@ui/utilities/state/utils/createState';
-
-export const copilotQueryState = createState({
- key: 'activities/copilot-query',
- defaultValue: '',
-});
diff --git a/packages/twenty-front/src/modules/activities/emails/components/EmailThreadPreview.tsx b/packages/twenty-front/src/modules/activities/emails/components/EmailThreadPreview.tsx
index aa7184f22..5becd7538 100644
--- a/packages/twenty-front/src/modules/activities/emails/components/EmailThreadPreview.tsx
+++ b/packages/twenty-front/src/modules/activities/emails/components/EmailThreadPreview.tsx
@@ -1,19 +1,10 @@
import styled from '@emotion/styled';
-import { useRecoilCallback } from 'recoil';
import { Avatar, GRAY_SCALE } from 'twenty-ui';
import { ActivityRow } from '@/activities/components/ActivityRow';
import { EmailThreadNotShared } from '@/activities/emails/components/EmailThreadNotShared';
-import { useEmailThread } from '@/activities/emails/hooks/useEmailThread';
-import { emailThreadIdWhenEmailThreadWasClosedState } from '@/activities/emails/states/lastViewableEmailThreadIdState';
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
-import { useRightDrawer } from '@/ui/layout/right-drawer/hooks/useRightDrawer';
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
-import {
- FeatureFlagKey,
- MessageChannelVisibility,
- TimelineThread,
-} from '~/generated/graphql';
+import { MessageChannelVisibility, TimelineThread } from '~/generated/graphql';
import { formatToHumanReadableDate } from '~/utils/date-utils';
const StyledHeading = styled.div<{ unread: boolean }>`
@@ -77,11 +68,7 @@ type EmailThreadPreviewProps = {
};
export const EmailThreadPreview = ({ thread }: EmailThreadPreviewProps) => {
- const { openEmailThread } = useEmailThread();
const { openEmailThreadInCommandMenu } = useCommandMenu();
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
const visibility = thread.visibility;
@@ -103,48 +90,19 @@ export const EmailThreadPreview = ({ thread }: EmailThreadPreviewProps) => {
false,
];
- const { isSameEventThanRightDrawerClose } = useRightDrawer();
+ const handleThreadClick = () => {
+ const canOpen =
+ thread.visibility === MessageChannelVisibility.SHARE_EVERYTHING;
- const handleThreadClick = useRecoilCallback(
- ({ snapshot }) =>
- (event: React.MouseEvent) => {
- const clickJustTriggeredEmailDrawerClose =
- isSameEventThanRightDrawerClose(event.nativeEvent);
-
- const emailThreadIdWhenEmailThreadWasClosed = snapshot
- .getLoadable(emailThreadIdWhenEmailThreadWasClosedState)
- .getValue();
-
- const canOpen =
- thread.visibility === MessageChannelVisibility.SHARE_EVERYTHING &&
- (!clickJustTriggeredEmailDrawerClose ||
- emailThreadIdWhenEmailThreadWasClosed !== thread.id);
-
- if (canOpen) {
- if (isCommandMenuV2Enabled) {
- openEmailThreadInCommandMenu(thread.id);
- } else {
- openEmailThread(thread.id);
- }
- }
- },
- [
- isCommandMenuV2Enabled,
- isSameEventThanRightDrawerClose,
- openEmailThread,
- openEmailThreadInCommandMenu,
- thread.id,
- thread.visibility,
- ],
- );
+ if (canOpen) {
+ openEmailThreadInCommandMenu(thread.id);
+ }
+ };
const isDisabled = visibility !== MessageChannelVisibility.SHARE_EVERYTHING;
return (
- handleThreadClick(event)}
- disabled={isDisabled}
- >
+
{
- it('should open email thread', () => {
- const { result } = renderHook(
- () => {
- const emailThread = useEmailThread();
- const isRightDrawerOpen = useRecoilValue(isRightDrawerOpenState);
- const viewableRecordId = useRecoilValue(viewableRecordIdState);
-
- return { ...emailThread, isRightDrawerOpen, viewableRecordId };
- },
- { wrapper: RecoilRoot },
- );
-
- expect(result.current.isRightDrawerOpen).toBe(false);
- expect(result.current.viewableRecordId).toBeNull();
-
- act(() => {
- result.current.openEmailThread(viewableEmailThreadId);
- });
-
- expect(result.current.isRightDrawerOpen).toBe(true);
- expect(result.current.viewableRecordId).toBe(viewableEmailThreadId);
- });
-
- it('should close email thread if trying to open the same thread id', () => {
- const { result } = renderHook(
- () => {
- const emailThread = useEmailThread();
- const [isRightDrawerOpen, setIsRightDrawerOpen] = useRecoilState(
- isRightDrawerOpenState,
- );
- const [viewableRecordId, setViewableRecordId] = useRecoilState(
- viewableRecordIdState,
- );
-
- return {
- ...emailThread,
- isRightDrawerOpen,
- viewableRecordId,
- setIsRightDrawerOpen,
- setViewableRecordId,
- };
- },
- { wrapper: RecoilRoot },
- );
-
- act(() => {
- result.current.setIsRightDrawerOpen(true);
- result.current.setViewableRecordId(viewableEmailThreadId);
- });
-
- act(() => {
- result.current.openEmailThread(viewableEmailThreadId);
- });
-
- expect(result.current.isRightDrawerOpen).toBe(false);
- expect(result.current.viewableRecordId).toBeNull();
- });
-});
diff --git a/packages/twenty-front/src/modules/activities/emails/hooks/useEmailThread.ts b/packages/twenty-front/src/modules/activities/emails/hooks/useEmailThread.ts
deleted file mode 100644
index c2fa722ed..000000000
--- a/packages/twenty-front/src/modules/activities/emails/hooks/useEmailThread.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { useRecoilCallback } from 'recoil';
-
-import { useOpenEmailThreadRightDrawer } from '@/activities/emails/right-drawer/hooks/useOpenEmailThreadRightDrawer';
-import { viewableRecordIdState } from '@/object-record/record-right-drawer/states/viewableRecordIdState';
-import { useRightDrawer } from '@/ui/layout/right-drawer/hooks/useRightDrawer';
-import { isRightDrawerOpenState } from '@/ui/layout/right-drawer/states/isRightDrawerOpenState';
-
-export const useEmailThread = () => {
- const { closeRightDrawer } = useRightDrawer();
- const openEmailThreadRightDrawer = useOpenEmailThreadRightDrawer();
-
- const openEmailThread = useRecoilCallback(
- ({ snapshot, set }) =>
- (threadId: string) => {
- const isRightDrawerOpen = snapshot
- .getLoadable(isRightDrawerOpenState)
- .getValue();
-
- const viewableEmailThreadId = snapshot
- .getLoadable(viewableRecordIdState)
- .getValue();
-
- if (isRightDrawerOpen && viewableEmailThreadId === threadId) {
- set(viewableRecordIdState, null);
- closeRightDrawer();
- return;
- }
-
- openEmailThreadRightDrawer();
- set(viewableRecordIdState, threadId);
- },
- [closeRightDrawer, openEmailThreadRightDrawer],
- );
-
- return { openEmailThread };
-};
diff --git a/packages/twenty-front/src/modules/activities/emails/right-drawer/components/IntermediaryMessages.tsx b/packages/twenty-front/src/modules/activities/emails/right-drawer/components/IntermediaryMessages.tsx
deleted file mode 100644
index aee31f1e1..000000000
--- a/packages/twenty-front/src/modules/activities/emails/right-drawer/components/IntermediaryMessages.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import styled from '@emotion/styled';
-import { useState } from 'react';
-import { Button, IconArrowsVertical } from 'twenty-ui';
-
-import { EmailThreadMessage } from '@/activities/emails/components/EmailThreadMessage';
-import { EmailThreadMessageWithSender } from '@/activities/emails/types/EmailThreadMessageWithSender';
-
-const StyledButtonContainer = styled.div`
- border-bottom: 1px solid ${({ theme }) => theme.border.color.light};
- padding: 16px 24px;
-`;
-
-export const IntermediaryMessages = ({
- messages,
-}: {
- messages: EmailThreadMessageWithSender[];
-}) => {
- const [areMessagesOpen, setAreMessagesOpen] = useState(false);
-
- if (messages.length === 0) {
- return null;
- }
-
- return areMessagesOpen ? (
- messages.map((message) => (
-
- ))
- ) : (
-
-
- );
-};
diff --git a/packages/twenty-front/src/modules/activities/emails/right-drawer/components/RightDrawerEmailThread.tsx b/packages/twenty-front/src/modules/activities/emails/right-drawer/components/RightDrawerEmailThread.tsx
deleted file mode 100644
index dcba48a72..000000000
--- a/packages/twenty-front/src/modules/activities/emails/right-drawer/components/RightDrawerEmailThread.tsx
+++ /dev/null
@@ -1,185 +0,0 @@
-import styled from '@emotion/styled';
-import { useEffect, useMemo } from 'react';
-import { useRecoilCallback, useSetRecoilState } from 'recoil';
-
-import { CustomResolverFetchMoreLoader } from '@/activities/components/CustomResolverFetchMoreLoader';
-import { EmailLoader } from '@/activities/emails/components/EmailLoader';
-import { EmailThreadHeader } from '@/activities/emails/components/EmailThreadHeader';
-import { EmailThreadMessage } from '@/activities/emails/components/EmailThreadMessage';
-import { IntermediaryMessages } from '@/activities/emails/right-drawer/components/IntermediaryMessages';
-import { useRightDrawerEmailThread } from '@/activities/emails/right-drawer/hooks/useRightDrawerEmailThread';
-import { emailThreadIdWhenEmailThreadWasClosedState } from '@/activities/emails/states/lastViewableEmailThreadIdState';
-import { RIGHT_DRAWER_CLICK_OUTSIDE_LISTENER_ID } from '@/ui/layout/right-drawer/constants/RightDrawerClickOutsideListener';
-import { messageThreadState } from '@/ui/layout/right-drawer/states/messageThreadState';
-import { useClickOutsideListener } from '@/ui/utilities/pointer-event/hooks/useClickOutsideListener';
-import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
-import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
-import { ConnectedAccountProvider } from 'twenty-shared';
-import { Button, IconArrowBackUp } from 'twenty-ui';
-
-const StyledWrapper = styled.div`
- display: flex;
- flex-direction: column;
- height: 100%;
-`;
-
-const StyledContainer = styled.div`
- box-sizing: border-box;
- display: flex;
- flex-direction: column;
- flex: 1;
- height: 85%;
- overflow-y: auto;
-`;
-
-const StyledButtonContainer = styled.div<{ isMobile: boolean }>`
- background: ${({ theme }) => theme.background.secondary};
- border-top: 1px solid ${({ theme }) => theme.border.color.light};
- display: flex;
- justify-content: flex-end;
- height: ${({ isMobile }) => (isMobile ? '100px' : '50px')};
- padding: ${({ theme }) => theme.spacing(2)};
- width: 100%;
- box-sizing: border-box;
-`;
-
-export const RightDrawerEmailThread = () => {
- const setMessageThread = useSetRecoilState(messageThreadState);
- const isMobile = useIsMobile();
- const {
- thread,
- messages,
- fetchMoreMessages,
- threadLoading,
- messageThreadExternalId,
- connectedAccountHandle,
- messageChannelLoading,
- connectedAccountProvider,
- lastMessageExternalId,
- } = useRightDrawerEmailThread();
-
- useEffect(() => {
- if (!messages[0]?.messageThread) {
- return;
- }
- setMessageThread(messages[0]?.messageThread);
- });
-
- const { useRegisterClickOutsideListenerCallback } = useClickOutsideListener(
- RIGHT_DRAWER_CLICK_OUTSIDE_LISTENER_ID,
- );
-
- useRegisterClickOutsideListenerCallback({
- callbackId:
- 'EmailThreadClickOutsideCallBack-' + (thread?.id ?? 'no-thread-id'),
- callbackFunction: useRecoilCallback(
- ({ set }) =>
- () => {
- set(
- emailThreadIdWhenEmailThreadWasClosedState,
- thread?.id ?? 'no-thread-id',
- );
- },
- [thread],
- ),
- });
-
- const messagesCount = messages.length;
- const is5OrMoreMessages = messagesCount >= 5;
- const firstMessages = messages.slice(
- 0,
- is5OrMoreMessages ? 2 : messagesCount - 1,
- );
- const intermediaryMessages = is5OrMoreMessages
- ? messages.slice(2, messagesCount - 1)
- : [];
- const lastMessage = messages[messagesCount - 1];
- const subject = messages[0]?.subject;
-
- const canReply = useMemo(() => {
- return (
- connectedAccountHandle &&
- connectedAccountProvider &&
- lastMessage &&
- messageThreadExternalId != null
- );
- }, [
- connectedAccountHandle,
- connectedAccountProvider,
- lastMessage,
- messageThreadExternalId,
- ]);
-
- const handleReplyClick = () => {
- if (!canReply) {
- return;
- }
-
- let url: string;
- switch (connectedAccountProvider) {
- case ConnectedAccountProvider.MICROSOFT:
- url = `https://outlook.office.com/mail/deeplink?ItemID=${lastMessageExternalId}`;
- window.open(url, '_blank');
- break;
- case ConnectedAccountProvider.GOOGLE:
- url = `https://mail.google.com/mail/?authuser=${connectedAccountHandle}#all/${messageThreadExternalId}`;
- window.open(url, '_blank');
- break;
- case null:
- throw new Error('Account provider not provided');
- default:
- assertUnreachable(connectedAccountProvider);
- }
- };
- if (!thread || !messages.length) {
- return null;
- }
- return (
-
-
- {threadLoading ? (
-
- ) : (
- <>
-
- {firstMessages.map((message) => (
-
- ))}
-
-
-
- >
- )}
-
- {canReply && !messageChannelLoading && (
-
-
-
- )}
-
- );
-};
diff --git a/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useOpenEmailThreadRightDrawer.test.ts b/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useOpenEmailThreadRightDrawer.test.ts
deleted file mode 100644
index 25c21ee10..000000000
--- a/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useOpenEmailThreadRightDrawer.test.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { renderHook } from '@testing-library/react';
-import { act } from 'react-dom/test-utils';
-
-import { useOpenEmailThreadRightDrawer } from '@/activities/emails/right-drawer/hooks/useOpenEmailThreadRightDrawer';
-import { RightDrawerHotkeyScope } from '@/ui/layout/right-drawer/types/RightDrawerHotkeyScope';
-import { RightDrawerPages } from '@/ui/layout/right-drawer/types/RightDrawerPages';
-import { IconMail } from 'twenty-ui';
-
-const mockOpenRightDrawer = jest.fn();
-const mockSetHotkeyScope = jest.fn();
-
-jest.mock('@/ui/layout/right-drawer/hooks/useRightDrawer', () => ({
- useRightDrawer: () => ({
- openRightDrawer: mockOpenRightDrawer,
- }),
-}));
-
-jest.mock('@/ui/utilities/hotkey/hooks/useSetHotkeyScope', () => ({
- useSetHotkeyScope: () => mockSetHotkeyScope,
-}));
-
-test('useOpenEmailThreadRightDrawer opens the email thread right drawer', () => {
- const { result } = renderHook(() => useOpenEmailThreadRightDrawer());
-
- act(() => {
- result.current();
- });
-
- expect(mockSetHotkeyScope).toHaveBeenCalledWith(
- RightDrawerHotkeyScope.RightDrawer,
- { goto: false },
- );
- expect(mockOpenRightDrawer).toHaveBeenCalledWith(
- RightDrawerPages.ViewEmailThread,
- {
- title: 'Email Thread',
- Icon: IconMail,
- },
- );
-});
diff --git a/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useRightDrawerEmailThread.test.tsx b/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useRightDrawerEmailThread.test.tsx
deleted file mode 100644
index 3dda143cd..000000000
--- a/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useRightDrawerEmailThread.test.tsx
+++ /dev/null
@@ -1,416 +0,0 @@
-import { renderHook, waitFor } from '@testing-library/react';
-
-import { viewableRecordIdState } from '@/object-record/record-right-drawer/states/viewableRecordIdState';
-import gql from 'graphql-tag';
-import { generateEmptyJestRecordNode } from '~/testing/jest/generateEmptyJestRecordNode';
-import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper';
-import { useRightDrawerEmailThread } from '../useRightDrawerEmailThread';
-
-const mocks = [
- {
- request: {
- query: gql`
- query FindOneMessageThread($objectRecordId: ID!) {
- messageThread(filter: { id: { eq: $objectRecordId } }) {
- __typename
- id
- }
- }
- `,
- variables: { objectRecordId: '1' },
- },
- result: jest.fn(() => ({
- data: {
- messageThread: {
- id: '1',
- __typename: 'MessageThread',
- },
- },
- })),
- },
- {
- request: {
- query: gql`
- query FindManyMessages(
- $filter: MessageFilterInput
- $orderBy: [MessageOrderByInput]
- $lastCursor: String
- $limit: Int
- ) {
- messages(
- filter: $filter
- orderBy: $orderBy
- first: $limit
- after: $lastCursor
- ) {
- edges {
- node {
- __typename
- createdAt
- headerMessageId
- id
- messageParticipants {
- edges {
- node {
- __typename
- displayName
- handle
- id
- person {
- __typename
- avatarUrl
- city
- companyId
- createdAt
- createdBy {
- source
- workspaceMemberId
- name
- context
- }
- deletedAt
- emails {
- primaryEmail
- additionalEmails
- }
- id
- intro
- jobTitle
- linkedinLink {
- primaryLinkUrl
- primaryLinkLabel
- secondaryLinks
- }
- name {
- firstName
- lastName
- }
- performanceRating
- phones {
- primaryPhoneNumber
- primaryPhoneCountryCode
- primaryPhoneCallingCode
- additionalPhones
- }
- position
- updatedAt
- whatsapp {
- primaryPhoneNumber
- primaryPhoneCountryCode
- primaryPhoneCallingCode
- additionalPhones
- }
- workPreference
- xLink {
- primaryLinkUrl
- primaryLinkLabel
- secondaryLinks
- }
- }
- role
- workspaceMember {
- __typename
- avatarUrl
- colorScheme
- createdAt
- dateFormat
- deletedAt
- id
- locale
- name {
- firstName
- lastName
- }
- timeFormat
- timeZone
- updatedAt
- userEmail
- userId
- }
- }
- }
- }
- messageThread {
- __typename
- id
- }
- receivedAt
- subject
- text
- }
- cursor
- }
- pageInfo {
- hasNextPage
- hasPreviousPage
- startCursor
- endCursor
- }
- totalCount
- }
- }
- `,
- variables: {
- filter: { messageThreadId: { eq: '1' } },
- orderBy: [{ receivedAt: 'AscNullsLast' }],
- lastCursor: undefined,
- limit: 10,
- },
- },
- result: jest.fn(() => ({
- data: {
- messages: {
- edges: [
- {
- node: generateEmptyJestRecordNode({
- objectNameSingular: 'message',
- input: {
- id: '1',
- text: 'Message 1',
- createdAt: '2024-10-03T10:20:10.145Z',
- },
- }),
- cursor: '1',
- },
- {
- node: generateEmptyJestRecordNode({
- objectNameSingular: 'message',
- input: {
- id: '2',
- text: 'Message 2',
- createdAt: '2024-10-03T10:20:10.145Z',
- },
- }),
- cursor: '2',
- },
- ],
- totalCount: 2,
- pageInfo: {
- hasNextPage: false,
- hasPreviousPage: false,
- startCursor: '1',
- endCursor: '2',
- },
- },
- },
- })),
- },
- {
- request: {
- query: gql`
- query FindManyMessageParticipants(
- $filter: MessageParticipantFilterInput
- $orderBy: [MessageParticipantOrderByInput]
- $lastCursor: String
- $limit: Int
- ) {
- messageParticipants(
- filter: $filter
- orderBy: $orderBy
- first: $limit
- after: $lastCursor
- ) {
- edges {
- node {
- __typename
- displayName
- handle
- id
- messageId
- person {
- __typename
- avatarUrl
- city
- companyId
- createdAt
- createdBy {
- source
- workspaceMemberId
- name
- context
- }
- deletedAt
- emails {
- primaryEmail
- additionalEmails
- }
- id
- intro
- jobTitle
- linkedinLink {
- primaryLinkUrl
- primaryLinkLabel
- secondaryLinks
- }
- name {
- firstName
- lastName
- }
- performanceRating
- phones {
- primaryPhoneNumber
- primaryPhoneCountryCode
- primaryPhoneCallingCode
- additionalPhones
- }
- position
- updatedAt
- whatsapp {
- primaryPhoneNumber
- primaryPhoneCountryCode
- primaryPhoneCallingCode
- additionalPhones
- }
- workPreference
- xLink {
- primaryLinkUrl
- primaryLinkLabel
- secondaryLinks
- }
- }
- role
- workspaceMember {
- __typename
- avatarUrl
- colorScheme
- createdAt
- dateFormat
- deletedAt
- id
- locale
- name {
- firstName
- lastName
- }
- timeFormat
- timeZone
- updatedAt
- userEmail
- userId
- }
- }
- cursor
- }
- pageInfo {
- hasNextPage
- hasPreviousPage
- startCursor
- endCursor
- }
- totalCount
- }
- }
- `,
- variables: {
- filter: { messageId: { in: ['1', '2'] }, role: { eq: 'from' } },
- orderBy: undefined,
- lastCursor: undefined,
- limit: undefined,
- },
- },
- result: jest.fn(() => ({
- data: {
- messageParticipants: {
- edges: [
- {
- node: generateEmptyJestRecordNode({
- objectNameSingular: 'messageParticipant',
- input: {
- id: 'messageParticipant-1',
- role: 'from',
- messageId: '1',
- },
- }),
- cursor: '1',
- },
- {
- node: generateEmptyJestRecordNode({
- objectNameSingular: 'messageParticipant',
- input: {
- id: 'messageParticipant-2',
- role: 'from',
- messageId: '2',
- },
- }),
- cursor: '2',
- },
- ],
- totalCount: 2,
- pageInfo: {
- hasNextPage: false,
- hasPreviousPage: false,
- startCursor: '1',
- endCursor: '2',
- },
- },
- },
- })),
- },
-];
-
-const Wrapper = getJestMetadataAndApolloMocksWrapper({
- apolloMocks: mocks,
- onInitializeRecoilSnapshot: ({ set }) => {
- set(viewableRecordIdState, '1');
- },
-});
-
-describe('useRightDrawerEmailThread', () => {
- it('should return correct values', async () => {
- const mockMessages = [
- {
- __typename: 'Message',
- createdAt: '2024-10-03T10:20:10.145Z',
- headerMessageId: '',
- id: '1',
- messageParticipants: [],
- messageThread: null,
- receivedAt: null,
- sender: {
- __typename: 'MessageParticipant',
- displayName: '',
- handle: '',
- id: 'messageParticipant-1',
- messageId: '1',
- person: null,
- role: 'from',
- workspaceMember: null,
- },
- subject: '',
- text: 'Message 1',
- },
- {
- __typename: 'Message',
- createdAt: '2024-10-03T10:20:10.145Z',
- headerMessageId: '',
- id: '2',
- messageParticipants: [],
- messageThread: null,
- receivedAt: null,
- sender: {
- __typename: 'MessageParticipant',
- displayName: '',
- handle: '',
- id: 'messageParticipant-2',
- messageId: '2',
- person: null,
- role: 'from',
- workspaceMember: null,
- },
- subject: '',
- text: 'Message 2',
- },
- ];
-
- const { result } = renderHook(() => useRightDrawerEmailThread(), {
- wrapper: Wrapper,
- });
-
- await waitFor(() => {
- expect(result.current.thread).toBeDefined();
- expect(result.current.messages).toEqual(mockMessages);
- expect(result.current.threadLoading).toBeFalsy();
- expect(result.current.fetchMoreMessages).toBeInstanceOf(Function);
- });
- });
-});
diff --git a/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/useOpenEmailThreadRightDrawer.ts b/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/useOpenEmailThreadRightDrawer.ts
deleted file mode 100644
index 1e18a20d4..000000000
--- a/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/useOpenEmailThreadRightDrawer.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { useRightDrawer } from '@/ui/layout/right-drawer/hooks/useRightDrawer';
-import { RightDrawerHotkeyScope } from '@/ui/layout/right-drawer/types/RightDrawerHotkeyScope';
-import { RightDrawerPages } from '@/ui/layout/right-drawer/types/RightDrawerPages';
-import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
-import { IconMail } from 'twenty-ui';
-
-export const useOpenEmailThreadRightDrawer = () => {
- const { openRightDrawer } = useRightDrawer();
- const setHotkeyScope = useSetHotkeyScope();
-
- return () => {
- setHotkeyScope(RightDrawerHotkeyScope.RightDrawer, { goto: false });
- openRightDrawer(RightDrawerPages.ViewEmailThread, {
- title: 'Email Thread',
- Icon: IconMail,
- });
- };
-};
diff --git a/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/useRightDrawerEmailThread.ts b/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/useRightDrawerEmailThread.ts
deleted file mode 100644
index d41c54cb3..000000000
--- a/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/useRightDrawerEmailThread.ts
+++ /dev/null
@@ -1,186 +0,0 @@
-import { useCallback, useEffect, useState } from 'react';
-import { useRecoilValue } from 'recoil';
-
-import { fetchAllThreadMessagesOperationSignatureFactory } from '@/activities/emails/graphql/operation-signatures/factories/fetchAllThreadMessagesOperationSignatureFactory';
-import { EmailThread } from '@/activities/emails/types/EmailThread';
-import { EmailThreadMessage } from '@/activities/emails/types/EmailThreadMessage';
-
-import { MessageChannel } from '@/accounts/types/MessageChannel';
-import { EmailThreadMessageParticipant } from '@/activities/emails/types/EmailThreadMessageParticipant';
-import { EmailThreadMessageWithSender } from '@/activities/emails/types/EmailThreadMessageWithSender';
-import { MessageChannelMessageAssociation } from '@/activities/emails/types/MessageChannelMessageAssociation';
-import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
-import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
-import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord';
-import { viewableRecordIdState } from '@/object-record/record-right-drawer/states/viewableRecordIdState';
-import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore';
-import { isDefined } from 'twenty-shared';
-
-export const useRightDrawerEmailThread = () => {
- const viewableRecordId = useRecoilValue(viewableRecordIdState);
- const { upsertRecords } = useUpsertRecordsInStore();
- const [lastMessageId, setLastMessageId] = useState(null);
- const [lastMessageChannelId, setLastMessageChannelId] = useState<
- string | null
- >(null);
- const [isMessagesFetchComplete, setIsMessagesFetchComplete] = useState(false);
-
- const { record: thread } = useFindOneRecord({
- objectNameSingular: CoreObjectNameSingular.MessageThread,
- objectRecordId: viewableRecordId ?? '',
- recordGqlFields: {
- id: true,
- },
- onCompleted: (record) => {
- upsertRecords([record]);
- },
- });
-
- const FETCH_ALL_MESSAGES_OPERATION_SIGNATURE =
- fetchAllThreadMessagesOperationSignatureFactory({
- messageThreadId: viewableRecordId,
- });
-
- const {
- records: messages,
- loading: messagesLoading,
- fetchMoreRecords,
- hasNextPage,
- } = useFindManyRecords({
- limit: FETCH_ALL_MESSAGES_OPERATION_SIGNATURE.variables.limit,
- filter: FETCH_ALL_MESSAGES_OPERATION_SIGNATURE.variables.filter,
- objectNameSingular:
- FETCH_ALL_MESSAGES_OPERATION_SIGNATURE.objectNameSingular,
- orderBy: FETCH_ALL_MESSAGES_OPERATION_SIGNATURE.variables.orderBy,
- recordGqlFields: FETCH_ALL_MESSAGES_OPERATION_SIGNATURE.fields,
- skip: !viewableRecordId,
- });
-
- const fetchMoreMessages = useCallback(() => {
- if (!messagesLoading && hasNextPage) {
- fetchMoreRecords();
- } else if (!hasNextPage) {
- setIsMessagesFetchComplete(true);
- }
- }, [fetchMoreRecords, messagesLoading, hasNextPage]);
-
- useEffect(() => {
- if (messages.length > 0 && isMessagesFetchComplete) {
- const lastMessage = messages[messages.length - 1];
- setLastMessageId(lastMessage.id);
- }
- }, [messages, isMessagesFetchComplete]);
-
- // TODO: introduce nested filters so we can retrieve the message sender directly from the message query
- const { records: messageSenders } =
- useFindManyRecords({
- filter: {
- messageId: {
- in: messages.map(({ id }) => id),
- },
- role: {
- eq: 'from',
- },
- },
- objectNameSingular: CoreObjectNameSingular.MessageParticipant,
- recordGqlFields: {
- id: true,
- role: true,
- displayName: true,
- messageId: true,
- handle: true,
- person: true,
- workspaceMember: true,
- },
- skip: messages.length === 0,
- });
-
- const { records: messageChannelMessageAssociationData } =
- useFindManyRecords({
- filter: {
- messageId: {
- eq: lastMessageId ?? '',
- },
- },
- objectNameSingular:
- CoreObjectNameSingular.MessageChannelMessageAssociation,
- recordGqlFields: {
- id: true,
- messageId: true,
- messageChannelId: true,
- messageThreadExternalId: true,
- messageExternalId: true,
- },
- skip: !lastMessageId || !isMessagesFetchComplete,
- });
-
- useEffect(() => {
- if (messageChannelMessageAssociationData.length > 0) {
- setLastMessageChannelId(
- messageChannelMessageAssociationData[0].messageChannelId,
- );
- }
- }, [messageChannelMessageAssociationData]);
-
- const { records: messageChannelData, loading: messageChannelLoading } =
- useFindManyRecords({
- filter: {
- id: {
- eq: lastMessageChannelId ?? '',
- },
- },
- objectNameSingular: CoreObjectNameSingular.MessageChannel,
- recordGqlFields: {
- id: true,
- handle: true,
- connectedAccount: {
- id: true,
- provider: true,
- },
- },
- skip: !lastMessageChannelId,
- });
-
- const messageThreadExternalId =
- messageChannelMessageAssociationData.length > 0
- ? messageChannelMessageAssociationData[0].messageThreadExternalId
- : null;
- const lastMessageExternalId =
- messageChannelMessageAssociationData.length > 0
- ? messageChannelMessageAssociationData[0].messageExternalId
- : null;
- const connectedAccountHandle =
- messageChannelData.length > 0 ? messageChannelData[0].handle : null;
-
- const messagesWithSender: EmailThreadMessageWithSender[] = messages
- .map((message) => {
- const sender = messageSenders.find(
- (messageSender) => messageSender.messageId === message.id,
- );
- if (!sender) {
- return null;
- }
- return {
- ...message,
- sender,
- };
- })
- .filter(isDefined);
-
- const connectedAccount =
- messageChannelData.length > 0
- ? messageChannelData[0]?.connectedAccount
- : null;
- const connectedAccountProvider = connectedAccount?.provider ?? null;
- return {
- thread,
- messages: messagesWithSender,
- messageThreadExternalId,
- connectedAccountHandle,
- connectedAccountProvider,
- threadLoading: messagesLoading,
- messageChannelLoading,
- lastMessageExternalId,
- fetchMoreMessages,
- };
-};
diff --git a/packages/twenty-front/src/modules/activities/hooks/__tests__/useOpenActivityRightDrawer.test.tsx b/packages/twenty-front/src/modules/activities/hooks/__tests__/useOpenActivityRightDrawer.test.tsx
deleted file mode 100644
index 81a6b61da..000000000
--- a/packages/twenty-front/src/modules/activities/hooks/__tests__/useOpenActivityRightDrawer.test.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { MockedProvider } from '@apollo/client/testing';
-import { act, renderHook } from '@testing-library/react';
-import { ReactNode } from 'react';
-import { RecoilRoot, useRecoilValue } from 'recoil';
-
-import { useOpenActivityRightDrawer } from '@/activities/hooks/useOpenActivityRightDrawer';
-import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
-import { viewableRecordIdState } from '@/object-record/record-right-drawer/states/viewableRecordIdState';
-
-const Wrapper = ({ children }: { children: ReactNode }) => (
-
- {children}
-
-);
-
-describe('useOpenActivityRightDrawer', () => {
- it('works as expected', () => {
- const { result } = renderHook(
- () => {
- const openActivityRightDrawer = useOpenActivityRightDrawer({
- objectNameSingular: CoreObjectNameSingular.Task,
- });
- const viewableRecordId = useRecoilValue(viewableRecordIdState);
- return {
- openActivityRightDrawer,
- viewableRecordId,
- };
- },
- {
- wrapper: Wrapper,
- },
- );
-
- expect(result.current.viewableRecordId).toBeNull();
- act(() => {
- result.current.openActivityRightDrawer('123');
- });
- expect(result.current.viewableRecordId).toBe('123');
- });
-});
diff --git a/packages/twenty-front/src/modules/activities/hooks/useOpenActivityRightDrawer.ts b/packages/twenty-front/src/modules/activities/hooks/useOpenActivityRightDrawer.ts
deleted file mode 100644
index d172e7aeb..000000000
--- a/packages/twenty-front/src/modules/activities/hooks/useOpenActivityRightDrawer.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { useRecoilState, useSetRecoilState } from 'recoil';
-
-import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
-import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
-import { viewableRecordIdState } from '@/object-record/record-right-drawer/states/viewableRecordIdState';
-import { viewableRecordNameSingularState } from '@/object-record/record-right-drawer/states/viewableRecordNameSingularState';
-import { useRightDrawer } from '@/ui/layout/right-drawer/hooks/useRightDrawer';
-import { RightDrawerHotkeyScope } from '@/ui/layout/right-drawer/types/RightDrawerHotkeyScope';
-import { RightDrawerPages } from '@/ui/layout/right-drawer/types/RightDrawerPages';
-import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
-import { IconList } from 'twenty-ui';
-import { FeatureFlagKey } from '~/generated/graphql';
-
-export const useOpenActivityRightDrawer = ({
- objectNameSingular,
-}: {
- objectNameSingular: CoreObjectNameSingular;
-}) => {
- const { openRightDrawer, isRightDrawerOpen, rightDrawerPage } =
- useRightDrawer();
- const [viewableRecordId, setViewableRecordId] = useRecoilState(
- viewableRecordIdState,
- );
-
- const setViewableRecordNameSingular = useSetRecoilState(
- viewableRecordNameSingularState,
- );
-
- const setHotkeyScope = useSetHotkeyScope();
-
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
-
- const { openRecordInCommandMenu } = useCommandMenu();
-
- return (activityId: string) => {
- if (
- isRightDrawerOpen &&
- rightDrawerPage === RightDrawerPages.ViewRecord &&
- viewableRecordId === activityId
- ) {
- return;
- }
-
- if (isCommandMenuV2Enabled) {
- openRecordInCommandMenu({
- recordId: activityId,
- objectNameSingular,
- isNewRecord: false,
- });
- } else {
- setHotkeyScope(RightDrawerHotkeyScope.RightDrawer, { goto: false });
- setViewableRecordId(activityId);
- setViewableRecordNameSingular(objectNameSingular);
- openRightDrawer(RightDrawerPages.ViewRecord, {
- title: objectNameSingular,
- Icon: IconList,
- });
- }
- };
-};
diff --git a/packages/twenty-front/src/modules/activities/hooks/useOpenCreateActivityDrawer.ts b/packages/twenty-front/src/modules/activities/hooks/useOpenCreateActivityDrawer.ts
index 9ab66f423..b4ea1537a 100644
--- a/packages/twenty-front/src/modules/activities/hooks/useOpenCreateActivityDrawer.ts
+++ b/packages/twenty-front/src/modules/activities/hooks/useOpenCreateActivityDrawer.ts
@@ -1,27 +1,20 @@
import { useSetRecoilState } from 'recoil';
import { activityTargetableEntityArrayState } from '@/activities/states/activityTargetableEntityArrayState';
-import { isUpsertingActivityInDBState } from '@/activities/states/isCreatingActivityInDBState';
+import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
+import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { viewableRecordIdState } from '@/object-record/record-right-drawer/states/viewableRecordIdState';
-import { useRightDrawer } from '@/ui/layout/right-drawer/hooks/useRightDrawer';
-import { RightDrawerHotkeyScope } from '@/ui/layout/right-drawer/types/RightDrawerHotkeyScope';
-import { RightDrawerPages } from '@/ui/layout/right-drawer/types/RightDrawerPages';
-import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
+import { viewableRecordNameSingularState } from '@/object-record/record-right-drawer/states/viewableRecordNameSingularState';
import { WorkspaceMember } from '@/workspace-member/types/WorkspaceMember';
+import { isUpsertingActivityInDBState } from '@/activities/states/isCreatingActivityInDBState';
+import { ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity';
import { Note } from '@/activities/types/Note';
import { NoteTarget } from '@/activities/types/NoteTarget';
import { Task } from '@/activities/types/Task';
import { TaskTarget } from '@/activities/types/TaskTarget';
-import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
-import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useCreateOneRecord } from '@/object-record/hooks/useCreateOneRecord';
import { isNewViewableRecordLoadingState } from '@/object-record/record-right-drawer/states/isNewViewableRecordLoading';
-import { viewableRecordNameSingularState } from '@/object-record/record-right-drawer/states/viewableRecordNameSingularState';
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
-import { IconList } from 'twenty-ui';
-import { FeatureFlagKey } from '~/generated/graphql';
-import { ActivityTargetableObject } from '../types/ActivityTargetableEntity';
export const useOpenCreateActivityDrawer = ({
activityObjectNameSingular,
@@ -30,10 +23,6 @@ export const useOpenCreateActivityDrawer = ({
| CoreObjectNameSingular.Note
| CoreObjectNameSingular.Task;
}) => {
- const { openRightDrawer } = useRightDrawer();
-
- const setHotkeyScope = useSetHotkeyScope();
-
const { createOneRecord: createOneActivity } = useCreateOneRecord<
(Task | Note) & { position: 'first' | 'last' }
>({
@@ -64,10 +53,6 @@ export const useOpenCreateActivityDrawer = ({
isUpsertingActivityInDBState,
);
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
-
const { openRecordInCommandMenu } = useCommandMenu();
const openCreateActivityDrawer = async ({
@@ -78,12 +63,6 @@ export const useOpenCreateActivityDrawer = ({
customAssignee?: WorkspaceMember;
}) => {
setIsNewViewableRecordLoading(true);
- if (!isCommandMenuV2Enabled) {
- openRightDrawer(RightDrawerPages.ViewRecord, {
- title: activityObjectNameSingular,
- Icon: IconList,
- });
- }
setViewableRecordId(null);
setViewableRecordNameSingular(activityObjectNameSingular);
@@ -125,15 +104,11 @@ export const useOpenCreateActivityDrawer = ({
setActivityTargetableEntityArray([]);
}
- if (isCommandMenuV2Enabled) {
- openRecordInCommandMenu({
- recordId: activity.id,
- objectNameSingular: activityObjectNameSingular,
- isNewRecord: true,
- });
- } else {
- setHotkeyScope(RightDrawerHotkeyScope.RightDrawer, { goto: false });
- }
+ openRecordInCommandMenu({
+ recordId: activity.id,
+ objectNameSingular: activityObjectNameSingular,
+ isNewRecord: true,
+ });
setViewableRecordId(activity.id);
diff --git a/packages/twenty-front/src/modules/activities/inline-cell/hooks/useOpenActivityTargetInlineCellEditMode.ts b/packages/twenty-front/src/modules/activities/inline-cell/hooks/useOpenActivityTargetInlineCellEditMode.ts
index a65a1751d..252d03d9a 100644
--- a/packages/twenty-front/src/modules/activities/inline-cell/hooks/useOpenActivityTargetInlineCellEditMode.ts
+++ b/packages/twenty-front/src/modules/activities/inline-cell/hooks/useOpenActivityTargetInlineCellEditMode.ts
@@ -5,8 +5,6 @@ import { useMultipleRecordPickerPerformSearch } from '@/object-record/record-pic
import { multipleRecordPickerPickableMorphItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerPickableMorphItemsComponentState';
import { multipleRecordPickerSearchFilterComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerSearchFilterComponentState';
import { multipleRecordPickerSearchableObjectMetadataItemsComponentState } from '@/object-record/record-picker/multiple-record-picker/states/multipleRecordPickerSearchableObjectMetadataItemsComponentState';
-import { RIGHT_DRAWER_CLICK_OUTSIDE_LISTENER_ID } from '@/ui/layout/right-drawer/constants/RightDrawerClickOutsideListener';
-import { useClickOutsideListener } from '@/ui/utilities/pointer-event/hooks/useClickOutsideListener';
import { useRecoilCallback } from 'recoil';
type OpenActivityTargetInlineCellEditModeProps = {
@@ -15,9 +13,6 @@ type OpenActivityTargetInlineCellEditModeProps = {
};
export const useOpenActivityTargetInlineCellEditMode = () => {
- const { toggleClickOutsideListener: toggleRightDrawerClickOustideListener } =
- useClickOutsideListener(RIGHT_DRAWER_CLICK_OUTSIDE_LISTENER_ID);
-
const { performSearch: multipleRecordPickerPerformSearch } =
useMultipleRecordPickerPerformSearch();
@@ -66,8 +61,6 @@ export const useOpenActivityTargetInlineCellEditMode = () => {
'',
);
- toggleRightDrawerClickOustideListener(false);
-
multipleRecordPickerPerformSearch({
multipleRecordPickerInstanceId: recordPickerInstanceId,
forceSearchFilter: '',
@@ -83,7 +76,7 @@ export const useOpenActivityTargetInlineCellEditMode = () => {
),
});
},
- [multipleRecordPickerPerformSearch, toggleRightDrawerClickOustideListener],
+ [multipleRecordPickerPerformSearch],
);
return { openActivityTargetInlineCellEditMode };
diff --git a/packages/twenty-front/src/modules/activities/notes/components/NoteCard.tsx b/packages/twenty-front/src/modules/activities/notes/components/NoteCard.tsx
index 4d70dbc83..62cfcda79 100644
--- a/packages/twenty-front/src/modules/activities/notes/components/NoteCard.tsx
+++ b/packages/twenty-front/src/modules/activities/notes/components/NoteCard.tsx
@@ -1,9 +1,9 @@
import styled from '@emotion/styled';
-import { useOpenActivityRightDrawer } from '@/activities/hooks/useOpenActivityRightDrawer';
import { ActivityTargetsInlineCell } from '@/activities/inline-cell/components/ActivityTargetsInlineCell';
import { Note } from '@/activities/types/Note';
import { getActivityPreview } from '@/activities/utils/getActivityPreview';
+import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useFieldContext } from '@/object-record/hooks/useFieldContext';
@@ -68,9 +68,7 @@ export const NoteCard = ({
note: Note;
isSingleNote: boolean;
}) => {
- const openActivityRightDrawer = useOpenActivityRightDrawer({
- objectNameSingular: CoreObjectNameSingular.Note,
- });
+ const { openRecordInCommandMenu } = useCommandMenu();
const body = getActivityPreview(note?.bodyV2?.blocknote ?? null);
@@ -84,7 +82,12 @@ export const NoteCard = ({
return (
openActivityRightDrawer(note.id)}
+ onClick={() =>
+ openRecordInCommandMenu({
+ recordId: note.id,
+ objectNameSingular: CoreObjectNameSingular.Note,
+ })
+ }
>
{note.title ?? 'Task Title'}
{body}
diff --git a/packages/twenty-front/src/modules/activities/tasks/components/TaskRow.tsx b/packages/twenty-front/src/modules/activities/tasks/components/TaskRow.tsx
index 588af20d9..037ed8ec8 100644
--- a/packages/twenty-front/src/modules/activities/tasks/components/TaskRow.tsx
+++ b/packages/twenty-front/src/modules/activities/tasks/components/TaskRow.tsx
@@ -7,13 +7,13 @@ import {
OverflowingTextWithTooltip,
} from 'twenty-ui';
-import { useOpenActivityRightDrawer } from '@/activities/hooks/useOpenActivityRightDrawer';
import { ActivityTargetsInlineCell } from '@/activities/inline-cell/components/ActivityTargetsInlineCell';
import { getActivitySummary } from '@/activities/utils/getActivitySummary';
import { beautifyExactDate, hasDatePassed } from '~/utils/date-utils';
import { ActivityRow } from '@/activities/components/ActivityRow';
import { Task } from '@/activities/types/Task';
+import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useFieldContext } from '@/object-record/hooks/useFieldContext';
import { useCompleteTask } from '../hooks/useCompleteTask';
@@ -78,9 +78,7 @@ const StyledCheckboxContainer = styled.div`
export const TaskRow = ({ task }: { task: Task }) => {
const theme = useTheme();
- const openActivityRightDrawer = useOpenActivityRightDrawer({
- objectNameSingular: CoreObjectNameSingular.Task,
- });
+ const { openRecordInCommandMenu } = useCommandMenu();
const body = getActivitySummary(task?.bodyV2?.blocknote ?? null);
@@ -96,7 +94,10 @@ export const TaskRow = ({ task }: { task: Task }) => {
return (
{
- openActivityRightDrawer(task.id);
+ openRecordInCommandMenu({
+ recordId: task.id,
+ objectNameSingular: CoreObjectNameSingular.Task,
+ });
}}
>
diff --git a/packages/twenty-front/src/modules/activities/timeline-activities/rows/activity/components/EventRowActivity.tsx b/packages/twenty-front/src/modules/activities/timeline-activities/rows/activity/components/EventRowActivity.tsx
index 47f95270d..836cdf4a4 100644
--- a/packages/twenty-front/src/modules/activities/timeline-activities/rows/activity/components/EventRowActivity.tsx
+++ b/packages/twenty-front/src/modules/activities/timeline-activities/rows/activity/components/EventRowActivity.tsx
@@ -1,11 +1,11 @@
import styled from '@emotion/styled';
-import { useOpenActivityRightDrawer } from '@/activities/hooks/useOpenActivityRightDrawer';
import {
EventRowDynamicComponentProps,
StyledEventRowItemAction,
StyledEventRowItemColumn,
} from '@/activities/timeline-activities/rows/components/EventRowDynamicComponent';
+import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
import { isNonEmptyString } from '@sniptt/guards';
@@ -55,9 +55,7 @@ export const EventRowActivity = ({
? event.linkedRecordCachedName
: 'Untitled';
- const openActivityRightDrawer = useOpenActivityRightDrawer({
- objectNameSingular,
- });
+ const { openRecordInCommandMenu } = useCommandMenu();
return (
<>
@@ -66,7 +64,12 @@ export const EventRowActivity = ({
{`${eventAction} a related ${eventObject}`}
openActivityRightDrawer(event.linkedRecordId)}
+ onClick={() =>
+ openRecordInCommandMenu({
+ recordId: event.linkedRecordId,
+ objectNameSingular,
+ })
+ }
>
{activityTitle}
diff --git a/packages/twenty-front/src/modules/command-menu/components/CommandMenu.tsx b/packages/twenty-front/src/modules/command-menu/components/CommandMenu.tsx
index 2e03852c5..022345f60 100644
--- a/packages/twenty-front/src/modules/command-menu/components/CommandMenu.tsx
+++ b/packages/twenty-front/src/modules/command-menu/components/CommandMenu.tsx
@@ -24,7 +24,6 @@ export const CommandMenu = () => {
const {
noResults,
- copilotCommands,
matchingStandardActionRecordSelectionCommands,
matchingStandardActionObjectCommands,
matchingWorkflowRunRecordSelectionCommands,
@@ -47,10 +46,6 @@ export const CommandMenu = () => {
);
const commandGroups: CommandGroupConfig[] = [
- {
- heading: t`Copilot`,
- items: copilotCommands,
- },
{
heading: t`Record Selection`,
items: matchingStandardActionRecordSelectionCommands.concat(
diff --git a/packages/twenty-front/src/modules/command-menu/components/CommandMenuTopBar.tsx b/packages/twenty-front/src/modules/command-menu/components/CommandMenuTopBar.tsx
index b7fe4883c..5b8396975 100644
--- a/packages/twenty-front/src/modules/command-menu/components/CommandMenuTopBar.tsx
+++ b/packages/twenty-front/src/modules/command-menu/components/CommandMenuTopBar.tsx
@@ -11,7 +11,6 @@ import { commandMenuSearchState } from '@/command-menu/states/commandMenuSearchS
import { CommandMenuPages } from '@/command-menu/types/CommandMenuPages';
import { contextStoreCurrentObjectMetadataItemComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemComponentState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled';
import { useLingui } from '@lingui/react/macro';
@@ -24,11 +23,9 @@ import {
Button,
IconChevronLeft,
IconX,
- LightIconButton,
getOsControlSymbol,
useIsMobile,
} from 'twenty-ui';
-import { FeatureFlagKey } from '~/generated-metadata/graphql';
const StyledInputContainer = styled.div`
align-items: center;
@@ -75,13 +72,6 @@ const StyledContentContainer = styled.div`
gap: ${({ theme }) => theme.spacing(1)};
`;
-const StyledCloseButtonContainer = styled.div`
- align-items: center;
- display: flex;
- height: 32px;
- justify-content: center;
-`;
-
const StyledCloseButtonWrapper = styled.div<{ isVisible: boolean }>`
visibility: ${({ isVisible }) => (isVisible ? 'visible' : 'hidden')};
`;
@@ -110,10 +100,6 @@ export const CommandMenuTopBar = () => {
const theme = useTheme();
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
-
const { contextChips } = useCommandMenuContextChips();
const location = useLocation();
@@ -127,34 +113,30 @@ export const CommandMenuTopBar = () => {
return (
- {isCommandMenuV2Enabled && (
- <>
-
- {commandMenuPage !== CommandMenuPages.Root && (
-
- ]}
- onClick={goBackFromCommandMenu}
- testId="command-menu-go-back-button"
- />
-
- )}
-
- {isDefined(contextStoreCurrentObjectMetadataItem) &&
- commandMenuPage !== CommandMenuPages.SearchRecords ? (
-
+ {commandMenuPage !== CommandMenuPages.Root && (
+
+ ]}
+ onClick={goBackFromCommandMenu}
+ testId="command-menu-go-back-button"
/>
- ) : (
-
- )}
- >
+
+ )}
+
+ {isDefined(contextStoreCurrentObjectMetadataItem) &&
+ commandMenuPage !== CommandMenuPages.SearchRecords ? (
+
+ ) : (
+
)}
{(commandMenuPage === CommandMenuPages.Root ||
commandMenuPage === CommandMenuPages.SearchRecords) && (
@@ -171,27 +153,16 @@ export const CommandMenuTopBar = () => {
{!isMobile && (
- {isCommandMenuV2Enabled ? (
-
- ) : (
-
-
-
- )}
+
)}
diff --git a/packages/twenty-front/src/modules/command-menu/constants/CommandMenuPagesConfig.tsx b/packages/twenty-front/src/modules/command-menu/constants/CommandMenuPagesConfig.tsx
index 706ebc3f3..2ecbad5ae 100644
--- a/packages/twenty-front/src/modules/command-menu/constants/CommandMenuPagesConfig.tsx
+++ b/packages/twenty-front/src/modules/command-menu/constants/CommandMenuPagesConfig.tsx
@@ -1,4 +1,3 @@
-import { RightDrawerAIChat } from '@/activities/copilot/right-drawer/components/RightDrawerAIChat';
import { CommandMenu } from '@/command-menu/components/CommandMenu';
import { CommandMenuCalendarEventPage } from '@/command-menu/pages/calendar-event/components/CommandMenuCalendarEventPage';
import { CommandMenuMessageThreadPage } from '@/command-menu/pages/message-thread/components/CommandMenuMessageThreadPage';
@@ -19,7 +18,6 @@ export const COMMAND_MENU_PAGES_CONFIG = new Map<
[CommandMenuPages.ViewRecord, ],
[CommandMenuPages.ViewEmailThread, ],
[CommandMenuPages.ViewCalendarEvent, ],
- [CommandMenuPages.Copilot, ],
[
CommandMenuPages.WorkflowStepSelectTriggerType,
,
diff --git a/packages/twenty-front/src/modules/command-menu/hooks/useCommandMenuCommands.tsx b/packages/twenty-front/src/modules/command-menu/hooks/useCommandMenuCommands.tsx
index f201044a4..0d568c02e 100644
--- a/packages/twenty-front/src/modules/command-menu/hooks/useCommandMenuCommands.tsx
+++ b/packages/twenty-front/src/modules/command-menu/hooks/useCommandMenuCommands.tsx
@@ -3,49 +3,20 @@ import {
ActionMenuEntryScope,
ActionMenuEntryType,
} from '@/action-menu/types/ActionMenuEntry';
-import { useOpenCopilotRightDrawer } from '@/activities/copilot/right-drawer/hooks/useOpenCopilotRightDrawer';
-import { copilotQueryState } from '@/activities/copilot/right-drawer/states/copilotQueryState';
import { COMMAND_MENU_NAVIGATE_COMMANDS } from '@/command-menu/constants/CommandMenuNavigateCommands';
-import { commandMenuSearchState } from '@/command-menu/states/commandMenuSearchState';
import {
Command,
CommandScope,
CommandType,
} from '@/command-menu/types/Command';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { i18n } from '@lingui/core';
-import { useRecoilValue, useSetRecoilState } from 'recoil';
-import { IconSparkles } from 'twenty-ui';
-import { useDebounce } from 'use-debounce';
-import { FeatureFlagKey } from '~/generated/graphql';
export const useCommandMenuCommands = () => {
const actionMenuEntries = useRecoilComponentValueV2(
actionMenuEntriesComponentSelector,
);
- const commandMenuSearch = useRecoilValue(commandMenuSearchState);
- const [deferredCommandMenuSearch] = useDebounce(commandMenuSearch, 300); // 200ms - 500ms
-
- const isCopilotEnabled = useIsFeatureEnabled(FeatureFlagKey.IsCopilotEnabled);
- const setCopilotQuery = useSetRecoilState(copilotQueryState);
- const openCopilotRightDrawer = useOpenCopilotRightDrawer();
-
- const copilotCommand: Command = {
- id: 'copilot',
- to: '', // TODO
- Icon: IconSparkles,
- label: 'Open Copilot',
- type: CommandType.Navigate,
- onCommandClick: () => {
- setCopilotQuery(deferredCommandMenuSearch);
- openCopilotRightDrawer();
- },
- };
-
- const copilotCommands: Command[] = isCopilotEnabled ? [copilotCommand] : [];
-
const navigateCommands = Object.values(COMMAND_MENU_NAVIGATE_COMMANDS);
const actionRecordSelectionCommands: Command[] = actionMenuEntries
@@ -144,7 +115,6 @@ export const useCommandMenuCommands = () => {
}));
return {
- copilotCommands,
navigateCommands,
actionRecordSelectionCommands,
actionGlobalCommands,
diff --git a/packages/twenty-front/src/modules/command-menu/hooks/useCommandMenuHotKeys.ts b/packages/twenty-front/src/modules/command-menu/hooks/useCommandMenuHotKeys.ts
index 3b3ade6f1..012b804a7 100644
--- a/packages/twenty-front/src/modules/command-menu/hooks/useCommandMenuHotKeys.ts
+++ b/packages/twenty-front/src/modules/command-menu/hooks/useCommandMenuHotKeys.ts
@@ -8,11 +8,9 @@ import { useKeyboardShortcutMenu } from '@/keyboard-shortcut-menu/hooks/useKeybo
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { AppHotkeyScope } from '@/ui/utilities/hotkey/types/AppHotkeyScope';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { isNonEmptyString } from '@sniptt/guards';
import { useRecoilValue } from 'recoil';
import { Key } from 'ts-key-enum';
-import { FeatureFlagKey } from '~/generated-metadata/graphql';
export const useCommandMenuHotKeys = () => {
const {
@@ -33,10 +31,6 @@ export const useCommandMenuHotKeys = () => {
COMMAND_MENU_COMPONENT_INSTANCE_ID,
);
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
-
useScopedHotkeys(
'ctrl+k,meta+k',
() => {
@@ -71,7 +65,7 @@ export const useCommandMenuHotKeys = () => {
useScopedHotkeys(
[Key.Backspace, Key.Delete],
() => {
- if (isNonEmptyString(commandMenuSearch) || !isCommandMenuV2Enabled) {
+ if (isNonEmptyString(commandMenuSearch)) {
return;
}
diff --git a/packages/twenty-front/src/modules/command-menu/hooks/useMatchingCommandMenuCommands.ts b/packages/twenty-front/src/modules/command-menu/hooks/useMatchingCommandMenuCommands.ts
index 72f66580b..801474397 100644
--- a/packages/twenty-front/src/modules/command-menu/hooks/useMatchingCommandMenuCommands.ts
+++ b/packages/twenty-front/src/modules/command-menu/hooks/useMatchingCommandMenuCommands.ts
@@ -9,7 +9,6 @@ export const useMatchingCommandMenuCommands = ({
const { matchCommands } = useMatchCommands({ commandMenuSearch });
const {
- copilotCommands,
navigateCommands,
actionRecordSelectionCommands,
actionObjectCommands,
@@ -49,7 +48,6 @@ export const useMatchingCommandMenuCommands = ({
return {
noResults,
- copilotCommands,
matchingStandardActionRecordSelectionCommands,
matchingStandardActionObjectCommands,
matchingWorkflowRunRecordSelectionCommands,
diff --git a/packages/twenty-front/src/modules/command-menu/hooks/useSearchRecords.tsx b/packages/twenty-front/src/modules/command-menu/hooks/useSearchRecords.tsx
index f9f403e55..fcd678941 100644
--- a/packages/twenty-front/src/modules/command-menu/hooks/useSearchRecords.tsx
+++ b/packages/twenty-front/src/modules/command-menu/hooks/useSearchRecords.tsx
@@ -1,4 +1,4 @@
-import { useOpenActivityRightDrawer } from '@/activities/hooks/useOpenActivityRightDrawer';
+import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
import { commandMenuSearchState } from '@/command-menu/states/commandMenuSearchState';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { t } from '@lingui/core/macro';
@@ -24,13 +24,7 @@ export const useSearchRecords = () => {
},
});
- const openNoteRightDrawer = useOpenActivityRightDrawer({
- objectNameSingular: CoreObjectNameSingular.Note,
- });
-
- const openTaskRightDrawer = useOpenActivityRightDrawer({
- objectNameSingular: CoreObjectNameSingular.Task,
- });
+ const { openRecordInCommandMenu } = useCommandMenu();
const commands = useMemo(() => {
return (globalSearchData?.globalSearch ?? []).map((searchRecord) => {
@@ -63,14 +57,20 @@ export const useSearchRecords = () => {
to: '',
onCommandClick: () => {
searchRecord.objectSingularName === 'task'
- ? openTaskRightDrawer(searchRecord.recordId)
- : openNoteRightDrawer(searchRecord.recordId);
+ ? openRecordInCommandMenu({
+ recordId: searchRecord.recordId,
+ objectNameSingular: CoreObjectNameSingular.Task,
+ })
+ : openRecordInCommandMenu({
+ recordId: searchRecord.recordId,
+ objectNameSingular: CoreObjectNameSingular.Note,
+ });
},
};
}
return command;
});
- }, [globalSearchData, openTaskRightDrawer, openNoteRightDrawer]);
+ }, [globalSearchData, openRecordInCommandMenu]);
return {
loading,
diff --git a/packages/twenty-front/src/modules/command-menu/pages/workflow/trigger-type/components/CommandMenuWorkflowSelectTriggerTypeContent.tsx b/packages/twenty-front/src/modules/command-menu/pages/workflow/trigger-type/components/CommandMenuWorkflowSelectTriggerTypeContent.tsx
index c94fe92da..fa270cd54 100644
--- a/packages/twenty-front/src/modules/command-menu/pages/workflow/trigger-type/components/CommandMenuWorkflowSelectTriggerTypeContent.tsx
+++ b/packages/twenty-front/src/modules/command-menu/pages/workflow/trigger-type/components/CommandMenuWorkflowSelectTriggerTypeContent.tsx
@@ -1,7 +1,5 @@
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems';
-import { useRightDrawer } from '@/ui/layout/right-drawer/hooks/useRightDrawer';
-import { RightDrawerPages } from '@/ui/layout/right-drawer/types/RightDrawerPages';
import {
WorkflowTriggerType,
WorkflowWithCurrentVersion,
@@ -14,10 +12,8 @@ import { OTHER_TRIGGER_TYPES } from '@/workflow/workflow-trigger/constants/Other
import { TRIGGER_STEP_ID } from '@/workflow/workflow-trigger/constants/TriggerStepId';
import { useUpdateWorkflowVersionTrigger } from '@/workflow/workflow-trigger/hooks/useUpdateWorkflowVersionTrigger';
import { getTriggerDefaultDefinition } from '@/workflow/workflow-trigger/utils/getTriggerDefaultDefinition';
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { useSetRecoilState } from 'recoil';
import { MenuItemCommand, useIcons } from 'twenty-ui';
-import { FeatureFlagKey } from '~/generated-metadata/graphql';
export const CommandMenuWorkflowSelectTriggerTypeContent = ({
workflow,
@@ -29,12 +25,8 @@ export const CommandMenuWorkflowSelectTriggerTypeContent = ({
const { activeObjectMetadataItems } = useFilteredObjectMetadataItems();
- const { openRightDrawer } = useRightDrawer();
const setWorkflowSelectedNode = useSetRecoilState(workflowSelectedNodeState);
const { openWorkflowEditStepInCommandMenu } = useCommandMenu();
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
const handleTriggerTypeClick = ({
type,
@@ -56,18 +48,11 @@ export const CommandMenuWorkflowSelectTriggerTypeContent = ({
setWorkflowSelectedNode(TRIGGER_STEP_ID);
- if (isCommandMenuV2Enabled) {
- openWorkflowEditStepInCommandMenu(
- workflow.id,
- defaultLabel,
- getIcon(icon),
- );
- } else {
- openRightDrawer(RightDrawerPages.WorkflowStepEdit, {
- title: defaultLabel,
- Icon: getIcon(icon),
- });
- }
+ openWorkflowEditStepInCommandMenu(
+ workflow.id,
+ defaultLabel,
+ getIcon(icon),
+ );
};
};
diff --git a/packages/twenty-front/src/modules/favorites/components/PageFavoriteButton.tsx b/packages/twenty-front/src/modules/favorites/components/PageFavoriteButton.tsx
index 100abe308..e8c324382 100644
--- a/packages/twenty-front/src/modules/favorites/components/PageFavoriteButton.tsx
+++ b/packages/twenty-front/src/modules/favorites/components/PageFavoriteButton.tsx
@@ -1,6 +1,4 @@
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
-import { Button, IconButton, IconHeart, IconHeartOff } from 'twenty-ui';
-import { FeatureFlagKey } from '~/generated/graphql';
+import { Button, IconHeart, IconHeartOff } from 'twenty-ui';
type PageFavoriteButtonProps = {
isFavorite: boolean;
@@ -13,33 +11,16 @@ export const PageFavoriteButton = ({
}: PageFavoriteButtonProps) => {
const title = isFavorite ? 'Remove from favorites' : 'Add to favorites';
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
-
return (
- <>
- {isCommandMenuV2Enabled ? (
-
- ) : (
-
- )}
- >
+
);
};
diff --git a/packages/twenty-front/src/modules/object-record/components/RecordChip.tsx b/packages/twenty-front/src/modules/object-record/components/RecordChip.tsx
index bbc54d04f..f49cd7bcc 100644
--- a/packages/twenty-front/src/modules/object-record/components/RecordChip.tsx
+++ b/packages/twenty-front/src/modules/object-record/components/RecordChip.tsx
@@ -9,7 +9,7 @@ import {
import { useCommandMenu } from '@/command-menu/hooks/useCommandMenu';
import { getLinkToShowPage } from '@/object-metadata/utils/getLinkToShowPage';
import { useRecordChipData } from '@/object-record/hooks/useRecordChipData';
-import { recordIndexOpenRecordInSelector } from '@/object-record/record-index/states/selectors/recordIndexOpenRecordInSelector';
+import { recordIndexOpenRecordInState } from '@/object-record/record-index/states/recordIndexOpenRecordInState';
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { ViewOpenRecordInType } from '@/views/types/ViewOpenRecordInType';
import { useRecoilValue } from 'recoil';
@@ -41,9 +41,7 @@ export const RecordChip = ({
const { openRecordInCommandMenu } = useCommandMenu();
- const recordIndexOpenRecordIn = useRecoilValue(
- recordIndexOpenRecordInSelector,
- );
+ const recordIndexOpenRecordIn = useRecoilValue(recordIndexOpenRecordInState);
// TODO temporary until we create a record show page for Workspaces members
if (forceDisableClick) {
diff --git a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownMenuContent.tsx b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownMenuContent.tsx
index ebbfaf985..e41e3e847 100644
--- a/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownMenuContent.tsx
+++ b/packages/twenty-front/src/modules/object-record/object-options-dropdown/components/ObjectOptionsDropdownMenuContent.tsx
@@ -24,24 +24,16 @@ import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly';
-import { ViewType } from '@/views/types/ViewType';
import { useDeleteViewFromCurrentState } from '@/views/view-picker/hooks/useDeleteViewFromCurrentState';
import { viewPickerReferenceViewIdComponentState } from '@/views/view-picker/states/viewPickerReferenceViewIdComponentState';
-import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { useTheme } from '@emotion/react';
import { useLingui } from '@lingui/react/macro';
import { isDefined } from 'twenty-shared';
-import { FeatureFlagKey } from '~/generated-metadata/graphql';
export const ObjectOptionsDropdownMenuContent = () => {
const { t } = useLingui();
- const {
- recordIndexId,
- objectMetadataItem,
- viewType,
- onContentChange,
- closeDropdown,
- } = useOptionsDropdown();
+ const { recordIndexId, objectMetadataItem, onContentChange, closeDropdown } =
+ useOptionsDropdown();
const { getIcon } = useIcons();
const { currentView } = useGetCurrentViewOnly();
@@ -70,10 +62,6 @@ export const ObjectOptionsDropdownMenuContent = () => {
viewBarId: recordIndexId,
});
- const isCommandMenuV2Enabled = useIsFeatureEnabled(
- FeatureFlagKey.IsCommandMenuV2Enabled,
- );
-
const { deleteViewFromCurrentState } = useDeleteViewFromCurrentState();
const setViewPickerReferenceViewId = useSetRecoilComponentStateV2(
viewPickerReferenceViewIdComponentState,
@@ -95,19 +83,15 @@ export const ObjectOptionsDropdownMenuContent = () => {
{currentView?.name}
- {(isCommandMenuV2Enabled || viewType === ViewType.Kanban) && (
- <>
-
-
-
- >
- )}
+
+
+