Skip to content

Commit bf690d1

Browse files
committed
made required changes
1 parent 8a99439 commit bf690d1

File tree

2 files changed

+85
-49
lines changed

2 files changed

+85
-49
lines changed

apps/web/components/email-list/EmailList.tsx

+84-46
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
deleteEmails,
3333
markReadThreads,
3434
} from "@/store/archive-queue";
35+
import { useTableKeyboardNavigation } from "@/hooks/useTableKeyboardNavigation";
3536

3637
export function List({
3738
emails,
@@ -364,52 +365,70 @@ export function EmailList({
364365
);
365366
}, [selectedRows, refetch]);
366367

367-
const [focusedIndex, setFocusedIndex] = useState(0);
368-
369-
useEffect(() => {
370-
function handleKeyDown(e: KeyboardEvent) {
371-
if (
372-
document.activeElement?.tagName === "INPUT" ||
373-
document.activeElement?.tagName === "TEXTAREA"
374-
)
375-
return;
376-
377-
const isCmdOrCtrl = e.metaKey || e.ctrlKey;
378-
379-
if (e.key === "ArrowDown") {
380-
setFocusedIndex((prev) => Math.min(prev + 1, threads.length - 1));
381-
}
382-
383-
if (e.key === "ArrowUp") {
384-
setFocusedIndex((prev) => Math.max(prev - 1, 0));
385-
}
386-
387-
if (e.key === "r" || e.key === "R") {
388-
if (isCmdOrCtrl) {
389-
e.preventDefault();
390-
}
391-
const thread = threads[focusedIndex];
392-
if (thread) {
393-
setOpenThreadId(thread.id);
394-
markReadThreads([thread.id], () => refetch());
395-
scrollToId(thread.id);
396-
}
397-
}
398-
399-
if (e.key === "e" || e.key === "E") {
400-
if (isCmdOrCtrl) {
401-
e.preventDefault();
402-
}
403-
const thread = threads[focusedIndex];
404-
if (thread) {
405-
onArchive(thread);
406-
}
368+
// useEffect(() => {
369+
// function handleKeyDown(e: KeyboardEvent) {
370+
// if (
371+
// document.activeElement?.tagName === "INPUT" ||
372+
// document.activeElement?.tagName === "TEXTAREA"
373+
// )
374+
// return;
375+
376+
// const isCmdOrCtrl = e.metaKey || e.ctrlKey;
377+
378+
// if (e.key === "ArrowDown") {
379+
// setFocusedIndex((prev) => Math.min(prev + 1, threads.length - 1));
380+
// }
381+
382+
// if (e.key === "ArrowUp") {
383+
// setFocusedIndex((prev) => Math.max(prev - 1, 0));
384+
// }
385+
386+
// if (e.key === "r" || e.key === "R") {
387+
// if (isCmdOrCtrl) {
388+
// e.preventDefault();
389+
// }
390+
// const thread = threads[focusedIndex];
391+
// if (thread) {
392+
// setOpenThreadId(thread.id);
393+
// markReadThreads([thread.id], () => refetch());
394+
// scrollToId(thread.id);
395+
// }
396+
// }
397+
398+
// if (e.key === "e" || e.key === "E") {
399+
// if (isCmdOrCtrl) {
400+
// e.preventDefault();
401+
// }
402+
// const thread = threads[focusedIndex];
403+
// if (thread) {
404+
// onArchive(thread);
405+
// }
406+
// }
407+
// }
408+
409+
// window.addEventListener("keydown", handleKeyDown);
410+
// return () => window.removeEventListener("keydown", handleKeyDown);
411+
// }, [threads, focusedIndex, setOpenThreadId, onArchive, refetch]);
412+
413+
// const [focusedIndex, setFocusedIndex] = useState(0);
414+
415+
const handleAction = useCallback(
416+
async (index: number, action: "reply" | "archive") => {
417+
const thread = threads[index];
418+
if (!thread) return;
419+
420+
if (action === "reply") {
421+
setOpenThreadId(thread.id);
422+
markReadThreads([thread.id], () => refetch());
423+
scrollToId(thread.id);
424+
} else if (action === "archive") {
425+
onArchive(thread);
407426
}
408-
}
427+
},
428+
[threads, setOpenThreadId],
429+
);
409430

410-
window.addEventListener("keydown", handleKeyDown);
411-
return () => window.removeEventListener("keydown", handleKeyDown);
412-
}, [threads, focusedIndex, setOpenThreadId, onArchive, refetch]);
431+
const { selectedIndex } = useEmailListKeyboardNav(threads, handleAction);
413432

414433
const onPlanAiBulk = useCallback(async () => {
415434
toast.promise(
@@ -502,7 +521,6 @@ export function EmailList({
502521

503522
return (
504523
<EmailListItem
505-
focused={focusedIndex === index}
506524
key={thread.id}
507525
ref={(node) => {
508526
const map = getMap();
@@ -516,7 +534,7 @@ export function EmailList({
516534
thread={thread}
517535
opened={openThreadId === thread.id}
518536
closePanel={closePanel}
519-
selected={selectedRows[thread.id]}
537+
selected={selectedIndex === index}
520538
onSelected={onSetSelectedRow}
521539
splitView={!!openThreadId}
522540
onClick={onOpen}
@@ -574,6 +592,26 @@ export function EmailList({
574592
);
575593
}
576594

595+
function useEmailListKeyboardNav(
596+
items: { id: string }[],
597+
onAction: (index: number, action: "reply" | "archive") => void,
598+
) {
599+
const handleKeyAction = useCallback(
600+
(index: number, key: string) => {
601+
if (key === "r") onAction(index, "reply");
602+
else if (key === "e") onAction(index, "archive");
603+
},
604+
[onAction],
605+
);
606+
607+
const { selectedIndex, setSelectedIndex, getRefCallback } =
608+
useTableKeyboardNavigation({
609+
items,
610+
onKeyAction: handleKeyAction,
611+
});
612+
return { selectedIndex, setSelectedIndex, getRefCallback };
613+
}
614+
577615
function ResizeGroup({
578616
left,
579617
right,

apps/web/components/email-list/EmailListItem.tsx

+1-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ export const EmailListItem = forwardRef(
2626
(
2727
props: {
2828
userEmailAddress: string;
29-
focused?: boolean;
3029
thread: Thread;
3130
opened: boolean;
3231
selected: boolean;
@@ -77,12 +76,11 @@ export const EmailListItem = forwardRef(
7776
ref={ref}
7877
className={clsx("group relative cursor-pointer border-l-4 py-3", {
7978
"hover:bg-slate-50 dark:hover:bg-slate-950":
80-
!props.selected && !props.opened && !props.focused,
79+
!props.selected && !props.opened,
8180
"bg-blue-50 dark:bg-blue-950": props.selected,
8281
"bg-blue-100 dark:bg-blue-900": props.opened,
8382
"bg-slate-100 dark:bg-background":
8483
!isUnread && !props.selected && !props.opened,
85-
"z-10 ring-2 ring-blue-400": props.focused,
8684
})}
8785
onClick={props.onClick}
8886
onKeyDown={(e) => {

0 commit comments

Comments
 (0)