Skip to content

Commit 2d4f779

Browse files
authored
fix(amazonq): display animation for Apply Diff and View Diff buttons (#5802)
Add animation for View Diff and Apply Diff buttons. Demo - https://github.com/user-attachments/assets/05092447-be86-4dc8-89b5-ecb7c4bfee0f License: I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 192d1ea commit 2d4f779

File tree

2 files changed

+65
-17
lines changed

2 files changed

+65
-17
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/* Pulsating effect */
2+
@keyframes pulsate {
3+
0% {
4+
opacity: 0;
5+
}
6+
50% {
7+
opacity: 0.15;
8+
}
9+
100% {
10+
opacity: 0;
11+
}
12+
}
13+
14+
body[data-feature-viewdiffinchat='TREATMENT'] {
15+
.mynah-syntax-highlighter-copy-buttons button:nth-of-type(2)::after, /* Accept Diff and Insert At Cursor */
16+
.mynah-syntax-highlighter-copy-buttons button:nth-of-type(3)::after {
17+
/* View Diff */
18+
content: '';
19+
animation-name: pulsate;
20+
animation-duration: 1.5s;
21+
animation-timing-function: ease-in-out;
22+
animation-iteration-count: 2;
23+
transform: translate3d(0%, 0, 0);
24+
}
25+
}

packages/core/src/amazonq/webview/generators/webViewContent.ts

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,20 @@ import { AuthUtil } from '../../../codewhisperer/util/authUtil'
99
import { FeatureConfigProvider, FeatureContext, globals } from '../../../shared'
1010

1111
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+
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

Comments
 (0)