(null);
// Use global state instead of local state
- const composerIsOpen =
- mode === 'reply'
- ? mail.replyComposerOpen
- : mode === 'replyAll'
- ? mail.replyAllComposerOpen
- : mail.forwardComposerOpen;
- const setComposerIsOpen = (value: boolean) => {
- setMail((prev: typeof mail) => ({
- ...prev,
- replyComposerOpen: mode === 'reply' ? value : prev.replyComposerOpen,
- replyAllComposerOpen: mode === 'replyAll' ? value : prev.replyAllComposerOpen,
- forwardComposerOpen: mode === 'forward' ? value : prev.forwardComposerOpen,
- }));
- };
+ const composerIsOpen = !!mode;
// Use reducers instead of multiple useState
const [composerState, composerDispatch] = useReducer(composerReducer, {
@@ -327,7 +307,7 @@ export default function ReplyCompose({ mode = 'reply' }: ReplyComposeProps) {
}
reset();
- setComposerIsOpen(false);
+ setMode(null);
toast.success(t('pages.createEmail.emailSentSuccessfully'));
} catch (error) {
console.error('Error sending email:', error);
@@ -389,10 +369,6 @@ export default function ReplyCompose({ mode = 'reply' }: ReplyComposeProps) {
if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {
setAttachments([...attachments, ...Array.from(e.dataTransfer.files)]);
- // Open the composer if it's not already open
- if (!composerIsOpen) {
- setComposerIsOpen(true);
- }
}
}
};
@@ -428,12 +404,7 @@ export default function ReplyCompose({ mode = 'reply' }: ReplyComposeProps) {
if (document.activeElement instanceof HTMLElement) {
document.activeElement.blur();
}
- setMail((prev) => ({
- ...prev,
- replyComposerOpen: false,
- replyAllComposerOpen: false,
- forwardComposerOpen: false,
- }));
+ setMode(null);
setIsEditingRecipients(false);
setShowCc(false);
setShowBcc(false);
@@ -976,12 +947,7 @@ export default function ReplyCompose({ mode = 'reply' }: ReplyComposeProps) {
-
+
@@ -142,6 +142,7 @@ export function ThreadDisplay({ isMobile, id }: ThreadDisplayProps) {
const { mutate: mutateStats } = useStats();
const { folder } = useParams<{ folder: string }>();
const [threadId, setThreadId] = useQueryState('threadId');
+ const [mode, setMode] = useQueryState('mode');
// Check if thread contains any images (excluding sender avatars)
const hasImages = useMemo(() => {
@@ -191,7 +192,8 @@ export function ThreadDisplay({ isMobile, id }: ThreadDisplayProps) {
const isInBin = folder === FOLDERS.BIN;
const handleClose = useCallback(() => {
setThreadId(null);
- }, []);
+ setMode(null);
+ }, [setThreadId, setMode]);
const moveThreadTo = useCallback(
async (destination: ThreadDestination) => {
@@ -373,14 +375,9 @@ export function ThreadDisplay({ isMobile, id }: ThreadDisplayProps) {
icon={Reply}
label={t('common.threadDisplay.reply')}
disabled={!emailData}
- className={cn(mail.replyComposerOpen && 'bg-primary/10')}
+ className={cn(mode === 'reply' && 'bg-primary/10')}
onClick={() => {
- setMail((prev) => ({
- ...prev,
- replyComposerOpen: true,
- replyAllComposerOpen: false,
- forwardComposerOpen: false,
- }));
+ setMode('reply');
}}
/>
{hasMultipleParticipants && (
@@ -388,14 +385,9 @@ export function ThreadDisplay({ isMobile, id }: ThreadDisplayProps) {
icon={ReplyAll}
label={t('common.threadDisplay.replyAll')}
disabled={!emailData}
- className={cn(mail.replyAllComposerOpen && 'bg-primary/10')}
+ className={cn(mode === 'replyAll' && 'bg-primary/10')}
onClick={() => {
- setMail((prev) => ({
- ...prev,
- replyComposerOpen: false,
- replyAllComposerOpen: true,
- forwardComposerOpen: false,
- }));
+ setMode('replyAll');
}}
/>
)}
@@ -403,14 +395,9 @@ export function ThreadDisplay({ isMobile, id }: ThreadDisplayProps) {
icon={Forward}
label={t('common.threadDisplay.forward')}
disabled={!emailData}
- className={cn(mail.forwardComposerOpen && 'bg-primary/10')}
+ className={cn(mode === 'forward' && 'bg-primary/10')}
onClick={() => {
- setMail((prev) => ({
- ...prev,
- replyComposerOpen: false,
- replyAllComposerOpen: false,
- forwardComposerOpen: true,
- }));
+ setMode('forward');
}}
/>
@@ -453,15 +440,7 @@ export function ThreadDisplay({ isMobile, id }: ThreadDisplayProps) {
-
+
diff --git a/apps/mail/components/providers/hotkey-provider-wrapper.tsx b/apps/mail/components/providers/hotkey-provider-wrapper.tsx
index cc89ddc636..13809cd307 100644
--- a/apps/mail/components/providers/hotkey-provider-wrapper.tsx
+++ b/apps/mail/components/providers/hotkey-provider-wrapper.tsx
@@ -1,10 +1,10 @@
'use client';
-import { HotkeysProvider } from 'react-hotkeys-hook';
-import { GlobalHotkeys } from '@/lib/hotkeys/global-hotkeys';
-import { MailListHotkeys } from '@/lib/hotkeys/mail-list-hotkeys';
import { ThreadDisplayHotkeys } from '@/lib/hotkeys/thread-display-hotkeys';
+import { MailListHotkeys } from '@/lib/hotkeys/mail-list-hotkeys';
import { ComposeHotkeys } from '@/lib/hotkeys/compose-hotkeys';
+import { GlobalHotkeys } from '@/lib/hotkeys/global-hotkeys';
+import { HotkeysProvider } from 'react-hotkeys-hook';
import React from 'react';
interface HotkeyProviderWrapperProps {
@@ -15,10 +15,10 @@ export function HotkeyProviderWrapper({ children }: HotkeyProviderWrapperProps)
return (
-
+ {/* */}
{children}
);
-}
\ No newline at end of file
+}