fix(front): suppress full-page skeleton inside auth modal (#19875)

## Summary

- Lazy auth-flow routes (`SignInUp`, `Invite`, `ResetPassword`,
`CreateWorkspace`, `CreateProfile`, `SyncEmails`, `InviteTeam`,
`PlanRequired`, `PlanRequiredSuccess`, `BookCallDecision`, `BookCall`)
render through `<Outlet/>` inside `<AuthModal>`. Their `LazyRoute`
`<Suspense>` fallback was the page-level `PageContentSkeletonLoader`, so
the two grey shimmer bars painted **inside the modal box** for a few
hundred ms while each chunk downloaded.
- `LazyRoute` now accepts an optional `fallback` prop (default
unchanged: the existing page skeleton). Every auth-modal route passes
`fallback={null}` so the modal stays empty until the lazy chunk resolves
instead of flashing the shimmer.
- `AuthModal`'s inner `StyledContent` gets a `min-height: 320px` so the
framer-motion `layout` animation doesn't rapidly resize the modal as
inner steps (loader → form → password → 2FA / workspace selection) swap.
The modal can still grow for taller steps; only the rapid jump is
removed.

## Why default-parameter syntax for `fallback`

`fallback ?? <LazyRouteFallback/>` would treat an explicit `null` as "no
value" and still render the default skeleton. Using a default parameter
(`fallback = <LazyRouteFallback/>`) preserves an explicit `null` because
defaults only kick in for `undefined`.
This commit is contained in:
Charles Bochet 2026-04-20 11:39:09 +02:00 committed by GitHub
parent 01928fc786
commit de1e592cd3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 19 additions and 14 deletions

View file

@ -4,6 +4,7 @@ import { PageContentSkeletonLoader } from '~/loading/components/PageContentSkele
type LazyRouteProps = {
children: ReactNode;
fallback?: ReactNode;
};
const LazyRouteFallback = () => (
@ -12,6 +13,7 @@ const LazyRouteFallback = () => (
</PageContainer>
);
export const LazyRoute = ({ children }: LazyRouteProps) => (
<Suspense fallback={<LazyRouteFallback />}>{children}</Suspense>
);
export const LazyRoute = ({
children,
fallback = <LazyRouteFallback />,
}: LazyRouteProps) => <Suspense fallback={fallback}>{children}</Suspense>;

View file

@ -124,7 +124,7 @@ export const useCreateAppRouter = (
<Route
path={AppPath.SignInUp}
element={
<LazyRoute>
<LazyRoute fallback={null}>
<SignInUp />
</LazyRoute>
}
@ -132,7 +132,7 @@ export const useCreateAppRouter = (
<Route
path={AppPath.Invite}
element={
<LazyRoute>
<LazyRoute fallback={null}>
<SignInUp />
</LazyRoute>
}
@ -140,7 +140,7 @@ export const useCreateAppRouter = (
<Route
path={AppPath.ResetPassword}
element={
<LazyRoute>
<LazyRoute fallback={null}>
<PasswordReset />
</LazyRoute>
}
@ -148,7 +148,7 @@ export const useCreateAppRouter = (
<Route
path={AppPath.CreateWorkspace}
element={
<LazyRoute>
<LazyRoute fallback={null}>
<CreateWorkspace />
</LazyRoute>
}
@ -156,7 +156,7 @@ export const useCreateAppRouter = (
<Route
path={AppPath.CreateProfile}
element={
<LazyRoute>
<LazyRoute fallback={null}>
<CreateProfile />
</LazyRoute>
}
@ -164,7 +164,7 @@ export const useCreateAppRouter = (
<Route
path={AppPath.SyncEmails}
element={
<LazyRoute>
<LazyRoute fallback={null}>
<SyncEmails />
</LazyRoute>
}
@ -172,7 +172,7 @@ export const useCreateAppRouter = (
<Route
path={AppPath.InviteTeam}
element={
<LazyRoute>
<LazyRoute fallback={null}>
<InviteTeam />
</LazyRoute>
}
@ -180,7 +180,7 @@ export const useCreateAppRouter = (
<Route
path={AppPath.PlanRequired}
element={
<LazyRoute>
<LazyRoute fallback={null}>
<ChooseYourPlan />
</LazyRoute>
}
@ -188,7 +188,7 @@ export const useCreateAppRouter = (
<Route
path={AppPath.PlanRequiredSuccess}
element={
<LazyRoute>
<LazyRoute fallback={null}>
<PaymentSuccess />
</LazyRoute>
}
@ -196,7 +196,7 @@ export const useCreateAppRouter = (
<Route
path={AppPath.BookCallDecision}
element={
<LazyRoute>
<LazyRoute fallback={null}>
<BookCallDecision />
</LazyRoute>
}
@ -204,7 +204,7 @@ export const useCreateAppRouter = (
<Route
path={AppPath.BookCall}
element={
<LazyRoute>
<LazyRoute fallback={null}>
<BookCall />
</LazyRoute>
}

View file

@ -9,7 +9,10 @@ import { useLocation } from 'react-router-dom';
const StyledContent = styled.div`
align-items: center;
display: flex;
flex-direction: column;
justify-content: center;
min-height: 320px;
`;
type AuthModalProps = {