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 16c292fa4..f6ad70b7b 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 @@ -1,10 +1,7 @@ -import { RegisterRecordActionEffect } from '@/action-menu/actions/record-actions/components/RegisterRecordActionEffect'; +import { RegisterRecordActionEffects } from '@/action-menu/actions/record-actions/components/RegisterRecordActionEffects'; import { WorkflowRunRecordActionMenuEntrySetterEffect } from '@/action-menu/actions/record-actions/workflow-run-record-actions/components/WorkflowRunRecordActionMenuEntrySetter'; -import { getActionConfig } from '@/action-menu/actions/utils/getActionConfig'; -import { getActionViewType } from '@/action-menu/actions/utils/getActionViewType'; import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId'; import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState'; -import { contextStoreCurrentViewTypeComponentState } from '@/context-store/states/contextStoreCurrentViewTypeComponentState'; import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; @@ -43,10 +40,6 @@ export const RecordActionMenuEntriesSetter = () => { contextStoreTargetedRecordsRuleComponentState, ); - const contextStoreCurrentViewType = useRecoilComponentValueV2( - contextStoreCurrentViewTypeComponentState, - ); - const isWorkflowEnabled = useIsFeatureEnabled( FeatureFlagKey.IsWorkflowEnabled, ); @@ -55,28 +48,9 @@ export const RecordActionMenuEntriesSetter = () => { return null; } - const viewType = getActionViewType( - contextStoreCurrentViewType, - contextStoreTargetedRecordsRule, - ); - - const actionConfig = getActionConfig(objectMetadataItem); - - const actionsToRegister = isDefined(viewType) - ? Object.values(actionConfig ?? {}).filter((action) => - action.availableOn?.includes(viewType), - ) - : []; - return ( <> - {actionsToRegister.map((action) => ( - - ))} + {isWorkflowEnabled && contextStoreTargetedRecordsRule?.mode === 'selection' && diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterRecordActionEffect.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterRecordActionEffect.tsx index 2a4498285..3d79f57d5 100644 --- a/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterRecordActionEffect.tsx +++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterRecordActionEffect.tsx @@ -2,7 +2,6 @@ import { RecordConfigAction } from '@/action-menu/actions/types/RecordConfigActi import { wrapActionInCallbacks } from '@/action-menu/actions/utils/wrapActionInCallbacks'; import { ActionMenuContext } from '@/action-menu/contexts/ActionMenuContext'; import { useActionMenuEntries } from '@/action-menu/hooks/useActionMenuEntries'; -import { useShouldActionBeRegisteredParams } from '@/action-menu/hooks/useShouldActionBeRegisteredParams'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { useContext, useEffect } from 'react'; @@ -34,26 +33,13 @@ export const RegisterRecordActionEffect = ({ onActionExecutedCallback, }); - const params = useShouldActionBeRegisteredParams({ - objectMetadataItem, - }); - - const shouldBeRegistered = action.shouldBeRegistered(params); - useEffect(() => { - if (shouldBeRegistered) { - addActionMenuEntry(wrappedAction); - } + addActionMenuEntry(wrappedAction); return () => { removeActionMenuEntry(wrappedAction.key); }; - }, [ - addActionMenuEntry, - removeActionMenuEntry, - shouldBeRegistered, - wrappedAction, - ]); + }, [addActionMenuEntry, removeActionMenuEntry, wrappedAction]); return null; }; diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterRecordActionEffects.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterRecordActionEffects.tsx new file mode 100644 index 000000000..c9a2f4b84 --- /dev/null +++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/components/RegisterRecordActionEffects.tsx @@ -0,0 +1,27 @@ +import { RegisterRecordActionEffect } from '@/action-menu/actions/record-actions/components/RegisterRecordActionEffect'; +import { useRegisteredRecordActions } from '@/action-menu/hooks/useRegisteredRecordActions'; +import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; + +type RegisterRecordActionEffectsProps = { + objectMetadataItem: ObjectMetadataItem; +}; + +export const RegisterRecordActionEffects = ({ + objectMetadataItem, +}: RegisterRecordActionEffectsProps) => { + const actionsToRegister = useRegisteredRecordActions({ + objectMetadataItem, + }); + + return ( + <> + {actionsToRegister.map((action) => ( + + ))} + + ); +}; diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RecordAgnosticActionMenuEntriesSetter.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RecordAgnosticActionMenuEntriesSetter.tsx index c799a0db6..527f0bae4 100644 --- a/packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RecordAgnosticActionMenuEntriesSetter.tsx +++ b/packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RecordAgnosticActionMenuEntriesSetter.tsx @@ -1,11 +1,13 @@ -import { RegisterAgnosticRecordActionEffect } from '@/action-menu/actions/record-agnostic-actions/components/RegisterAgnosticRecordActionEffect'; -import { RECORD_AGNOSTIC_ACTIONS_CONFIG } from '@/action-menu/actions/record-agnostic-actions/constants/RecordAgnosticActionsConfig'; +import { RegisterAgnosticActionEffect } from '@/action-menu/actions/record-agnostic-actions/components/RegisterAgnosticActionEffect'; +import { useRegisteredRecordAgnosticActions } from '@/action-menu/hooks/useRegisteredRecordAgnosticActions'; export const RecordAgnosticActionMenuEntriesSetter = () => { + const actionsToRegister = useRegisteredRecordAgnosticActions(); + return ( <> - {Object.values(RECORD_AGNOSTIC_ACTIONS_CONFIG).map((action) => ( - + {actionsToRegister.map((action) => ( + ))} ); diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RegisterAgnosticRecordActionEffect.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RegisterAgnosticActionEffect.tsx similarity index 71% rename from packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RegisterAgnosticRecordActionEffect.tsx rename to packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RegisterAgnosticActionEffect.tsx index e8a664db5..430addb12 100644 --- a/packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RegisterAgnosticRecordActionEffect.tsx +++ b/packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RegisterAgnosticActionEffect.tsx @@ -4,17 +4,15 @@ import { ActionMenuContext } from '@/action-menu/contexts/ActionMenuContext'; import { useActionMenuEntries } from '@/action-menu/hooks/useActionMenuEntries'; import { useContext, useEffect } from 'react'; -type RegisterAgnosticRecordActionEffectProps = { +type RegisterAgnosticActionEffectProps = { action: RecordAgnosticConfigAction; }; -export const RegisterAgnosticRecordActionEffect = ({ +export const RegisterAgnosticActionEffect = ({ action, -}: RegisterAgnosticRecordActionEffectProps) => { +}: RegisterAgnosticActionEffectProps) => { const { onClick, ConfirmationModal } = action.useAction(); - const shouldBeRegistered = action.shouldBeRegistered({}); - const { onActionStartedCallback, onActionExecutedCallback } = useContext(ActionMenuContext); @@ -31,19 +29,12 @@ export const RegisterAgnosticRecordActionEffect = ({ }); useEffect(() => { - if (shouldBeRegistered) { - addActionMenuEntry(wrappedAction); - } + addActionMenuEntry(wrappedAction); return () => { removeActionMenuEntry(wrappedAction.key); }; - }, [ - addActionMenuEntry, - removeActionMenuEntry, - shouldBeRegistered, - wrappedAction, - ]); + }, [addActionMenuEntry, removeActionMenuEntry, wrappedAction]); return null; }; diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RunWorkflowRecordAgnosticActionMenuEntriesSetter.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RunWorkflowRecordAgnosticActionMenuEntriesSetter.tsx index 5cc6dfc06..cb0c6e6d0 100644 --- a/packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RunWorkflowRecordAgnosticActionMenuEntriesSetter.tsx +++ b/packages/twenty-front/src/modules/action-menu/actions/record-agnostic-actions/components/RunWorkflowRecordAgnosticActionMenuEntriesSetter.tsx @@ -1,4 +1,4 @@ -import { RegisterAgnosticRecordActionEffect } from '@/action-menu/actions/record-agnostic-actions/components/RegisterAgnosticRecordActionEffect'; +import { RegisterAgnosticActionEffect } from '@/action-menu/actions/record-agnostic-actions/components/RegisterAgnosticActionEffect'; import { useRunWorkflowActions } from '@/action-menu/actions/record-agnostic-actions/run-workflow-actions/hooks/useRunWorkflowActions'; export const RunWorkflowRecordAgnosticActionMenuEntriesSetter = () => { @@ -7,7 +7,7 @@ export const RunWorkflowRecordAgnosticActionMenuEntriesSetter = () => { return ( <> {runWorkflowActions.map((action) => ( - + ))} ); diff --git a/packages/twenty-front/src/modules/action-menu/hooks/useRegisteredRecordActions.ts b/packages/twenty-front/src/modules/action-menu/hooks/useRegisteredRecordActions.ts new file mode 100644 index 000000000..8656f3573 --- /dev/null +++ b/packages/twenty-front/src/modules/action-menu/hooks/useRegisteredRecordActions.ts @@ -0,0 +1,48 @@ +import { ActionViewType } from '@/action-menu/actions/types/ActionViewType'; +import { getActionConfig } from '@/action-menu/actions/utils/getActionConfig'; +import { getActionViewType } from '@/action-menu/actions/utils/getActionViewType'; +import { useShouldActionBeRegisteredParams } from '@/action-menu/hooks/useShouldActionBeRegisteredParams'; +import { contextStoreCurrentViewTypeComponentState } from '@/context-store/states/contextStoreCurrentViewTypeComponentState'; +import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState'; +import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; +import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; +import { isDefined } from 'twenty-shared/utils'; + +export const useRegisteredRecordActions = ({ + objectMetadataItem, +}: { + objectMetadataItem: ObjectMetadataItem; +}) => { + const params = useShouldActionBeRegisteredParams({ + objectMetadataItem, + }); + + const contextStoreTargetedRecordsRule = useRecoilComponentValueV2( + contextStoreTargetedRecordsRuleComponentState, + ); + + const contextStoreCurrentViewType = useRecoilComponentValueV2( + contextStoreCurrentViewTypeComponentState, + ); + + const viewType = getActionViewType( + contextStoreCurrentViewType, + contextStoreTargetedRecordsRule, + ); + + const actionConfig = getActionConfig(objectMetadataItem); + + const actionsToRegister = isDefined(viewType) + ? Object.values(actionConfig ?? {}).filter( + (action) => + action.availableOn?.includes(viewType) || + action.availableOn?.includes(ActionViewType.GLOBAL), + ) + : []; + + const actions = actionsToRegister.filter((action) => + action.shouldBeRegistered(params), + ); + + return actions; +}; diff --git a/packages/twenty-front/src/modules/action-menu/hooks/useRegisteredRecordAgnosticActions.ts b/packages/twenty-front/src/modules/action-menu/hooks/useRegisteredRecordAgnosticActions.ts new file mode 100644 index 000000000..e26080a39 --- /dev/null +++ b/packages/twenty-front/src/modules/action-menu/hooks/useRegisteredRecordAgnosticActions.ts @@ -0,0 +1,36 @@ +import { RECORD_AGNOSTIC_ACTIONS_CONFIG } from '@/action-menu/actions/record-agnostic-actions/constants/RecordAgnosticActionsConfig'; +import { ActionViewType } from '@/action-menu/actions/types/ActionViewType'; +import { getActionViewType } from '@/action-menu/actions/utils/getActionViewType'; +import { contextStoreCurrentViewTypeComponentState } from '@/context-store/states/contextStoreCurrentViewTypeComponentState'; +import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState'; +import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; +import { isDefined } from 'twenty-shared/utils'; + +export const useRegisteredRecordAgnosticActions = () => { + const contextStoreTargetedRecordsRule = useRecoilComponentValueV2( + contextStoreTargetedRecordsRuleComponentState, + ); + + const contextStoreCurrentViewType = useRecoilComponentValueV2( + contextStoreCurrentViewTypeComponentState, + ); + + const viewType = getActionViewType( + contextStoreCurrentViewType, + contextStoreTargetedRecordsRule, + ); + + const actionsToRegister = isDefined(viewType) + ? Object.values(RECORD_AGNOSTIC_ACTIONS_CONFIG ?? {}).filter( + (action) => + action.availableOn?.includes(viewType) || + action.availableOn?.includes(ActionViewType.GLOBAL), + ) + : []; + + const actions = actionsToRegister.filter((action) => + action.shouldBeRegistered({}), + ); + + return actions; +};