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();