RocketChat/Rocket.Chat

View on GitHub
apps/meteor/client/views/root/SAMLLoginRoute.tsx

Summary

Maintainability
A
1 hr
Test Coverage
import type { LocationPathname } from '@rocket.chat/ui-contexts';
import { useRouter, useToastMessageDispatch, useAbsoluteUrl } from '@rocket.chat/ui-contexts';
import { Meteor } from 'meteor/meteor';
import { useEffect } from 'react';

const SAMLLoginRoute = () => {
    const rootUrl = useAbsoluteUrl()('');
    const router = useRouter();
    const dispatchToastMessage = useToastMessageDispatch();

    useEffect(() => {
        const { token } = router.getRouteParameters();
        const { redirectUrl } = router.getSearchParameters();

        Meteor.loginWithSamlToken(token, (error?: unknown) => {
            if (error) {
                dispatchToastMessage({ type: 'error', message: error });
            }

            const decodedRedirectUrl = decodeURIComponent(redirectUrl || '');
            if (decodedRedirectUrl?.startsWith(rootUrl)) {
                const redirect = new URL(decodedRedirectUrl);
                router.navigate(
                    {
                        pathname: redirect.pathname as LocationPathname,
                        search: Object.fromEntries(redirect.searchParams.entries()),
                    },
                    { replace: true },
                );
            } else {
                router.navigate(
                    {
                        pathname: '/home',
                    },
                    { replace: true },
                );
            }
        });
    }, [dispatchToastMessage, rootUrl, router]);

    return null;
};

export default SAMLLoginRoute;