Skip to content

Commit

Permalink
Merge master into feature/q-dev-ux
Browse files Browse the repository at this point in the history
  • Loading branch information
aws-toolkit-automation authored Oct 17, 2024
2 parents 972066c + 2d4f779 commit 9892428
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 17 deletions.
25 changes: 25 additions & 0 deletions packages/core/resources/css/amazonq-chat.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/* Pulsating effect */
@keyframes pulsate {
0% {
opacity: 0;
}
50% {
opacity: 0.15;
}
100% {
opacity: 0;
}
}

body[data-feature-viewdiffinchat='TREATMENT'] {
.mynah-syntax-highlighter-copy-buttons button:nth-of-type(2)::after, /* Accept Diff and Insert At Cursor */
.mynah-syntax-highlighter-copy-buttons button:nth-of-type(3)::after {
/* View Diff */
content: '';
animation-name: pulsate;
animation-duration: 1.5s;
animation-timing-function: ease-in-out;
animation-iteration-count: 2;
transform: translate3d(0%, 0, 0);
}
}
57 changes: 40 additions & 17 deletions packages/core/src/amazonq/webview/generators/webViewContent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,20 @@ import { AuthUtil } from '../../../codewhisperer/util/authUtil'
import { FeatureConfigProvider, FeatureContext, globals } from '../../../shared'

export class WebViewContentGenerator {
private async generateFeatureConfigsData(): Promise<string> {
let featureConfigs = new Map<string, FeatureContext>()
try {
await FeatureConfigProvider.instance.fetchFeatureConfigs()
featureConfigs = FeatureConfigProvider.getFeatureConfigs()
} catch (error) {
// eslint-disable-next-line aws-toolkits/no-console-log
console.error('Error fetching feature configs:', error)
}

// Convert featureConfigs to a string suitable for data-features
return JSON.stringify(Array.from(featureConfigs.entries()))
}

public async generate(extensionURI: Uri, webView: Webview): Promise<string> {
const entrypoint = process.env.WEBPACK_DEVELOPER_SERVER
? 'http: localhost'
Expand All @@ -17,14 +31,25 @@ export class WebViewContentGenerator {
const contentPolicy = `default-src ${entrypoint} data: blob: 'unsafe-inline';
script-src ${entrypoint} filesystem: ws: wss: 'unsafe-inline';`

let featureDataAttributes = ''
try {
// Fetch and parse featureConfigs
const featureConfigs = JSON.parse(await this.generateFeatureConfigsData())
featureDataAttributes = featureConfigs
.map((config: FeatureContext[]) => `data-feature-${config[1].name}="${config[1].variation}"`)
.join(' ')
} catch (error) {
// eslint-disable-next-line aws-toolkits/no-console-log
console.error('Error setting data-feature attribute for featureConfigs:', error)
}
return `<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="${contentPolicy}">
<title>Amazon Q (Preview)</title>
${await this.generateJS(extensionURI, webView)}
<title>Amazon Q (Preview)</title>
${await this.generateJS(extensionURI, webView)}
</head>
<body>
<body ${featureDataAttributes}>
</body>
</html>`
}
Expand All @@ -41,29 +66,27 @@ export class WebViewContentGenerator {
? Uri.parse(serverHostname).with({ path: `/${source}` })
: webView.asWebviewUri(javascriptUri)

const cssEntrypoint = webView.asWebviewUri(
Uri.joinPath(globals.context.extensionUri, 'resources', 'css', 'amazonq-webview.css')
)
const cssEntrypoints = [
Uri.joinPath(globals.context.extensionUri, 'resources', 'css', 'amazonq-webview.css'),
Uri.joinPath(globals.context.extensionUri, 'resources', 'css', 'amazonq-chat.css'),
]

let featureConfigs = new Map<string, FeatureContext>()
try {
await FeatureConfigProvider.instance.fetchFeatureConfigs()
featureConfigs = FeatureConfigProvider.getFeatureConfigs()
} catch (error) {
// eslint-disable-next-line aws-toolkits/no-console-log
console.error('Error fetching feature configs:', error)
}
const cssEntrypointsMap = cssEntrypoints.map((item) => webView.asWebviewUri(item))
const cssLinks = cssEntrypointsMap.map((uri) => `<link rel="stylesheet" href="${uri.toString()}">`).join('\n')

// Fetch featureConfigs and use it within the script
const featureConfigsString = await this.generateFeatureConfigsData()

return `
<script type="text/javascript" src="${javascriptEntrypoint.toString()}" defer onload="init()"></script>
<link rel="stylesheet" href="${cssEntrypoint.toString()}">
${cssLinks}
<script type="text/javascript">
const init = () => {
createMynahUI(acquireVsCodeApi(), ${
(await AuthUtil.instance.getChatAuthState()).amazonQ === 'connected'
},${JSON.stringify(Array.from(featureConfigs.entries()))});
},${featureConfigsString});
}
</script>
</script>
`
}
}

0 comments on commit 9892428

Please sign in to comment.