1
- import { makeStyles } from "@mui/styles " ;
2
- import { LogLevel } from "api/typesGenerated" ;
1
+ import { type Interpolation , type Theme } from "@emotion/react " ;
2
+ import type { LogLevel } from "api/typesGenerated" ;
3
3
import dayjs from "dayjs" ;
4
- import { FC , useMemo } from "react" ;
5
- import { MONOSPACE_FONT_FAMILY } from "theme/constants" ;
6
- import { combineClasses } from "utils/combineClasses" ;
4
+ import { type FC , type ReactNode , useMemo } from "react" ;
7
5
import AnsiToHTML from "ansi-to-html" ;
6
+ import { MONOSPACE_FONT_FAMILY } from "theme/constants" ;
8
7
9
8
export interface Line {
10
9
time : string ;
@@ -24,19 +23,17 @@ export const Logs: FC<React.PropsWithChildren<LogsProps>> = ({
24
23
lines,
25
24
className = "" ,
26
25
} ) => {
27
- const styles = useStyles ( ) ;
28
-
29
26
return (
30
- < div className = { combineClasses ( [ className , styles . root ] ) } >
31
- < div className = { styles . scrollWrapper } >
27
+ < div css = { styles . root } className = { className } >
28
+ < div css = { styles . scrollWrapper } >
32
29
{ lines . map ( ( line , idx ) => (
33
- < div className = { combineClasses ( [ styles . line , line . level ] ) } key = { idx } >
30
+ < div css = { [ styles . line , line . level ] } key = { idx } >
34
31
{ ! hideTimestamps && (
35
32
< >
36
- < span className = { styles . time } >
33
+ < span css = { styles . time } >
37
34
{ dayjs ( line . time ) . format ( `HH:mm:ss.SSS` ) }
38
35
</ span >
39
- < span className = { styles . space } />
36
+ < span css = { styles . space } />
40
37
</ >
41
38
) }
42
39
< span > { line . output } </ span >
@@ -56,39 +53,32 @@ export const LogLine: FC<{
56
53
hideTimestamp ?: boolean ;
57
54
number ?: number ;
58
55
style ?: React . CSSProperties ;
59
- sourceIcon ?: JSX . Element ;
56
+ sourceIcon ?: ReactNode ;
60
57
maxNumber ?: number ;
61
58
} > = ( { line, hideTimestamp, number, maxNumber, sourceIcon, style } ) => {
62
- const styles = useStyles ( ) ;
63
59
const output = useMemo ( ( ) => {
64
60
return convert . toHtml ( line . output . split ( / \r / g) . pop ( ) as string ) ;
65
61
} , [ line . output ] ) ;
66
62
const isUsingLineNumber = number !== undefined ;
67
63
68
64
return (
69
65
< div
70
- className = { combineClasses ( [
71
- styles . line ,
72
- line . level ,
73
- isUsingLineNumber && styles . lineNumber ,
74
- ] ) }
66
+ css = { [ styles . line , isUsingLineNumber && styles . lineNumber ] }
67
+ className = { line . level }
75
68
style = { style }
76
69
>
77
70
{ sourceIcon }
78
71
{ ! hideTimestamp && (
79
72
< >
80
73
< span
81
- className = { combineClasses ( [
82
- styles . time ,
83
- isUsingLineNumber && styles . number ,
84
- ] ) }
74
+ css = { [ styles . time , isUsingLineNumber && styles . number ] }
85
75
style = { {
86
76
minWidth : `${ maxNumber ? maxNumber . toString ( ) . length - 1 : 0 } em` ,
87
77
} }
88
78
>
89
79
{ number ? number : dayjs ( line . time ) . format ( `HH:mm:ss.SSS` ) }
90
80
</ span >
91
- < span className = { styles . space } />
81
+ < span css = { styles . space } />
92
82
</ >
93
83
) }
94
84
< span
@@ -100,8 +90,8 @@ export const LogLine: FC<{
100
90
) ;
101
91
} ;
102
92
103
- const useStyles = makeStyles ( ( theme ) => ( {
104
- root : {
93
+ const styles = {
94
+ root : ( theme ) => ( {
105
95
minHeight : 156 ,
106
96
padding : theme . spacing ( 1 , 0 ) ,
107
97
borderRadius : theme . shape . borderRadius ,
@@ -112,11 +102,11 @@ const useStyles = makeStyles((theme) => ({
112
102
borderBottom : `1px solid ${ theme . palette . divider } ` ,
113
103
borderRadius : 0 ,
114
104
} ,
115
- } ,
105
+ } ) ,
116
106
scrollWrapper : {
117
107
minWidth : "fit-content" ,
118
108
} ,
119
- line : {
109
+ line : ( theme ) => ( {
120
110
wordBreak : "break-all" ,
121
111
display : "flex" ,
122
112
alignItems : "center" ,
@@ -139,24 +129,24 @@ const useStyles = makeStyles((theme) => ({
139
129
"&.warn" : {
140
130
backgroundColor : theme . palette . warning . dark ,
141
131
} ,
142
- } ,
143
- lineNumber : {
132
+ } ) ,
133
+ lineNumber : ( theme ) => ( {
144
134
paddingLeft : theme . spacing ( 2 ) ,
145
- } ,
146
- space : {
135
+ } ) ,
136
+ space : ( theme ) => ( {
147
137
userSelect : "none" ,
148
138
width : theme . spacing ( 3 ) ,
149
139
display : "block" ,
150
140
flexShrink : 0 ,
151
- } ,
152
- time : {
141
+ } ) ,
142
+ time : ( theme ) => ( {
153
143
userSelect : "none" ,
154
144
whiteSpace : "pre" ,
155
145
display : "inline-block" ,
156
146
color : theme . palette . text . secondary ,
157
- } ,
158
- number : {
147
+ } ) ,
148
+ number : ( theme ) => ( {
159
149
width : theme . spacing ( 4 ) ,
160
150
textAlign : "right" ,
161
- } ,
162
- } ) ) ;
151
+ } ) ,
152
+ } satisfies Record < string , Interpolation < Theme > > ;
0 commit comments