118 lines
3.6 KiB
TypeScript
118 lines
3.6 KiB
TypeScript
import { useEffect } from 'react';
|
|
import { useNavigate } from 'react-router-dom';
|
|
import styled from '@emotion/styled';
|
|
import { AnimatePresence, LayoutGroup } from 'framer-motion';
|
|
import { useRecoilValue } from 'recoil';
|
|
|
|
import { AuthModal } from '@/auth/components/Modal';
|
|
import { useOnboardingStatus } from '@/auth/hooks/useOnboardingStatus';
|
|
import { OnboardingStatus } from '@/auth/utils/getOnboardingStatus';
|
|
import { CommandMenu } from '@/command-menu/components/CommandMenu';
|
|
import { NavbarAnimatedContainer } from '@/ui/navbar/components/NavbarAnimatedContainer';
|
|
import { MOBILE_VIEWPORT } from '@/ui/themes/themes';
|
|
import { AppNavbar } from '~/AppNavbar';
|
|
import { useIsMatchingLocation } from '~/hooks/useIsMatchingLocation';
|
|
import { CompaniesMockMode } from '~/pages/companies/CompaniesMockMode';
|
|
|
|
import { AppPath } from '../../../types/AppPath';
|
|
import { isNavbarOpenedState } from '../states/isNavbarOpenedState';
|
|
|
|
const StyledLayout = styled.div`
|
|
background: ${({ theme }) => theme.background.noisy};
|
|
display: flex;
|
|
flex-direction: row;
|
|
height: 100vh;
|
|
position: relative;
|
|
width: 100vw;
|
|
`;
|
|
|
|
const NAVBAR_WIDTH = '236px';
|
|
|
|
const MainContainer = styled.div`
|
|
display: flex;
|
|
flex-direction: row;
|
|
overflow: hidden;
|
|
width: ${() =>
|
|
useRecoilValue(isNavbarOpenedState)
|
|
? `calc(100% - ${NAVBAR_WIDTH})`
|
|
: '100%'};
|
|
@media (max-width: ${MOBILE_VIEWPORT}px) {
|
|
width: ${() => (useRecoilValue(isNavbarOpenedState) ? '0' : '100%')};
|
|
}
|
|
`;
|
|
|
|
type OwnProps = {
|
|
children: JSX.Element;
|
|
};
|
|
|
|
export function DefaultLayout({ children }: OwnProps) {
|
|
const navigate = useNavigate();
|
|
const isMatchingLocation = useIsMatchingLocation();
|
|
|
|
const onboardingStatus = useOnboardingStatus();
|
|
|
|
useEffect(() => {
|
|
const isMachinOngoingUserCreationRoute =
|
|
isMatchingLocation(AppPath.SignUp) ||
|
|
isMatchingLocation(AppPath.SignIn) ||
|
|
isMatchingLocation(AppPath.Invite) ||
|
|
isMatchingLocation(AppPath.Verify);
|
|
|
|
const isMatchingOnboardingRoute =
|
|
isMatchingLocation(AppPath.SignUp) ||
|
|
isMatchingLocation(AppPath.SignIn) ||
|
|
isMatchingLocation(AppPath.Invite) ||
|
|
isMatchingLocation(AppPath.Verify) ||
|
|
isMatchingLocation(AppPath.CreateWorkspace) ||
|
|
isMatchingLocation(AppPath.CreateProfile);
|
|
|
|
if (
|
|
onboardingStatus === OnboardingStatus.OngoingUserCreation &&
|
|
!isMachinOngoingUserCreationRoute
|
|
) {
|
|
navigate(AppPath.SignIn);
|
|
} else if (
|
|
onboardingStatus === OnboardingStatus.OngoingWorkspaceCreation &&
|
|
!isMatchingLocation(AppPath.CreateWorkspace)
|
|
) {
|
|
navigate(AppPath.CreateWorkspace);
|
|
} else if (
|
|
onboardingStatus === OnboardingStatus.OngoingProfileCreation &&
|
|
!isMatchingLocation(AppPath.CreateProfile)
|
|
) {
|
|
navigate(AppPath.CreateProfile);
|
|
} else if (
|
|
onboardingStatus === OnboardingStatus.Completed &&
|
|
isMatchingOnboardingRoute
|
|
) {
|
|
navigate('/');
|
|
}
|
|
}, [onboardingStatus, navigate, isMatchingLocation]);
|
|
|
|
return (
|
|
<StyledLayout>
|
|
<>
|
|
<CommandMenu />
|
|
<NavbarAnimatedContainer>
|
|
<AppNavbar />
|
|
</NavbarAnimatedContainer>
|
|
<MainContainer>
|
|
{onboardingStatus &&
|
|
onboardingStatus !== OnboardingStatus.Completed ? (
|
|
<>
|
|
<CompaniesMockMode />
|
|
<AnimatePresence mode="wait">
|
|
<LayoutGroup>
|
|
<AuthModal>{children}</AuthModal>
|
|
</LayoutGroup>
|
|
</AnimatePresence>
|
|
</>
|
|
) : (
|
|
<>{children}</>
|
|
)}
|
|
</MainContainer>
|
|
</>
|
|
</StyledLayout>
|
|
);
|
|
}
|