@@ -12,13 +12,13 @@ type Props = {
12
12
getText : ( ) => string ;
13
13
} ;
14
14
15
- type ChatMessage = { role : 'user' | 'bot' ; content : string [ ] } ;
15
+ type ChatMessage = { role : 'user' | 'bot' ; content : string } ;
16
16
const initialMessage : ChatMessage = {
17
- content : [ 'Ask me something about this paragraph!' ] ,
17
+ content : 'Ask me something about this paragraph!' ,
18
18
role : 'bot'
19
19
} ;
20
20
const botErrorMessage : ChatMessage = {
21
- content : [ 'Sorry, I am down with a cold, please try again later.' ] ,
21
+ content : 'Sorry, I am down with a cold, please try again later.' ,
22
22
role : 'bot'
23
23
} ;
24
24
@@ -37,18 +37,12 @@ const ChatBox: React.FC<Props> = ({ getSection, getText }) => {
37
37
setUserInput ( event . target . value ) ;
38
38
} ;
39
39
40
- // TODO: Reimplement
41
- // // To get code snippets
42
- // const codeBlocks = (temp: string) => {
43
- // return temp.split('```');
44
- // };
45
-
46
40
const sendMessage = async ( ) => {
47
41
if ( userInput . trim ( ) === '' ) {
48
42
return ;
49
43
}
50
44
setUserInput ( '' ) ;
51
- setMessages ( prev => [ ...prev , { role : 'user' , content : [ userInput ] } ] ) ;
45
+ setMessages ( prev => [ ...prev , { role : 'user' , content : userInput } ] ) ;
52
46
} ;
53
47
54
48
// Watch whenever a new message comes in
@@ -72,16 +66,14 @@ const ChatBox: React.FC<Props> = ({ getSection, getText }) => {
72
66
{ role : 'system' , content : prompt } ,
73
67
...messages . slice ( - CONTEXT_SIZE ) . map ( message => {
74
68
const role = message . role === 'user' ? 'user' : 'assistant' ;
75
- const content = message . content . join ( '\n' ) ;
76
- const segment : Payload [ number ] = { role, content } ;
69
+ const segment : Payload [ number ] = { role, content : message . content } ;
77
70
return segment ;
78
71
} )
79
72
] ;
80
73
81
74
chat ( tokens , payload )
82
75
. then ( text => {
83
- // TODO: + '\n\nThe answer is generated by GPT-4 and may not be correct.'
84
- setMessages ( prev => [ ...prev , { role : 'bot' , content : [ text ] } ] ) ;
76
+ setMessages ( prev => [ ...prev , { role : 'bot' , content : text } ] ) ;
85
77
} )
86
78
. catch ( e => {
87
79
setMessages ( prev => [ ...prev , botErrorMessage ] ) ;
@@ -95,23 +87,6 @@ const ChatBox: React.FC<Props> = ({ getSection, getText }) => {
95
87
setMessages ( [ initialMessage ] ) ;
96
88
} ;
97
89
98
- const renderMessageContent = ( message : string | string [ ] ) => {
99
- if ( ! Array . isArray ( message ) ) {
100
- return message ;
101
- }
102
-
103
- return message . map ( ( block , index ) =>
104
- // Assume that only javascript code snippets will appear
105
- block . substring ( 0 , 10 ) === 'javascript' ? (
106
- < SyntaxHighlighter language = "javascript" style = { SourceTheme } key = { index } >
107
- { block . substring ( 11 , block . length ) }
108
- </ SyntaxHighlighter >
109
- ) : (
110
- block
111
- )
112
- ) ;
113
- } ;
114
-
115
90
const keyDown = ( event : React . KeyboardEvent < HTMLInputElement > ) => {
116
91
if ( event . key === 'Enter' ) {
117
92
sendMessage ( ) ;
@@ -135,7 +110,7 @@ const ChatBox: React.FC<Props> = ({ getSection, getText }) => {
135
110
className = { classes [ `${ message . role } ` ] }
136
111
style = { { whiteSpace : 'pre-line' } }
137
112
>
138
- { renderMessageContent ( message . content ) }
113
+ { renderMessageContent ( message ) }
139
114
</ div >
140
115
) ) }
141
116
{ isLoading && < p > loading...</ p > }
@@ -160,4 +135,26 @@ const ChatBox: React.FC<Props> = ({ getSection, getText }) => {
160
135
) ;
161
136
} ;
162
137
138
+ const renderMessageContent = ( message : ChatMessage ) => {
139
+ let contentToRender = message . content ;
140
+ if ( message . role === 'bot' ) {
141
+ contentToRender += '\n\nThe answer is generated by GPT-4 and may not be correct.' ;
142
+ }
143
+ // TODO: Parse full Markdown, make snippets runnable
144
+ if ( ! contentToRender . includes ( '```javascript' ) ) {
145
+ return contentToRender ;
146
+ }
147
+ const renderableRegex = / ` ` ` j a v a s c r i p t \n ( [ \s \S ] * ?) \n ` ` ` / g;
148
+ const chunks = contentToRender . split ( renderableRegex ) ;
149
+ return chunks . map ( ( chunk , i ) => {
150
+ return renderableRegex . test ( chunk ) ? (
151
+ < SyntaxHighlighter language = "javascript" style = { SourceTheme } key = { i } >
152
+ { chunk }
153
+ </ SyntaxHighlighter >
154
+ ) : (
155
+ < React . Fragment key = { i } > { chunk } </ React . Fragment >
156
+ ) ;
157
+ } ) ;
158
+ } ;
159
+
163
160
export default ChatBox ;
0 commit comments