From 2ee63656e24633a8c74f6f0e1e724d8f7fed9a28 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Wed, 21 May 2025 06:04:30 +0530 Subject: [PATCH] feat: Prevent saving preferences and status when impersonating (#11164) This PR will prevent saving user preferences and online status when impersonating. Previously, these settings could be updated during impersonation, causing the user to see a different view or UI settings. Fixes https://linear.app/chatwoot/issue/CW-4163/impersonation-improvements --- .../sidebar/SidebarProfileMenuStatus.vue | 7 + .../components/layout/AvailabilityStatus.vue | 12 ++ .../composables/spec/useImpersonation.spec.js | 37 +++++ .../dashboard/composables/useImpersonation.js | 10 ++ .../dashboard/constants/sessionStorage.js | 3 + .../dashboard/i18n/locale/en/settings.json | 3 +- .../dashboard/store/modules/auth.js | 13 +- app/javascript/dashboard/store/utils/api.js | 7 + .../shared/helpers/sessionStorage.js | 26 ++++ .../helpers/specs/sessionStorage.spec.js | 137 ++++++++++++++++++ app/javascript/v3/views/login/Index.vue | 14 +- app/models/concerns/sso_authenticatable.rb | 4 + app/views/super_admin/users/_impersonate.erb | 2 +- 13 files changed, 270 insertions(+), 5 deletions(-) create mode 100644 app/javascript/dashboard/composables/spec/useImpersonation.spec.js create mode 100644 app/javascript/dashboard/composables/useImpersonation.js create mode 100644 app/javascript/dashboard/constants/sessionStorage.js create mode 100644 app/javascript/shared/helpers/sessionStorage.js create mode 100644 app/javascript/shared/helpers/specs/sessionStorage.spec.js diff --git a/app/javascript/dashboard/components-next/sidebar/SidebarProfileMenuStatus.vue b/app/javascript/dashboard/components-next/sidebar/SidebarProfileMenuStatus.vue index 0fdf96162..fef196162 100644 --- a/app/javascript/dashboard/components-next/sidebar/SidebarProfileMenuStatus.vue +++ b/app/javascript/dashboard/components-next/sidebar/SidebarProfileMenuStatus.vue @@ -4,6 +4,7 @@ import { useMapGetter, useStore } from 'dashboard/composables/store'; import wootConstants from 'dashboard/constants/globals'; import { useAlert } from 'dashboard/composables'; import { useI18n } from 'vue-i18n'; +import { useImpersonation } from 'dashboard/composables/useImpersonation'; import { DropdownContainer, @@ -20,6 +21,8 @@ const currentUserAvailability = useMapGetter('getCurrentUserAvailability'); const currentAccountId = useMapGetter('getCurrentAccountId'); const currentUserAutoOffline = useMapGetter('getCurrentUserAutoOffline'); +const { isImpersonating } = useImpersonation(); + const { AVAILABILITY_STATUS_KEYS } = wootConstants; const statusList = computed(() => { return [ @@ -46,6 +49,10 @@ const activeStatus = computed(() => { }); function changeAvailabilityStatus(availability) { + if (isImpersonating.value) { + useAlert(t('PROFILE_SETTINGS.FORM.AVAILABILITY.IMPERSONATING_ERROR')); + return; + } try { store.dispatch('updateAvailability', { availability, diff --git a/app/javascript/dashboard/components/layout/AvailabilityStatus.vue b/app/javascript/dashboard/components/layout/AvailabilityStatus.vue index 04190c7a4..a4995aee8 100644 --- a/app/javascript/dashboard/components/layout/AvailabilityStatus.vue +++ b/app/javascript/dashboard/components/layout/AvailabilityStatus.vue @@ -1,6 +1,7 @@