RocketChat/Rocket.Chat

View on GitHub
apps/meteor/client/hooks/useDeviceLogout.tsx

Summary

Maintainability
A
2 hrs
Test Coverage
import { useSetModal, useTranslation, useToastMessageDispatch, useRoute, useRouteParameter } from '@rocket.chat/ui-contexts';
import React, { useCallback } from 'react';

import GenericModal from '../components/GenericModal';
import { useEndpointAction } from './useEndpointAction';

export const useDeviceLogout = (
    sessionId: string,
    endpoint: '/v1/sessions/logout' | '/v1/sessions/logout.me',
): ((onReload: () => void) => void) => {
    const t = useTranslation();
    const setModal = useSetModal();
    const dispatchToastMessage = useToastMessageDispatch();
    const deviceManagementRouter = useRoute('device-management');
    const routeId = useRouteParameter('id');

    const logoutDevice = useEndpointAction('POST', endpoint);

    const handleCloseContextualBar = useCallback((): void => deviceManagementRouter.push({}), [deviceManagementRouter]);

    const isContextualBarOpen = routeId === sessionId;

    const handleLogoutDeviceModal = useCallback(
        (onReload: () => void) => {
            const closeModal = (): void => setModal(null);

            const handleLogoutDevice = async (): Promise<void> => {
                try {
                    await logoutDevice({ sessionId });
                    onReload();
                    isContextualBarOpen && handleCloseContextualBar();
                    dispatchToastMessage({ type: 'success', message: t('Device_Logged_Out') });
                } catch (error) {
                    dispatchToastMessage({ type: 'error', message: error });
                } finally {
                    closeModal();
                }
            };

            setModal(
                <GenericModal
                    title={t('Logout_Device')}
                    variant='danger'
                    confirmText={t('Logout_Device')}
                    cancelText={t('Cancel')}
                    onConfirm={handleLogoutDevice}
                    onCancel={closeModal}
                    onClose={closeModal}
                >
                    {t('Device_Logout_Text')}
                </GenericModal>,
            );
        },
        [setModal, t, logoutDevice, sessionId, isContextualBarOpen, handleCloseContextualBar, dispatchToastMessage],
    );

    return handleLogoutDeviceModal;
};