11import { GenericModal } from '@rocket.chat/ui-client' ;
2- import { useSetModal , useToastMessageDispatch , useRoute , useRouteParameter } from '@rocket.chat/ui-contexts' ;
3- import { useQueryClient } from '@tanstack/react-query' ;
4- import { useCallback } from 'react' ;
2+ import {
3+ useSetModal ,
4+ useToastMessageDispatch ,
5+ useRoute ,
6+ useRouteParameter ,
7+ useEndpoint ,
8+ useSessionDispatch ,
9+ UserContext ,
10+ } from '@rocket.chat/ui-contexts' ;
11+ import { useQueryClient , useMutation } from '@tanstack/react-query' ;
12+ import { useCallback , useContext } from 'react' ;
513import { useTranslation } from 'react-i18next' ;
614
7- import { useEndpointMutation } from './useEndpointMutation' ;
815import { deviceManagementQueryKeys } from '../lib/queryKeys' ;
916
1017export 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
1320 const dispatchToastMessage = useToastMessageDispatch ( ) ;
1421 const deviceManagementRouter = useRoute ( 'device-management' ) ;
1522 const routeId = useRouteParameter ( 'id' ) ;
23+ const setForceLogout = useSessionDispatch ( 'forceLogout' ) ;
24+ const { logout } = useContext ( UserContext ) ;
1625
1726 const queryClient = useQueryClient ( ) ;
27+ const logoutEndpoint = useEndpoint ( 'POST' , endpoint ) ;
1828
19- const { mutateAsync : logoutDevice } = useEndpointMutation ( 'POST' , endpoint , {
20- onSuccess : ( ) => {
21- queryClient . invalidateQueries ( { queryKey : deviceManagementQueryKeys . all } ) ;
22- isContextualBarOpen && handleCloseContextualBar ( ) ;
23- dispatchToastMessage ( { type : 'success' , message : t ( 'Device_Logged_Out' ) } ) ;
24- } ,
25- onSettled : ( ) => {
26- setModal ( null ) ;
27- } ,
28- } ) ;
29+ const isOwnSessionLogout = endpoint === '/v1/sessions/logout.me' ;
2930
3031 const handleCloseContextualBar = useCallback ( ( ) => deviceManagementRouter . push ( { } ) , [ deviceManagementRouter ] ) ;
31-
3232 const isContextualBarOpen = routeId === sessionId ;
3333
34+ const { mutate : logoutDevice } = useMutation ( {
35+ mutationFn : logoutEndpoint ,
36+ onSettled : ( ) => {
37+ if ( isOwnSessionLogout ) {
38+ setModal ( null ) ;
39+ logout ( ) ;
40+ } else {
41+ queryClient . invalidateQueries ( { queryKey : deviceManagementQueryKeys . all } ) ;
42+ if ( isContextualBarOpen ) {
43+ handleCloseContextualBar ( ) ;
44+ }
45+ dispatchToastMessage ( { type : 'success' , message : t ( 'Device_Logged_Out' ) } ) ;
46+ setModal ( null ) ;
47+ }
48+ } ,
49+ throwOnError : false ,
50+ } ) ;
51+
3452 return useCallback ( ( ) => {
3553 const closeModal = ( ) => setModal ( null ) ;
3654
37- const handleLogoutDevice = async ( ) => {
38- await logoutDevice ( { sessionId } ) ;
55+ const handleLogoutDevice = ( ) => {
56+ logoutDevice ( { sessionId } ) ;
3957 } ;
4058
4159 setModal (
@@ -44,12 +62,15 @@ export const useDeviceLogout = (sessionId: string, endpoint: '/v1/sessions/logou
4462 variant = 'danger'
4563 confirmText = { t ( 'Logout_Device' ) }
4664 cancelText = { t ( 'Cancel' ) }
47- onConfirm = { handleLogoutDevice }
65+ onConfirm = { ( ) => {
66+ setForceLogout ( true ) ;
67+ handleLogoutDevice ( ) ;
68+ } }
4869 onCancel = { closeModal }
4970 onClose = { closeModal }
5071 >
5172 { t ( 'Device_Logout_Text' ) }
5273 </ GenericModal > ,
5374 ) ;
54- } , [ setModal , t , logoutDevice , sessionId ] ) ;
75+ } , [ setModal , t , logoutDevice , sessionId , setForceLogout ] ) ;
5576} ;
0 commit comments