@@ -10,7 +10,7 @@ import {
1010} from "lucide-react"
1111import SheetActionDialog from "@/components/sheet-action-dialog"
1212import type { jobsTableData } from "@/features/jobsTable/interfaces"
13- import type { ReactNode } from "react"
13+ import { ReactNode , useMemo } from "react"
1414import jobsService from "@/services/JobsService"
1515import { useCallback , useState } from "react"
1616import moment from "moment"
@@ -24,6 +24,9 @@ import ScrollableList from "@/components/custom/general/ScrollableList"
2424import { getLokiLogs } from "@/services/components/logsService"
2525import { Label } from "@/components/ui/label"
2626import { Loader } from "lucide"
27+ import { useSocketLogs } from "@/lib/socketUtils"
28+ import { MiscNotificationTopics } from "@/models/network"
29+ import { LiveLogViewer } from "@/components/custom/general/LogViewer"
2730
2831export interface DrawerLatestRunsProps {
2932 JobDetails : jobsTableData
@@ -35,6 +38,9 @@ export default function DrawerLatestRuns({
3538 trigger,
3639} : DrawerLatestRunsProps ) {
3740 const [ LogItems , setLogItems ] = useState < JobRunLog [ ] > ( [ ] )
41+ const [ selectedLogItem , setSelectedLogItem ] = useState < any | undefined > (
42+ undefined ,
43+ )
3844 const [ itemsTotal , setItemstotal ] = useState ( 0 )
3945 const [ inputSchema , setInputSchema ] = useState < JobRunsQuerySchema > ( {
4046 jobId : JobDetails . id ,
@@ -43,7 +49,21 @@ export default function DrawerLatestRuns({
4349 } )
4450 const [ loading , setLoading ] = useState ( false )
4551 const [ showLogs , setShowLogs ] = useState ( false )
46- const [ logLines , setLogLines ] = useState < any [ ] > ( [ ] )
52+
53+ const { logs } = useSocketLogs ( {
54+ actions : [ ] ,
55+ format : ( stream : any ) => {
56+ stream . values . forEach ( ( log : any ) => {
57+ log . fullMessage = `${ log . timestamp } | ${ log . type ?. toUpperCase ( ) } | ${ log . message } `
58+ } )
59+ return stream
60+ } ,
61+ initialLogsFilter : selectedLogItem ?. filterRange ,
62+ logInterval : undefined ,
63+ mergeOutputStreams : false ,
64+ setEndToMidnight : false ,
65+ logQuery : `{logId="${ selectedLogItem ?. log_id } "}` ,
66+ } )
4767
4868 const resetDrawer = useCallback ( ( ) => {
4969 setLogItems ( [ ] )
@@ -54,7 +74,6 @@ export default function DrawerLatestRuns({
5474 } )
5575 setLoading ( false )
5676 setShowLogs ( false )
57- setLogLines ( [ ] )
5877 } , [ inputSchema ] )
5978
6079 const getLatestRuns = useCallback ( ( ) => {
@@ -72,6 +91,13 @@ export default function DrawerLatestRuns({
7291 ? moment ( log . start_time ) . format ( "YYYY-MM-DD HH-mm" )
7392 : moment ( log . start_time ) . fromNow ( )
7493 log . start_time_title = `Start time : ${ moment ( log . start_time ) . format ( "YYYY-MM-DD HH-mm-ss" ) } `
94+ log . offsettedStartedTime = log . offsettedEndTime = new Date (
95+ log . end_time . getTime ( ) ,
96+ )
97+ log . filterRange = {
98+ from : new Date ( log . start_time . getTime ( ) ) ,
99+ to : new Date ( log . end_time . getTime ( ) ) ,
100+ }
75101 } )
76102 return data
77103 } )
@@ -95,16 +121,8 @@ export default function DrawerLatestRuns({
95121
96122 const openAndFetchLogs = useCallback ( ( LogItem : JobRunLog ) => {
97123 if ( LogItem && LogItem . end_time ) {
98- const offsetStartTime = new Date ( LogItem . start_time . getTime ( ) )
99- const offsetEndTime = new Date ( LogItem . end_time . getTime ( ) )
124+ setSelectedLogItem ( LogItem )
100125 setShowLogs ( true )
101- return getLokiLogs (
102- `{logId="${ LogItem . log_id } "}` ,
103- offsetStartTime ,
104- offsetEndTime ,
105- ) . then ( data => {
106- setLogLines ( data )
107- } )
108126 }
109127 } , [ ] )
110128
@@ -139,12 +157,10 @@ export default function DrawerLatestRuns({
139157 >
140158 < ScrollableList
141159 originalList = { LogItems }
142- loadMore = { ( inputSchema . offset ?? 0 ) <= itemsTotal }
160+ loadMore = { ! loading && ( inputSchema . offset ?? 0 ) <= itemsTotal }
143161 loadMoreAction = { getMoreRuns }
144162 className = "px-[1px] py-[2px] min-w-[280px]"
145- onItemClick = { ( item : JobRunLog , index : number ) => {
146- openAndFetchLogs ( item )
147- } }
163+ onItemClick = { openAndFetchLogs }
148164 itemClassName = { ( item : any ) => {
149165 return cn (
150166 "focus:rounded-lg outline-none focus:ring-2 focus:ring-opacity-50 focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-opacity-50 hover:ring-2 hover:ring-opacity-50 hover:rounded-lg focus:ring-blue-500 focus-visible:ring-blue-500 hover:ring-blue-500" ,
@@ -234,25 +250,15 @@ export default function DrawerLatestRuns({
234250 icon = { LoaderPinwheelIcon }
235251 className = "h-full"
236252 >
237- { logLines ?. [ 0 ] && (
238- < ScrollArea className = "pb-2 flex flex-col gap-0.5 h-full" >
239- { logLines [ 0 ] ?. values . map ( ( log : any , index : number ) => {
240- return (
241- < div
242- key = { index }
243- className = { "flex flex-row items-center gap-2 mb-2" }
244- >
245- < Label className = "min-w-[170px] whitespace-nowrap" >
246- { log . timestamp }
247- </ Label >
248- < Badge variant = { "defaultTeal" } > { log . type } </ Badge >
249- < Label className = "leading-5" > { log . message } </ Label >
250- </ div >
251- )
252- } ) }
253- </ ScrollArea >
253+ { logs ?. [ 0 ] && (
254+ < LiveLogViewer
255+ initialLogs = { logs [ 0 ] ?. values . map ( ( e : any ) => e . fullMessage ) }
256+ wrapLines = { false }
257+ scrollToLine = { 1 }
258+ extraLines = { 4 }
259+ />
254260 ) }
255- { ! logLines ?. [ 0 ] && ! loading && (
261+ { ! logs ?. [ 0 ] && ! loading && (
256262 < div className = "w-full h-full flex flex-col gap-4 items-center justify-center" >
257263 < LogsIcon className = "w-16 h-16 text-destructive" />
258264 < div className = "text-muted-foreground text-md" >
0 commit comments