1
1
import * as React from "react" ;
2
2
import * as ReactDOM from "react-dom" ;
3
3
import typingSource from "./assets/typing.gif" ;
4
+ import Markdown from "marked-react" ;
5
+ import "../media/styles.css" ;
6
+ import { Element , scroller } from "react-scroll" ;
7
+ import SyntaxHighlighter from "react-syntax-highlighter" ;
4
8
5
9
const {
6
10
VSCodeButton,
@@ -11,6 +15,14 @@ declare var acquireVsCodeApi: any;
11
15
12
16
const vscode = acquireVsCodeApi ( ) ;
13
17
18
+ const renderer = {
19
+ code ( snippet : string ) {
20
+ return (
21
+ < SyntaxHighlighter language = "typescript" > { snippet } </ SyntaxHighlighter >
22
+ ) ;
23
+ } ,
24
+ } ;
25
+
14
26
const sendMessageToExtension = ( message : string ) => {
15
27
vscode . postMessage (
16
28
{
@@ -24,7 +36,10 @@ const sendMessageToExtension = (message: string) => {
24
36
type From = "user" | "bot" ;
25
37
26
38
class ChatMessage {
27
- constructor ( readonly from : From , readonly contents : string ) { }
39
+ constructor (
40
+ readonly from : From ,
41
+ readonly contents : string
42
+ ) { }
28
43
}
29
44
30
45
type ChatBubbleProperties = { message : ChatMessage } ;
@@ -43,38 +58,53 @@ const ChatBubble: React.FC<ChatBubbleProperties> = ({ message }) => {
43
58
} ;
44
59
const alignStyle =
45
60
message . from === "bot"
46
- ? { backgroundColor : "var(--vscode-button-secondaryBackground)" }
47
- : { backgroundColor : "var(--vscode-button-background)" } ;
61
+ ? {
62
+ backgroundColor : "var(--vscode-button-secondaryBackground)" ,
63
+ color : "var(--vscode-button-secondaryForeground)" ,
64
+ }
65
+ : {
66
+ backgroundColor : "var(--vscode-button-background)" ,
67
+ color : "var(--vscode-button-foreground)" ,
68
+ } ;
48
69
const containerStyle = {
49
70
display : "flex" ,
50
71
justifyContent : message . from === "bot" ? "flex-start" : "flex-end" ,
51
72
} ;
52
73
return (
53
74
< div style = { containerStyle } >
54
75
< div style = { { ...bubbleStyle , ...alignStyle } } >
55
- < div style = { { whiteSpace : "pre-wrap" } } > { message . contents } </ div >
76
+ < div style = { { whiteSpace : "pre-wrap" } } >
77
+ < Markdown value = { message . contents } renderer = { renderer } />
78
+ </ div >
56
79
</ div >
57
80
</ div >
58
81
) ;
59
82
} ;
60
83
61
84
export const App : React . FC = ( ) => {
62
85
const [ userMessage , setUserMessage ] = React . useState ( "" ) ;
63
- const [ chatMessages , setChatMessages ] = React . useState < Array < ChatMessage > > (
64
- [ ]
65
- ) ;
86
+ const [ chatMessages , setChatMessages ] = React . useState < Array < ChatMessage > > ( [
87
+ new ChatMessage (
88
+ "user" ,
89
+ "**Lorem ipsum** dolor sit amet, consectetur adipiscing elit. Nulla nec odio nec nunc"
90
+ ) ,
91
+ ] ) ;
66
92
const [ loading , setLoading ] = React . useState ( false ) ;
67
- const appendChatMessage = ( message : ChatMessage ) =>
93
+ const appendChatMessage = async ( message : ChatMessage ) => {
68
94
setChatMessages ( ( previousChatMessages ) => [
69
95
...previousChatMessages ,
70
96
message ,
71
97
] ) ;
98
+ scroller . scrollTo ( "lastMessage" , {
99
+ containerId : "messages-root" ,
100
+ } ) ;
101
+ } ;
72
102
73
103
React . useEffect ( ( ) => {
74
104
const sendInitialMessage = ( ) => {
75
105
setTimeout ( ( ) => {
76
106
sendMessageToExtension (
77
- "Hello, what's your name and how can you help me? "
107
+ "Greet me and give me a one paragraph detailed description of how can you help me with my Booster project. Use markdown to highlight the important parts. "
78
108
) ;
79
109
} , 500 ) ;
80
110
} ;
@@ -119,9 +149,14 @@ export const App: React.FC = () => {
119
149
display : "flex" ,
120
150
flexDirection : "column" ,
121
151
} }
152
+ id = "messages-root"
122
153
>
123
- { chatMessages . map ( ( message ) => (
124
- < ChatBubble key = { message . contents } message = { message } />
154
+ { chatMessages . map ( ( message , index ) => (
155
+ < Element
156
+ name = { index === chatMessages . length - 1 ? "lastMessage" : "" }
157
+ >
158
+ < ChatBubble key = { message . contents } message = { message } />
159
+ </ Element >
125
160
) ) }
126
161
< img
127
162
style = { {
0 commit comments