diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt index 88efdac871..1420d01375 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt @@ -196,7 +196,12 @@ class QWebviewBrowser(val project: Project, private val parentDisposable: Dispos } is BrowserMessage.SendUiClickTelemetry -> { - UiTelemetry.click(project, message.signInOptionClicked) + val signInOption = message.signInOptionClicked + if (signInOption.isNullOrEmpty()) { + LOG.warn("Unknown sign in option") + } else { + UiTelemetry.click(project, signInOption) + } } } } diff --git a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/BrowserMessage.kt b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/BrowserMessage.kt index 6ef09af487..c07612bccc 100644 --- a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/BrowserMessage.kt +++ b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/webview/BrowserMessage.kt @@ -57,5 +57,5 @@ sealed interface BrowserMessage { object Reauth : BrowserMessage - data class SendUiClickTelemetry(val signInOptionClicked: String) : BrowserMessage + data class SendUiClickTelemetry(val signInOptionClicked: String?) : BrowserMessage } diff --git a/plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/BrowserMessageTest.kt b/plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/BrowserMessageTest.kt index 1035f8a73c..0ee085f52e 100644 --- a/plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/BrowserMessageTest.kt +++ b/plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/core/BrowserMessageTest.kt @@ -15,6 +15,7 @@ import org.assertj.core.api.Assertions.assertThatThrownBy import org.assertj.core.api.ObjectAssert import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertDoesNotThrow import org.junit.jupiter.api.extension.RegisterExtension import org.mockito.kotlin.mock import software.aws.toolkits.jetbrains.core.webview.BrowserMessage @@ -148,6 +149,18 @@ class BrowserMessageTest { } """ ) + + assertDeserializedInstanceOf( + """ + { + "command": "sendUiClickTelemetry" + } + """ + ).isEqualTo( + BrowserMessage.SendUiClickTelemetry( + signInOptionClicked = null + ) + ) } @Test @@ -273,4 +286,29 @@ class BrowserMessageTest { """ ) } + + @Test + fun `Nullable fields in sendUiClickTelemetry should not throw exception`() { + assertDoesNotThrow { + objectMapper.readValue( + """ + { + "command": "sendUiClickTelemetry", + "signInOptionClicked": null + } + """ + ) + } + + assertDoesNotThrow { + objectMapper.readValue( + """ + { + "command": "sendUiClickTelemetry" + + } + """ + ) + } + } } diff --git a/plugins/core/webview/src/q-ui/components/login.vue b/plugins/core/webview/src/q-ui/components/login.vue index d578eb4e60..260c44e6e9 100644 --- a/plugins/core/webview/src/q-ui/components/login.vue +++ b/plugins/core/webview/src/q-ui/components/login.vue @@ -34,10 +34,14 @@ const authUiClickOptionMap = { [LoginIdentifier.ENTERPRISE_SSO]: 'auth_idcOption', [LoginIdentifier.IAM_CREDENTIAL]: 'auth_credentialsOption', [LoginIdentifier.EXISTING_LOGINS]: 'auth_existingAuthOption', + [LoginIdentifier.NONE]: "Unknown" } function getUiClickEvent(loginIdentifier: LoginIdentifier) { - return (authUiClickOptionMap as any)[loginIdentifier] + if(!Object.keys(authUiClickOptionMap).includes(loginIdentifier)) { + return "Unknown" + } + return (authUiClickOptionMap)[loginIdentifier] } export default defineComponent({ diff --git a/plugins/core/webview/src/q-ui/components/qOptions.vue b/plugins/core/webview/src/q-ui/components/qOptions.vue index 5fa5f28ccd..3772a6f369 100644 --- a/plugins/core/webview/src/q-ui/components/qOptions.vue +++ b/plugins/core/webview/src/q-ui/components/qOptions.vue @@ -90,7 +90,13 @@ export default defineComponent({ this.selectedLoginOption = itemId }, emitUiClickMetric(itemId: string) { - this.$emit('emitUiClickTelemetry', itemId) + const loginIdentifiers = Object.values(LoginIdentifier).map(value => value.toString()); + if(loginIdentifiers.includes(itemId) ) { + this.$emit('emitUiClickTelemetry', itemId) + } else { + this.$emit('emitUiClickTelemetry', LoginIdentifier.EXISTING_LOGINS) + } + }, handleBackButtonClick() { this.$emit('backToMenu') diff --git a/plugins/core/webview/src/q-ui/components/toolkitOptions.vue b/plugins/core/webview/src/q-ui/components/toolkitOptions.vue index b95a9e5188..0b1b9488e1 100644 --- a/plugins/core/webview/src/q-ui/components/toolkitOptions.vue +++ b/plugins/core/webview/src/q-ui/components/toolkitOptions.vue @@ -102,7 +102,12 @@ export default defineComponent({ this.selectedLoginOption = itemId }, emitUiClickMetric(itemId: string) { - this.$emit('emitUiClickTelemetry', itemId) + const loginIdentifiers = Object.values(LoginIdentifier).map(value => value.toString()); + if(loginIdentifiers.includes(itemId) ) { + this.$emit('emitUiClickTelemetry', itemId) + } else { + this.$emit('emitUiClickTelemetry', LoginIdentifier.EXISTING_LOGINS) + } }, handleBackButtonClick() { this.$emit('backToMenu') diff --git a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/core/explorer/webview/ToolkitLoginWebview.kt b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/core/explorer/webview/ToolkitLoginWebview.kt index 734c944725..472c54909e 100644 --- a/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/core/explorer/webview/ToolkitLoginWebview.kt +++ b/plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/core/explorer/webview/ToolkitLoginWebview.kt @@ -237,7 +237,12 @@ class ToolkitWebviewBrowser(val project: Project, private val parentDisposable: } is BrowserMessage.SendUiClickTelemetry -> { - UiTelemetry.click(project, message.signInOptionClicked) + val signInOption = message.signInOptionClicked + if (signInOption.isNullOrEmpty()) { + LOG.warn("Unknown sign in option") + } else { + UiTelemetry.click(project, signInOption) + } } } } @@ -336,6 +341,7 @@ class ToolkitWebviewBrowser(val project: Project, private val parentDisposable: fun component(): JComponent? = jcefBrowser.component companion object { + private val LOG = getLogger() private const val WEB_SCRIPT_URI = "http://webview/js/toolkitGetStart.js" private const val DOMAIN = "webview" }