File tree Expand file tree Collapse file tree 1 file changed +41
-0
lines changed
Expand file tree Collapse file tree 1 file changed +41
-0
lines changed Original file line number Diff line number Diff line change @@ -164,6 +164,47 @@ export function SideBar() {
164164 addProject ( projectPath ) ;
165165 } , [ addProject ] ) ;
166166
167+ useEffect ( ( ) => {
168+ const isEditableTarget = ( target : EventTarget | null ) : boolean => {
169+ if ( ! ( target instanceof HTMLElement ) ) {
170+ return false ;
171+ }
172+ if ( target . isContentEditable ) {
173+ return true ;
174+ }
175+ const tagName = target . tagName ;
176+ if ( tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT' ) {
177+ return true ;
178+ }
179+ return Boolean ( target . closest ( '[contenteditable="true"]' ) ) ;
180+ } ;
181+
182+ const handleKeyDown = ( event : KeyboardEvent ) => {
183+ const isNewShortcut = ( event . metaKey || event . ctrlKey ) && event . key . toLowerCase ( ) === 'n' ;
184+
185+ if ( ! isNewShortcut || event . shiftKey || event . altKey || event . repeat ) {
186+ return ;
187+ }
188+
189+ if ( view !== 'codex' && view !== 'cc' ) {
190+ return ;
191+ }
192+
193+ if ( isEditableTarget ( event . target ) ) {
194+ return ;
195+ }
196+
197+ event . preventDefault ( ) ;
198+ event . stopPropagation ( ) ;
199+ void handleCreateNew ( ) ;
200+ } ;
201+
202+ window . addEventListener ( 'keydown' , handleKeyDown ) ;
203+ return ( ) => {
204+ window . removeEventListener ( 'keydown' , handleKeyDown ) ;
205+ } ;
206+ } , [ handleCreateNew , view ] ) ;
207+
167208 return (
168209 < div className = "flex h-full w-[var(--sidebar-width)] min-w-[var(--sidebar-width)] max-w-[var(--sidebar-width)] flex-col border-r border-sidebar-border bg-zinc-100/95 dark:bg-zinc-900/95" >
169210 < div className = "gap-1 p-2 flex flex-col" >
You can’t perform that action at this time.
0 commit comments