diff --git a/.changeset/forty-stars-bathe.md b/.changeset/forty-stars-bathe.md new file mode 100644 index 0000000000000..00f21597c8a50 --- /dev/null +++ b/.changeset/forty-stars-bathe.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes error message being shown when logging out current device via Device Management despite successful logout. diff --git a/apps/meteor/client/hooks/useDeviceLogout.tsx b/apps/meteor/client/hooks/useDeviceLogout.tsx index c13528d4d4c80..265f5f59a3901 100644 --- a/apps/meteor/client/hooks/useDeviceLogout.tsx +++ b/apps/meteor/client/hooks/useDeviceLogout.tsx @@ -1,10 +1,17 @@ import { GenericModal } from '@rocket.chat/ui-client'; -import { useSetModal, useToastMessageDispatch, useRoute, useRouteParameter } from '@rocket.chat/ui-contexts'; -import { useQueryClient } from '@tanstack/react-query'; -import { useCallback } from 'react'; +import { + useSetModal, + useToastMessageDispatch, + useRoute, + useRouteParameter, + useEndpoint, + useSessionDispatch, + UserContext, +} from '@rocket.chat/ui-contexts'; +import { useQueryClient, useMutation } from '@tanstack/react-query'; +import { useCallback, useContext } from 'react'; import { useTranslation } from 'react-i18next'; -import { useEndpointMutation } from './useEndpointMutation'; import { deviceManagementQueryKeys } from '../lib/queryKeys'; export const useDeviceLogout = (sessionId: string, endpoint: '/v1/sessions/logout' | '/v1/sessions/logout.me'): (() => void) => { @@ -13,29 +20,40 @@ export const useDeviceLogout = (sessionId: string, endpoint: '/v1/sessions/logou const dispatchToastMessage = useToastMessageDispatch(); const deviceManagementRouter = useRoute('device-management'); const routeId = useRouteParameter('id'); + const setForceLogout = useSessionDispatch('forceLogout'); + const { logout } = useContext(UserContext); const queryClient = useQueryClient(); + const logoutEndpoint = useEndpoint('POST', endpoint); - const { mutateAsync: logoutDevice } = useEndpointMutation('POST', endpoint, { - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: deviceManagementQueryKeys.all }); - isContextualBarOpen && handleCloseContextualBar(); - dispatchToastMessage({ type: 'success', message: t('Device_Logged_Out') }); - }, - onSettled: () => { - setModal(null); - }, - }); + const isOwnSessionLogout = endpoint === '/v1/sessions/logout.me'; const handleCloseContextualBar = useCallback(() => deviceManagementRouter.push({}), [deviceManagementRouter]); - const isContextualBarOpen = routeId === sessionId; + const { mutate: logoutDevice } = useMutation({ + mutationFn: logoutEndpoint, + onSettled: () => { + if (isOwnSessionLogout) { + setModal(null); + logout(); + } else { + queryClient.invalidateQueries({ queryKey: deviceManagementQueryKeys.all }); + if (isContextualBarOpen) { + handleCloseContextualBar(); + } + dispatchToastMessage({ type: 'success', message: t('Device_Logged_Out') }); + setModal(null); + } + }, + throwOnError: false, + }); + return useCallback(() => { const closeModal = () => setModal(null); - const handleLogoutDevice = async () => { - await logoutDevice({ sessionId }); + const handleLogoutDevice = () => { + logoutDevice({ sessionId }); }; setModal( @@ -44,12 +62,15 @@ export const useDeviceLogout = (sessionId: string, endpoint: '/v1/sessions/logou variant='danger' confirmText={t('Logout_Device')} cancelText={t('Cancel')} - onConfirm={handleLogoutDevice} + onConfirm={() => { + setForceLogout(true); + handleLogoutDevice(); + }} onCancel={closeModal} onClose={closeModal} > {t('Device_Logout_Text')} , ); - }, [setModal, t, logoutDevice, sessionId]); + }, [setModal, t, logoutDevice, sessionId, setForceLogout]); };