Skip to content

Commit 170ff98

Browse files
authored
Added UI click metrics on all login options (#4838)
* Added UI click metrics on all login options * Combined calls for continue and back button
1 parent 2dfa9ce commit 170ff98

File tree

8 files changed

+49
-14
lines changed

8 files changed

+49
-14
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,8 @@ class QWebviewBrowser(val project: Project, private val parentDisposable: Dispos
195195
error("QBrowser doesn't support the provided command ${message::class.simpleName}")
196196
}
197197

198-
is BrowserMessage.SendTelemetry -> {
199-
UiTelemetry.click(project, "auth_continueButton")
198+
is BrowserMessage.SendUiClickTelemetry -> {
199+
UiTelemetry.click(project, message.signInOptionClicked)
200200
}
201201
}
202202
}

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/BrowserMessage.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo
2525
JsonSubTypes.Type(value = BrowserMessage.CancelLogin::class, name = "cancelLogin"),
2626
JsonSubTypes.Type(value = BrowserMessage.Signout::class, name = "signout"),
2727
JsonSubTypes.Type(value = BrowserMessage.Reauth::class, name = "reauth"),
28-
JsonSubTypes.Type(value = BrowserMessage.SendTelemetry::class, name = "sendTelemetry")
28+
JsonSubTypes.Type(value = BrowserMessage.SendUiClickTelemetry::class, name = "sendUiClickTelemetry")
2929
)
3030
sealed interface BrowserMessage {
3131

@@ -57,5 +57,5 @@ sealed interface BrowserMessage {
5757

5858
object Reauth : BrowserMessage
5959

60-
object SendTelemetry : BrowserMessage
60+
data class SendUiClickTelemetry(val signInOptionClicked: String) : BrowserMessage
6161
}

plugins/core/webview/src/q-ui/components/login.vue

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
</svg>
1414
</button>
1515

16-
<LoginOptions :app="app" v-if="stage === 'START'" @backToMenu="handleBackButtonClick" @stageChanged="mutateStage" @login="login"/>
17-
<SsoLoginForm :app="app" v-if="stage === 'SSO_FORM'" @backToMenu="handleBackButtonClick" @stageChanged="mutateStage" @login="login"/>
18-
<AwsProfileForm v-if="stage === 'AWS_PROFILE'" @backToMenu="handleBackButtonClick" @stageChanged="mutateStage" @login="login"/>
16+
<LoginOptions :app="app" v-if="stage === 'START'" @backToMenu="handleBackButtonClick" @stageChanged="mutateStage" @login="login" @emitUiClickTelemetry="sendUiClickTelemetry"/>
17+
<SsoLoginForm :app="app" v-if="stage === 'SSO_FORM'" @backToMenu="handleBackButtonClick" @stageChanged="mutateStage" @login="login" @emitUiClickTelemetry="sendUiClickTelemetry"/>
18+
<AwsProfileForm v-if="stage === 'AWS_PROFILE'" @backToMenu="handleBackButtonClick" @stageChanged="mutateStage" @login="login" @emitUiClickTelemetry="sendUiClickTelemetry"/>
1919
<Authenticating v-if="stage === 'AUTHENTICATING'" :selected-login-option="this.selectedLoginOption" @cancel="handleCancelButton"/>
2020

2121
<template v-if="stage === 'CONNECTED'"></template>
@@ -27,7 +27,18 @@ import SsoLoginForm from "./ssoLoginForm.vue";
2727
import LoginOptions from "./loginOptions.vue";
2828
import AwsProfileForm from "./awsProfileForm.vue";
2929
import Authenticating from "./authenticating.vue";
30-
import {BuilderId, ExistConnection, Feature, IdC, LoginOption, LongLivedIAM, Stage} from "../../model";
30+
import {BuilderId, ExistConnection, Feature, IdC, LoginIdentifier, LoginOption, LongLivedIAM, Stage} from "../../model";
31+
32+
const authUiClickOptionMap = {
33+
[LoginIdentifier.BUILDER_ID]: 'auth_builderIdOption',
34+
[LoginIdentifier.ENTERPRISE_SSO]: 'auth_idcOption',
35+
[LoginIdentifier.IAM_CREDENTIAL]: 'auth_credentialsOption',
36+
[LoginIdentifier.EXISTING_LOGINS]: 'auth_existingAuthOption',
37+
}
38+
39+
function getUiClickEvent(loginIdentifier: LoginIdentifier) {
40+
return (authUiClickOptionMap as any)[loginIdentifier]
41+
}
3142
3243
export default defineComponent({
3344
name: 'Login',
@@ -71,6 +82,7 @@ export default defineComponent({
7182
this.$store.commit('setStage', stage)
7283
},
7384
handleBackButtonClick() {
85+
window.ideApi.postMessage({command: 'sendUiClickTelemetry', signInOptionClicked: "auth_backButton"})
7486
if (this.cancellable) {
7587
window.ideApi.postMessage({command: 'toggleBrowser'})
7688
}
@@ -81,7 +93,7 @@ export default defineComponent({
8193
this.mutateStage('START')
8294
},
8395
login(type: LoginOption) {
84-
window.ideApi.postMessage({command: 'sendTelemetry'})
96+
window.ideApi.postMessage({command: 'sendUiClickTelemetry', signInOptionClicked: "auth_continueButton"})
8597
this.selectedLoginOption = type
8698
this.mutateStage('AUTHENTICATING')
8799
if (type instanceof IdC) {
@@ -103,6 +115,9 @@ export default defineComponent({
103115
} else if (type instanceof ExistConnection) {
104116
window.ideApi.postMessage({ command: 'selectConnection', connectionId: type.pluginConnectionId})
105117
}
118+
},
119+
sendUiClickTelemetry(element: LoginIdentifier) {
120+
window.ideApi.postMessage({command: 'sendUiClickTelemetry', signInOptionClicked: getUiClickEvent(element)})
106121
}
107122
},
108123
mounted() {},

plugins/core/webview/src/q-ui/components/loginOptions.vue

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
<!-- SPDX-License-Identifier: Apache-2.0 -->
33

44
<template>
5-
<QOptions v-if="app === 'AMAZONQ'" @stageChanged="stageChanged" @login="login"/>
6-
<ToolkitOptions v-if="app === 'TOOLKIT'" @stageChanged="stageChanged" @login="login"/>
5+
<QOptions v-if="app === 'AMAZONQ'" @stageChanged="stageChanged" @login="login" @emitUiClickTelemetry="emitUiClickTelemetry"/>
6+
<ToolkitOptions v-if="app === 'TOOLKIT'" @stageChanged="stageChanged" @login="login" @emitUiClickTelemetry="emitUiClickTelemetry"/>
77
</template>
88

99
<script lang="ts">
@@ -36,6 +36,9 @@ export default defineComponent({
3636
},
3737
login(type: LoginOption) {
3838
this.$emit('login', type)
39+
},
40+
emitUiClickTelemetry(elementId: String) {
41+
this.$emit('emitUiClickTelemetry', elementId)
3942
}
4043
}
4144
})

plugins/core/webview/src/q-ui/components/qOptions.vue

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<div v-for="(connection, index) in this.existConnections" :key="index">
99
<SelectableItem
1010
@toggle="toggleItemSelection"
11+
@emitUiClickMetric="emitUiClickMetric"
1112
:isSelected="selectedLoginOption === connection.id"
1213
:itemId="connection.id"
1314
:login-type="this.connectionType(connection)"
@@ -21,6 +22,7 @@
2122
<div class="title font-amazon bottom-small-gap" v-if="existingLogin.id === -1">Choose a sign-in option:</div>
2223
<SelectableItem
2324
@toggle="toggleItemSelection"
25+
@emitUiClickMetric="emitUiClickMetric"
2426
:isSelected="selectedLoginOption === LoginOption.BUILDER_ID"
2527
:itemId="LoginOption.BUILDER_ID"
2628
:login-type="LoginOption.BUILDER_ID"
@@ -31,6 +33,7 @@
3133
<!-- TODO: IdC description undecided -->
3234
<SelectableItem
3335
@toggle="toggleItemSelection"
36+
@emitUiClickMetric="emitUiClickMetric"
3437
:isSelected="selectedLoginOption === LoginOption.ENTERPRISE_SSO"
3538
:itemId="LoginOption.ENTERPRISE_SSO"
3639
:login-type="LoginOption.ENTERPRISE_SSO"
@@ -86,6 +89,9 @@ export default defineComponent({
8689
toggleItemSelection(itemId: string) {
8790
this.selectedLoginOption = itemId
8891
},
92+
emitUiClickMetric(itemId: string) {
93+
this.$emit('emitUiClickTelemetry', itemId)
94+
},
8995
handleBackButtonClick() {
9096
this.$emit('backToMenu')
9197
},

plugins/core/webview/src/q-ui/components/selectableItem.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<!-- SPDX-License-Identifier: Apache-2.0 -->
33

44
<template>
5-
<div class="item-container" :class="{ selected: isSelected }" @click="toggleSelection" @focus="toggleSelection" tabindex="0">
5+
<div class="item-container" :class="{ selected: isSelected }" @click="toggleSelection" @focus="toggleSelectionOnFocus" tabindex="0">
66
<div class="icon">
77
<svg
88
v-if="loginType === LoginOption.BUILDER_ID"
@@ -86,8 +86,12 @@ export default defineComponent({
8686
async created() {},
8787
methods: {
8888
toggleSelection() {
89+
this.$emit('emitUiClickMetric', this.itemId)
8990
this.$emit('toggle', this.itemId)
9091
},
92+
toggleSelectionOnFocus() {
93+
this.$emit('toggle', this.itemId)
94+
}
9195
},
9296
})
9397
</script>

plugins/core/webview/src/q-ui/components/toolkitOptions.vue

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<div v-for="(connection, index) in this.existConnections" :key="index">
99
<SelectableItem
1010
@toggle="toggleItemSelection"
11+
@emitUiClickMetric="emitUiClickMetric"
1112
:isSelected="selectedLoginOption === connection.id"
1213
:itemId="connection.id"
1314
:login-type="this.connectionType(connection)"
@@ -22,6 +23,7 @@
2223
<SelectableItem
2324
v-if="feature === 'codecatalyst'"
2425
@toggle="toggleItemSelection"
26+
@emitUiClickMetric="emitUiClickMetric"
2527
:isSelected="selectedLoginOption === LoginOption.BUILDER_ID"
2628
:itemId="LoginOption.BUILDER_ID"
2729
:login-type="LoginOption.BUILDER_ID"
@@ -32,6 +34,7 @@
3234
<!-- TODO: IdC description undecided -->
3335
<SelectableItem
3436
@toggle="toggleItemSelection"
37+
@emitUiClickMetric="emitUiClickMetric"
3538
:isSelected="selectedLoginOption === LoginOption.ENTERPRISE_SSO"
3639
:itemId="LoginOption.ENTERPRISE_SSO"
3740
:login-type="LoginOption.ENTERPRISE_SSO"
@@ -42,6 +45,7 @@
4245
<SelectableItem
4346
v-if="feature === 'awsExplorer'"
4447
@toggle="toggleItemSelection"
48+
@emitUiClickMetric="emitUiClickMetric"
4549
:isSelected="selectedLoginOption === LoginOption.IAM_CREDENTIAL"
4650
:itemId="LoginOption.IAM_CREDENTIAL"
4751
:login-type="LoginOption.IAM_CREDENTIAL"
@@ -97,6 +101,9 @@ export default defineComponent({
97101
toggleItemSelection(itemId: string) {
98102
this.selectedLoginOption = itemId
99103
},
104+
emitUiClickMetric(itemId: string) {
105+
this.$emit('emitUiClickTelemetry', itemId)
106+
},
100107
handleBackButtonClick() {
101108
this.$emit('backToMenu')
102109
},

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/core/explorer/webview/ToolkitLoginWebview.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,8 @@ class ToolkitWebviewBrowser(val project: Project, private val parentDisposable:
236236
reauth(ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(CodeCatalystConnection.getInstance()))
237237
}
238238

239-
is BrowserMessage.SendTelemetry -> {
240-
UiTelemetry.click(project, "auth_continueButton")
239+
is BrowserMessage.SendUiClickTelemetry -> {
240+
UiTelemetry.click(project, message.signInOptionClicked)
241241
}
242242
}
243243
}

0 commit comments

Comments
 (0)