Skip to content

Commit 74d5ba4

Browse files
author
Ian Philpot
committed
feat: close modal on Escape key press
- Add useEffect hook to listen for Escape keydown event - Clean up listener on unmount to prevent memory leaks - Add tests for Escape key behavior Closes #14
1 parent c55f119 commit 74d5ba4

3 files changed

Lines changed: 42 additions & 1 deletion

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "vibe-playground",
33
"productName": "Vibe Playground",
4-
"version": "0.6.2",
4+
"version": "0.6.3",
55
"description": "Terminal manager with integrated file browsing for multiple repositories",
66
"main": ".webpack/main",
77
"private": true,

src/renderer/components/HotkeyHelp/HotkeyHelp.test.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,32 @@ describe('HotkeyHelp', () => {
7373
const rows = table?.querySelectorAll('tr');
7474
expect(rows?.length).toBe(7); // 7 shortcuts defined
7575
});
76+
77+
it('should call onClose when Escape key is pressed', () => {
78+
const onClose = jest.fn();
79+
render(<HotkeyHelp isOpen={true} onClose={onClose} />);
80+
81+
fireEvent.keyDown(document, { key: 'Escape' });
82+
83+
expect(onClose).toHaveBeenCalledTimes(1);
84+
});
85+
86+
it('should not respond to Escape key when modal is closed', () => {
87+
const onClose = jest.fn();
88+
render(<HotkeyHelp isOpen={false} onClose={onClose} />);
89+
90+
fireEvent.keyDown(document, { key: 'Escape' });
91+
92+
expect(onClose).not.toHaveBeenCalled();
93+
});
94+
95+
it('should clean up event listener on unmount', () => {
96+
const onClose = jest.fn();
97+
const { unmount } = render(<HotkeyHelp isOpen={true} onClose={onClose} />);
98+
99+
unmount();
100+
fireEvent.keyDown(document, { key: 'Escape' });
101+
102+
expect(onClose).not.toHaveBeenCalled();
103+
});
76104
});

src/renderer/components/HotkeyHelp/HotkeyHelp.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,19 @@ const shortcuts = [
1717
];
1818

1919
export function HotkeyHelp({ isOpen, onClose }: HotkeyHelpProps) {
20+
React.useEffect(() => {
21+
if (!isOpen) return;
22+
23+
const handleKeyDown = (e: KeyboardEvent) => {
24+
if (e.key === 'Escape') {
25+
onClose();
26+
}
27+
};
28+
29+
document.addEventListener('keydown', handleKeyDown);
30+
return () => document.removeEventListener('keydown', handleKeyDown);
31+
}, [isOpen, onClose]);
32+
2033
if (!isOpen) return null;
2134

2235
const handleOverlayClick = (e: React.MouseEvent) => {

0 commit comments

Comments
 (0)