diff --git a/packages/twenty-front/src/modules/page-layout/widgets/email-thread/components/EmailThreadComposer.tsx b/packages/twenty-front/src/modules/page-layout/widgets/email-thread/components/EmailThreadComposer.tsx index 30c1f3ad82..2f6b410e19 100644 --- a/packages/twenty-front/src/modules/page-layout/widgets/email-thread/components/EmailThreadComposer.tsx +++ b/packages/twenty-front/src/modules/page-layout/widgets/email-thread/components/EmailThreadComposer.tsx @@ -1,14 +1,13 @@ import { styled } from '@linaria/react'; -import { useCallback, useEffect, useMemo } from 'react'; +import { useCallback, useMemo } from 'react'; import { EmailComposerFields } from '@/activities/emails/components/EmailComposerFields'; import { useEmailComposerState } from '@/activities/emails/hooks/useEmailComposerState'; import { type ReplyContextReady } from '@/activities/emails/hooks/useReplyContext'; +import { EmailThreadComposerFooterEffect } from '@/page-layout/widgets/email-thread/components/EmailThreadComposerFooterEffect'; import { SIDE_PANEL_FOCUS_ID } from '@/side-panel/constants/SidePanelFocusId'; -import { sidePanelWidgetFooterCommandMenuItemsState } from '@/ui/layout/side-panel/states/sidePanelWidgetFooterCommandMenuItemsState'; import { type SidePanelFooterCommandMenuItem } from '@/ui/layout/side-panel/types/SidePanelFooterCommandMenuItem'; import { useHotkeysOnFocusedElement } from '@/ui/utilities/hotkey/hooks/useHotkeysOnFocusedElement'; -import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState'; import { t } from '@lingui/core/macro'; import { IconArrowBackUp, IconSend, IconX } from 'twenty-ui/icon'; import { themeCssVariables } from 'twenty-ui/theme-constants'; @@ -55,58 +54,47 @@ export const EmailThreadComposer = ({ onSent: handleReplySent, }); - const setSidePanelWidgetFooterCommandMenuItems = useSetAtomState( - sidePanelWidgetFooterCommandMenuItemsState, - ); + const { handleSend, canSend } = composerState; + + const footerCommandMenuItems = + useMemo((): SidePanelFooterCommandMenuItem[] => { + if (!isComposerOpen) { + return [ + { + id: 'reply', + label: t`Reply`, + Icon: IconArrowBackUp, + isPrimaryCTA: true, + onClick: () => setIsComposerOpen(true), + }, + ]; + } - const footerActions = useMemo((): SidePanelFooterCommandMenuItem[] => { - if (!isComposerOpen) { return [ { - id: 'reply', - label: t`Reply`, - Icon: IconArrowBackUp, + id: 'cancel-reply', + label: t`Cancel reply`, + Icon: IconX, + isPinned: false, + onClick: () => setIsComposerOpen(false), + }, + { + id: 'send', + label: t`Send`, + Icon: IconSend, isPrimaryCTA: true, - onClick: () => setIsComposerOpen(true), + hotkeys: [getOsControlSymbol(), '⏎'], + onClick: handleSend, + disabled: !canSend, }, ]; - } - - return [ - { - id: 'cancel-reply', - label: t`Cancel reply`, - Icon: IconX, - isPinned: false, - onClick: () => setIsComposerOpen(false), - }, - { - id: 'send', - label: t`Send`, - Icon: IconSend, - isPrimaryCTA: true, - hotkeys: [getOsControlSymbol(), '⏎'], - onClick: composerState.handleSend, - disabled: !composerState.canSend, - }, - ]; - }, [isComposerOpen, composerState, setIsComposerOpen]); - - useEffect(() => { - if (!isInSidePanel) { - return; - } - - setSidePanelWidgetFooterCommandMenuItems(footerActions); - - return () => setSidePanelWidgetFooterCommandMenuItems([]); - }, [isInSidePanel, footerActions, setSidePanelWidgetFooterCommandMenuItems]); + }, [isComposerOpen, handleSend, canSend, setIsComposerOpen]); const handleSendHotkey = useCallback(() => { - if (isComposerOpen && composerState.canSend) { - composerState.handleSend(); + if (isComposerOpen && canSend) { + handleSend(); } - }, [isComposerOpen, composerState]); + }, [isComposerOpen, canSend, handleSend]); useHotkeysOnFocusedElement({ keys: ['ctrl+Enter,meta+Enter'], @@ -115,18 +103,23 @@ export const EmailThreadComposer = ({ dependencies: [handleSendHotkey], }); - if (!isComposerOpen) { - if (isInSidePanel) { - return null; - } - - return ( - setIsComposerOpen(true)}> - - {t`Reply...`} - - ); - } - - return ; + return ( + <> + {isInSidePanel && ( + + )} + {isComposerOpen ? ( + + ) : ( + !isInSidePanel && ( + setIsComposerOpen(true)}> + + {t`Reply...`} + + ) + )} + + ); }; diff --git a/packages/twenty-front/src/modules/page-layout/widgets/email-thread/components/EmailThreadComposerFooterEffect.tsx b/packages/twenty-front/src/modules/page-layout/widgets/email-thread/components/EmailThreadComposerFooterEffect.tsx new file mode 100644 index 0000000000..270fb67b53 --- /dev/null +++ b/packages/twenty-front/src/modules/page-layout/widgets/email-thread/components/EmailThreadComposerFooterEffect.tsx @@ -0,0 +1,25 @@ +import { useEffect } from 'react'; + +import { sidePanelWidgetFooterCommandMenuItemsState } from '@/ui/layout/side-panel/states/sidePanelWidgetFooterCommandMenuItemsState'; +import { type SidePanelFooterCommandMenuItem } from '@/ui/layout/side-panel/types/SidePanelFooterCommandMenuItem'; +import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState'; + +type EmailThreadComposerFooterEffectProps = { + footerCommandMenuItems: SidePanelFooterCommandMenuItem[]; +}; + +export const EmailThreadComposerFooterEffect = ({ + footerCommandMenuItems, +}: EmailThreadComposerFooterEffectProps) => { + const setSidePanelWidgetFooterCommandMenuItems = useSetAtomState( + sidePanelWidgetFooterCommandMenuItemsState, + ); + + useEffect(() => { + setSidePanelWidgetFooterCommandMenuItems(footerCommandMenuItems); + + return () => setSidePanelWidgetFooterCommandMenuItems([]); + }, [footerCommandMenuItems, setSidePanelWidgetFooterCommandMenuItems]); + + return <>; +};