11import { QueryClient , useQuery } from '@tanstack/react-query' ;
22import { ColumnDef } from '@tanstack/react-table' ;
3- import { useState } from 'react' ;
3+ import { useEffect , useState } from 'react' ;
44import { Link , LoaderFunctionArgs , useLoaderData } from 'react-router-dom' ;
55
66import Timeline from '~/components/charts/timeline' ;
@@ -9,7 +9,6 @@ import { DataTable } from '~/components/tables';
99import { messageDetailsQuery } from '~/queries' ;
1010import { assertNonNull } from '~/utils/safety' ;
1111import { post } from 'aws-amplify/api' ;
12- import { InfoDialog } from '~/components/dialogs' ;
1312import { Modal } from '~/components/modals' ;
1413
1514interface Node {
@@ -24,6 +23,7 @@ interface Node {
2423 * @param queryClient - The Query Client instance.
2524 * @returns Loader function to be used with React Router.
2625 */
26+ let suggestIndex = 0 ;
2727export const messageDetailsLoader =
2828 ( queryClient : QueryClient ) =>
2929 async ( { params } : LoaderFunctionArgs ) => {
@@ -60,7 +60,8 @@ const MessageDetails = () => {
6060
6161 const [ suggestIssueResponse , setSuggestIssueResponse ] = useState ( null ) ;
6262 const [ open , setOpen ] = useState ( false ) ;
63- const suggestIssue = async ( { codeSnippet, pageUrl } ) => {
63+ const suggestIssue = async ( { codeSnippet, pageUrl, index } ) => {
64+ suggestIndex = index ;
6465 setSuggestIssueResponse ( null ) ;
6566 setOpen ( true ) ;
6667 const response = await ( await post ( {
@@ -81,6 +82,15 @@ const MessageDetails = () => {
8182 // if (!window.open(response?.url)) { window.location.href = response?.url }
8283 }
8384
85+ useEffect ( ( ) => {
86+ if ( ! open ) {
87+ document . querySelector ( `#suggest-${ suggestIndex } ` ) ?. focus ( ) ;
88+ }
89+ else {
90+ document . querySelector ( `#modal-title` ) ?. focus ( ) ;
91+ }
92+ } , [ open ] )
93+
8494 const NodeColumns : ColumnDef < Node > [ ] = [
8595 {
8696 accessorKey : 'codeSnippet' ,
@@ -105,8 +115,9 @@ const MessageDetails = () => {
105115 header : 'Action' ,
106116 cell : ( { row } ) => (
107117 < button
118+ id = { `suggest-${ row . index } ` }
108119 className = { `inline-flex h-9 items-center justify-end gap-2 place-self-end whitespace-nowrap rounded-md px-2 py-3 text-white shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[#0d6efd] focus-visible:ring-offset-2 max-sm:w-fit max-sm:px-1 ml-2 bg-[#0d6efd] hover:opacity-50 text-xs` }
109- onClick = { ( ) => suggestIssue ( { codeSnippet : row . getValue ( 'codeSnippet' ) , pageUrl : row . getValue ( 'pageUrl' ) } ) }
120+ onClick = { ( ) => suggestIssue ( { codeSnippet : row . getValue ( 'codeSnippet' ) , pageUrl : row . getValue ( 'pageUrl' ) , index : row . index } ) }
110121 >
111122 Suggest Issue
112123 < svg
@@ -200,11 +211,9 @@ const MessageDetails = () => {
200211 < Modal
201212 open = { open }
202213 setOpen = { setOpen }
214+ title = { `Suggest Issue` }
203215 >
204- < h1 className = 'text-2xl' > Suggest Issue</ h1 >
205- { ! suggestIssueResponse && < div >
206- < h2 > Generating issue... (ETA: 1 min)</ h2 >
207- </ div > }
216+ < div role = 'status' > { ! suggestIssueResponse ? `Generating issue... (1 min)` : `Issue generated` } </ div >
208217 { suggestIssueResponse && < div className = 'overflow-y-scroll max-h-[500px]' >
209218 { JSON . stringify ( { suggestIssueResponse : suggestIssueResponse ?. how_to_implement } ) }
210219 </ div > }
0 commit comments