fix(auth): prevent infinite redirect (#10065)

Refactored the isMatchingLocation function to use useCallback for
memoization, improving performance by avoiding unnecessary re-creations.
Moved addTrailingSlash and getConstructedPath inside useCallback for
better encapsulation.
This commit is contained in:
Antoine Moreaux
2025-02-07 10:27:11 +01:00
committed by GitHub
parent 8df59c085d
commit aaea49d5f5

View File

@ -3,28 +3,36 @@ import { matchPath, useLocation } from 'react-router-dom';
import { AppBasePath } from '@/types/AppBasePath';
import { isNonEmptyString } from '@sniptt/guards';
import { isDefined } from 'twenty-shared';
import { useCallback } from 'react';
export const useIsMatchingLocation = () => {
const location = useLocation();
const addTrailingSlash = (path: string) =>
path.endsWith('/') ? path : path + '/';
// Infinite loop issue caused by `checkUserExistsQuery` in `useSignInUp`.
// Without executing this query, there is no infinite loop.
// I also noticed that in `isMatchingLocation` inside `continueWithEmail`, no loop occurs.
// Both functions are called within the `useEffect` of `SignInUpWorkspaceScopeFormEffect`.
// This led me to conclude that the issue comes from `useIsMatchingLocation`.
// Using `useCallback` prevent the loop.
const isMatchingLocation = useCallback(
(path: string, basePath?: AppBasePath) => {
const addTrailingSlash = (path: string) =>
path.endsWith('/') ? path : path + '/';
const getConstructedPath = (path: string, basePath?: AppBasePath) => {
if (!isNonEmptyString(basePath)) return path;
const getConstructedPath = (path: string, basePath?: AppBasePath) => {
if (!isNonEmptyString(basePath)) return path;
return addTrailingSlash(basePath) + path;
};
return addTrailingSlash(basePath) + path;
};
const isMatchingLocation = (path: string, basePath?: AppBasePath) => {
const match = matchPath(
getConstructedPath(path, basePath),
location.pathname,
);
const isMatching = isDefined(match);
return isMatching;
};
const match = matchPath(
getConstructedPath(path, basePath),
location.pathname,
);
return isDefined(match);
},
[location.pathname],
);
return {
isMatchingLocation,