66 InfoCircledIcon ,
77 QuestionMarkCircledIcon ,
88} from "@radix-ui/react-icons" ;
9- import { Fragment , memo , useCallback , useRef , useState } from "react" ;
9+ import { Fragment , memo , useCallback , useMemo , useRef , useState } from "react" ;
1010import { FixedSizeList , ListOnScrollProps , areEqual } from "react-window" ;
1111import { useDebounce , useMeasure } from "react-use" ;
1212import { Transition , Dialog } from "@headlessui/react" ;
@@ -35,6 +35,8 @@ import { CopyTextButton } from "@common/elements/CopyTextButton";
3535import { TextInput } from "@ui/TextInput" ;
3636import { MultiSelectValue } from "@ui/MultiSelectCombobox" ;
3737import { LogListResources } from "@common/features/logs/components/LogListResources" ;
38+ import { shallowNavigate } from "@common/lib/useTableMetadata" ;
39+ import { useRouter } from "next/router" ;
3840
3941export type LogListProps = {
4042 logs ?: UdfLog [ ] ;
@@ -60,6 +62,8 @@ export function LogList({
6062 setPaused,
6163 setManuallyPaused,
6264} : LogListProps ) {
65+ const router = useRouter ( ) ;
66+
6367 const interleavedLogs = interleaveLogs (
6468 filteredLogs ?? [ ] ,
6569 deploymentAuditLogs ?? [ ] ,
@@ -69,7 +73,31 @@ export function LogList({
6973 const [ sheetRef , { height : heightOfListContainer } ] =
7074 useMeasure < HTMLDivElement > ( ) ;
7175
72- const [ shownLog , setShownLog ] = useState < UdfLog > ( ) ;
76+ // Derive shownLog from URL query parameters
77+ const shownLog = useMemo ( ( ) => {
78+ const logTs = router . query . logTs as string | undefined ;
79+
80+ if ( logTs && filteredLogs ) {
81+ // Find the log with this timestamp in filtered logs
82+ const matchingLog = filteredLogs . find (
83+ ( log ) => log . timestamp === Number ( logTs ) ,
84+ ) ;
85+ return matchingLog ;
86+ }
87+
88+ return undefined ;
89+ } , [ router . query . logTs , filteredLogs ] ) ;
90+
91+ // Update URL when log selection changesAdd a comment on lines R88 to R90Add diff commentMarkdown input: edit mode selected.WritePreviewAdd a suggestionHeadingBoldItalicQuoteCodeLinkUnordered listNumbered listTask listMentionReferenceSaved repliesAdd FilesPaste, drop, or click to add filesCancelCommentStart a reviewReturn to code
92+ const setShownLog = useCallback (
93+ ( log : UdfLog | undefined ) => {
94+ void shallowNavigate ( router , {
95+ ...router . query ,
96+ logTs : log ? log . timestamp . toString ( ) : undefined ,
97+ } ) ;
98+ } ,
99+ [ router ] ,
100+ ) ;
73101
74102 const hasFilters =
75103 ! ! logs && ! ! filteredLogs && filteredLogs . length !== logs . length ;
@@ -126,6 +154,7 @@ function WindowedLogList({
126154 hasFilters,
127155 paused,
128156 setManuallyPaused,
157+ shownLog,
129158} : {
130159 interleavedLogs : InterleavedLog [ ] ;
131160 setClearedLogs : ( clearedLogs : number [ ] ) => void ;
@@ -135,6 +164,7 @@ function WindowedLogList({
135164 hasFilters : boolean ;
136165 paused : boolean ;
137166 setManuallyPaused ( paused : boolean ) : void ;
167+ shownLog ?: UdfLog ;
138168} ) {
139169 const listRef = useRef < FixedSizeList > ( null ) ;
140170 const outerRef = useRef < HTMLDivElement > ( null ) ;
@@ -189,6 +219,7 @@ configure a log stream."
189219 setClearedLogs,
190220 clearedLogs,
191221 setShownLog,
222+ selectedLogTimestamp : shownLog ?. timestamp ,
192223 } }
193224 RowOrLoading = { LogListRow }
194225 />
@@ -221,6 +252,7 @@ type LogItemProps = {
221252 setClearedLogs : ( clearedLogs : number [ ] ) => void ;
222253 setShownLog ( shown : UdfLog | undefined ) : void ;
223254 clearedLogs : number [ ] ;
255+ selectedLogTimestamp ?: number ;
224256 } ;
225257 index : number ;
226258 style : any ;
0 commit comments