import { GenericModal } from '@rocket.chat/ui-client'; import { useSetModal, useToastMessageDispatch, useRoute, useRouteParameter, useEndpoint, UserContext } from '@rocket.chat/ui-contexts'; import { useQueryClient, useMutation } from '@tanstack/react-query'; import { useCallback, useContext } from 'react'; import { useTranslation } from 'react-i18next'; import { deviceManagementQueryKeys } from '../lib/queryKeys'; export const useDeviceLogout = ( sessionId: string, endpoint: '/v1/sessions/logout' | '/v1/sessions/logout.me', isCurrentSession?: boolean, ): (() => void) => { const { t } = useTranslation(); const setModal = useSetModal(); const dispatchToastMessage = useToastMessageDispatch(); const deviceManagementRouter = useRoute('device-management'); const routeId = useRouteParameter('id'); const { logout } = useContext(UserContext); const queryClient = useQueryClient(); const logoutEndpoint = useEndpoint('POST', endpoint); const handleCloseContextualBar = useCallback(() => deviceManagementRouter.push({}), [deviceManagementRouter]); const isContextualBarOpen = routeId === sessionId; const { mutate: logoutDevice } = useMutation({ mutationFn: logoutEndpoint, onSuccess: () => { if (isCurrentSession) return; queryClient.invalidateQueries({ queryKey: deviceManagementQueryKeys.all }); if (isContextualBarOpen) { handleCloseContextualBar(); } dispatchToastMessage({ type: 'success', message: t('Device_Logged_Out') }); }, onError: (error) => { if (isCurrentSession) return; dispatchToastMessage({ type: 'error', message: error }); }, onSettled: () => { setModal(null); if (isCurrentSession) { logout(); } }, throwOnError: false, }); return useCallback(() => { const closeModal = () => setModal(null); const handleLogoutDevice = () => { logoutDevice({ sessionId }); }; setModal( {t('Device_Logout_Text')} , ); }, [setModal, t, logoutDevice, sessionId]); };