@@ -9,6 +9,20 @@ import { AuthUtil } from '../../../codewhisperer/util/authUtil'
99import { FeatureConfigProvider , FeatureContext , globals } from '../../../shared'
1010
1111export 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+
1226 public async generate ( extensionURI : Uri , webView : Webview ) : Promise < string > {
1327 const entrypoint = process . env . WEBPACK_DEVELOPER_SERVER
1428 ? 'http: localhost'
@@ -17,14 +31,25 @@ export class WebViewContentGenerator {
1731 const contentPolicy = `default-src ${ entrypoint } data: blob: 'unsafe-inline';
1832 script-src ${ entrypoint } filesystem: ws: wss: 'unsafe-inline';`
1933
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+ }
2045 return `<!DOCTYPE html>
2146 <html>
2247 <head>
2348 <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 ) }
2651 </head>
27- <body>
52+ <body ${ featureDataAttributes } >
2853 </body>
2954 </html>`
3055 }
@@ -41,29 +66,27 @@ export class WebViewContentGenerator {
4166 ? Uri . parse ( serverHostname ) . with ( { path : `/${ source } ` } )
4267 : webView . asWebviewUri ( javascriptUri )
4368
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+ ]
4773
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 ( )
5679
5780 return `
5881 <script type="text/javascript" src="${ javascriptEntrypoint . toString ( ) } " defer onload="init()"></script>
59- <link rel="stylesheet" href=" ${ cssEntrypoint . toString ( ) } ">
82+ ${ cssLinks }
6083 <script type="text/javascript">
6184 const init = () => {
6285 createMynahUI(acquireVsCodeApi(), ${
6386 ( await AuthUtil . instance . getChatAuthState ( ) ) . amazonQ === 'connected'
64- } ,${ JSON . stringify ( Array . from ( featureConfigs . entries ( ) ) ) } );
87+ } ,${ featureConfigsString } );
6588 }
66- </script>
89+ </script>
6790 `
6891 }
6992}
0 commit comments