@@ -9,6 +9,20 @@ import { AuthUtil } from '../../../codewhisperer/util/authUtil'
9
9
import { FeatureConfigProvider , FeatureContext , globals } from '../../../shared'
10
10
11
11
export class WebViewContentGenerator {
12
+ private async generateFeatureConfigsData ( ) : Promise < string > {
13
+ let featureConfigs = new Map < string , FeatureContext > ( )
14
+ try {
15
+ await FeatureConfigProvider . instance . fetchFeatureConfigs ( )
16
+ featureConfigs = FeatureConfigProvider . getFeatureConfigs ( )
17
+ } catch ( error ) {
18
+ // eslint-disable-next-line aws-toolkits/no-console-log
19
+ console . error ( 'Error fetching feature configs:' , error )
20
+ }
21
+
22
+ // Convert featureConfigs to a string suitable for data-features
23
+ return JSON . stringify ( Array . from ( featureConfigs . entries ( ) ) )
24
+ }
25
+
12
26
public async generate ( extensionURI : Uri , webView : Webview ) : Promise < string > {
13
27
const entrypoint = process . env . WEBPACK_DEVELOPER_SERVER
14
28
? 'http: localhost'
@@ -17,14 +31,25 @@ export class WebViewContentGenerator {
17
31
const contentPolicy = `default-src ${ entrypoint } data: blob: 'unsafe-inline';
18
32
script-src ${ entrypoint } filesystem: ws: wss: 'unsafe-inline';`
19
33
34
+ let featureDataAttributes = ''
35
+ try {
36
+ // Fetch and parse featureConfigs
37
+ const featureConfigs = JSON . parse ( await this . generateFeatureConfigsData ( ) )
38
+ featureDataAttributes = featureConfigs
39
+ . map ( ( config : FeatureContext [ ] ) => `data-feature-${ config [ 1 ] . name } ="${ config [ 1 ] . variation } "` )
40
+ . join ( ' ' )
41
+ } catch ( error ) {
42
+ // eslint-disable-next-line aws-toolkits/no-console-log
43
+ console . error ( 'Error setting data-feature attribute for featureConfigs:' , error )
44
+ }
20
45
return `<!DOCTYPE html>
21
46
<html>
22
47
<head>
23
48
<meta http-equiv="Content-Security-Policy" content="${ contentPolicy } ">
24
- <title>Amazon Q (Preview)</title>
25
- ${ await this . generateJS ( extensionURI , webView ) }
49
+ <title>Amazon Q (Preview)</title>
50
+ ${ await this . generateJS ( extensionURI , webView ) }
26
51
</head>
27
- <body>
52
+ <body ${ featureDataAttributes } >
28
53
</body>
29
54
</html>`
30
55
}
@@ -41,29 +66,27 @@ export class WebViewContentGenerator {
41
66
? Uri . parse ( serverHostname ) . with ( { path : `/${ source } ` } )
42
67
: webView . asWebviewUri ( javascriptUri )
43
68
44
- const cssEntrypoint = webView . asWebviewUri (
45
- Uri . joinPath ( globals . context . extensionUri , 'resources' , 'css' , 'amazonq-webview.css' )
46
- )
69
+ const cssEntrypoints = [
70
+ Uri . joinPath ( globals . context . extensionUri , 'resources' , 'css' , 'amazonq-webview.css' ) ,
71
+ Uri . joinPath ( globals . context . extensionUri , 'resources' , 'css' , 'amazonq-chat.css' ) ,
72
+ ]
47
73
48
- let featureConfigs = new Map < string , FeatureContext > ( )
49
- try {
50
- await FeatureConfigProvider . instance . fetchFeatureConfigs ( )
51
- featureConfigs = FeatureConfigProvider . getFeatureConfigs ( )
52
- } catch ( error ) {
53
- // eslint-disable-next-line aws-toolkits/no-console-log
54
- console . error ( 'Error fetching feature configs:' , error )
55
- }
74
+ const cssEntrypointsMap = cssEntrypoints . map ( ( item ) => webView . asWebviewUri ( item ) )
75
+ const cssLinks = cssEntrypointsMap . map ( ( uri ) => `<link rel="stylesheet" href="${ uri . toString ( ) } ">` ) . join ( '\n' )
76
+
77
+ // Fetch featureConfigs and use it within the script
78
+ const featureConfigsString = await this . generateFeatureConfigsData ( )
56
79
57
80
return `
58
81
<script type="text/javascript" src="${ javascriptEntrypoint . toString ( ) } " defer onload="init()"></script>
59
- <link rel="stylesheet" href=" ${ cssEntrypoint . toString ( ) } ">
82
+ ${ cssLinks }
60
83
<script type="text/javascript">
61
84
const init = () => {
62
85
createMynahUI(acquireVsCodeApi(), ${
63
86
( await AuthUtil . instance . getChatAuthState ( ) ) . amazonQ === 'connected'
64
- } ,${ JSON . stringify ( Array . from ( featureConfigs . entries ( ) ) ) } );
87
+ } ,${ featureConfigsString } );
65
88
}
66
- </script>
89
+ </script>
67
90
`
68
91
}
69
92
}
0 commit comments