diff --git a/app/javascript/dashboard/api/auth.js b/app/javascript/dashboard/api/auth.js index a1b15ee79..b2e876783 100644 --- a/app/javascript/dashboard/api/auth.js +++ b/app/javascript/dashboard/api/auth.js @@ -106,4 +106,8 @@ export default { const urlData = endPoints('resetAccessToken'); return axios.post(urlData.url); }, + resetReadOnlyAccessToken() { + const urlData = endPoints('resetReadOnlyAccessToken'); + return axios.post(urlData.url); + }, }; diff --git a/app/javascript/dashboard/api/endPoints.js b/app/javascript/dashboard/api/endPoints.js index ecd3f0170..f5eb82d62 100644 --- a/app/javascript/dashboard/api/endPoints.js +++ b/app/javascript/dashboard/api/endPoints.js @@ -55,6 +55,10 @@ const endPoints = { resetAccessToken: { url: '/api/v1/profile/reset_access_token', }, + + resetReadOnlyAccessToken: { + url: '/api/v1/profile/reset_read_only_access_token', + }, }; export default page => { diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json index bfbd920a7..6a3d2c1fa 100644 --- a/app/javascript/dashboard/i18n/locale/en/settings.json +++ b/app/javascript/dashboard/i18n/locale/en/settings.json @@ -91,10 +91,16 @@ "NOTE": "This token can be used if you are building an API based integration", "COPY": "Copy", "RESET": "Reset", + "GENERATE": "Generate", "CONFIRM_RESET": "Are you sure?", "CONFIRM_HINT": "Click again to confirm", "RESET_SUCCESS": "Access token regenerated successfully", - "RESET_ERROR": "Unable to regenerate access token. Please try again" + "RESET_ERROR": "Unable to regenerate access token. Please try again", + "READ_ONLY_TITLE": "Read-only Access Token", + "READ_ONLY_NOTE": "Use this token for integrations that only need to read data. It cannot create, update, or delete anything.", + "READ_ONLY_GENERATE_SUCCESS": "Read-only access token generated successfully", + "READ_ONLY_RESET_SUCCESS": "Read-only access token regenerated successfully", + "READ_ONLY_RESET_ERROR": "Unable to regenerate read-only access token. Please try again" }, "AUDIO_NOTIFICATIONS_SECTION": { "TITLE": "Audio Alerts", diff --git a/app/javascript/dashboard/routes/dashboard/settings/profile/AccessToken.vue b/app/javascript/dashboard/routes/dashboard/settings/profile/AccessToken.vue index 027492629..1961ddaea 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/profile/AccessToken.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/profile/AccessToken.vue @@ -20,6 +20,8 @@ const maskIcon = computed(() => { return inputType.value === 'password' ? 'eye-hide' : 'eye-show'; }); +const hasToken = computed(() => Boolean(props.value)); + const onClick = () => { emit('onCopy', props.value); }; @@ -31,50 +33,64 @@ const onReset = () => { + diff --git a/app/javascript/dashboard/routes/dashboard/settings/profile/Index.vue b/app/javascript/dashboard/routes/dashboard/settings/profile/Index.vue index 75eb8a2f8..6efceb64a 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/profile/Index.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/profile/Index.vue @@ -200,6 +200,25 @@ export default { useAlert(this.$t('PROFILE_SETTINGS.FORM.ACCESS_TOKEN.RESET_ERROR')); } }, + async resetReadOnlyAccessToken() { + const hadToken = Boolean(this.currentUser.read_only_access_token); + const success = await this.$store.dispatch('resetReadOnlyAccessToken'); + if (success && hadToken) { + useAlert( + this.$t('PROFILE_SETTINGS.FORM.ACCESS_TOKEN.READ_ONLY_RESET_SUCCESS') + ); + } else if (success) { + useAlert( + this.$t( + 'PROFILE_SETTINGS.FORM.ACCESS_TOKEN.READ_ONLY_GENERATE_SUCCESS' + ) + ); + } else { + useAlert( + this.$t('PROFILE_SETTINGS.FORM.ACCESS_TOKEN.READ_ONLY_RESET_ERROR') + ); + } + }, }, }; @@ -340,5 +359,20 @@ export default { @on-reset="resetAccessToken" /> + + + diff --git a/app/javascript/dashboard/store/modules/auth.js b/app/javascript/dashboard/store/modules/auth.js index d2c6bf60c..5d874489b 100644 --- a/app/javascript/dashboard/store/modules/auth.js +++ b/app/javascript/dashboard/store/modules/auth.js @@ -233,6 +233,16 @@ export const actions = { } }, + resetReadOnlyAccessToken: async ({ commit }) => { + try { + const response = await authAPI.resetReadOnlyAccessToken(); + commit(types.SET_CURRENT_USER, response.data); + return true; + } catch (error) { + return false; + } + }, + resendConfirmation: async () => { try { await authAPI.resendConfirmation();