diff --git a/app/javascript/App.jsx b/app/javascript/App.jsx index 30fbd58805997a12e0c18ce044c3596ac75df3fb..c688a4cde5c156eb74d00db46d677114d4ebec82 100644 --- a/app/javascript/App.jsx +++ b/app/javascript/App.jsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react'; import { Container } from 'react-bootstrap'; -import { Outlet } from 'react-router-dom'; +import { Outlet, useLocation } from 'react-router-dom'; import { Toaster } from 'react-hot-toast'; import { useTranslation } from 'react-i18next'; import Header from './components/shared_components/Header'; @@ -12,6 +12,7 @@ import BackgroundBuffer from './components/shared_components/BackgroundBuffer'; export default function App() { const currentUser = useAuth(); const pageHeight = currentUser?.signed_in ? 'regular-height' : 'no-header-height'; + const location = useLocation(); // //i18n const { i18n } = useTranslation(); @@ -29,7 +30,7 @@ export default function App() { return ( <> - {currentUser?.signed_in && <Header /> } + {location.pathname !== '/' && currentUser?.signed_in && <Header /> } {currentUser?.verified && <BackgroundBuffer /> } <Container className={pageHeight}> <Outlet /> diff --git a/app/javascript/components/home/HomePage.jsx b/app/javascript/components/home/HomePage.jsx index 57852a641febb8766812552374b1a23482db9543..39239f6a9c8d3d7fdf9ca5e0141832b09f8e06e6 100644 --- a/app/javascript/components/home/HomePage.jsx +++ b/app/javascript/components/home/HomePage.jsx @@ -1,17 +1,20 @@ import React, { useEffect } from 'react'; import { Card, Form } from 'react-bootstrap'; -import { useLocation, useSearchParams } from 'react-router-dom'; +import { useLocation, useNavigate, useSearchParams } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import Button from 'react-bootstrap/Button'; import ButtonLink from '../shared_components/utilities/ButtonLink'; import useEnv from '../../hooks/queries/env/useEnv'; import Logo from '../shared_components/Logo'; import useSiteSetting from '../../hooks/queries/site_settings/useSiteSetting'; +import { useAuth } from '../../contexts/auth/AuthProvider'; export default function HomePage() { const { data: env } = useEnv(); const { t } = useTranslation(); const { search } = useLocation(); + const currentUser = useAuth(); + const navigate = useNavigate(); const [searchParams] = useSearchParams(); const inviteToken = searchParams.get('inviteToken'); const { data: registrationMethod } = useSiteSetting('RegistrationMethod'); @@ -20,6 +23,18 @@ export default function HomePage() { document.cookie = `token=${inviteToken};path=/;`; }, [inviteToken]); + // redirect user to correct page based on signed in status and CreateRoom permission + useEffect( + () => { + if (!currentUser.stateChanging && currentUser.signed_in && currentUser.permissions.CreateRoom === 'true') { + navigate('/rooms'); + } else if (!currentUser.stateChanging && currentUser.signed_in && currentUser.permissions.CreateRoom === 'false') { + navigate('/home'); + } + }, + [currentUser.signed_in], + ); + function showSignUp() { return registrationMethod !== 'invite' || !!inviteToken; } diff --git a/app/javascript/contexts/auth/AuthProvider.jsx b/app/javascript/contexts/auth/AuthProvider.jsx index 987289217f2ffd481766b51e86b96ce633ab74f7..1e3d9bf073020a0b8b2e281774fea98ceba360ee 100644 --- a/app/javascript/contexts/auth/AuthProvider.jsx +++ b/app/javascript/contexts/auth/AuthProvider.jsx @@ -27,6 +27,7 @@ export default function AuthProvider({ children }) { permissions: currentUser?.permissions, role: currentUser?.role, verified: currentUser?.verified, + stateChanging: false, }; const memoizedCurrentUser = useMemo(() => user, [user]); diff --git a/app/javascript/hooks/mutations/sessions/useDeleteSession.jsx b/app/javascript/hooks/mutations/sessions/useDeleteSession.jsx index 8d06cc8923eb9dc7d46b684e05ceba2631a35858..6ea5c1ae197dbda2a3c1d7b7911d9a834ba5d52b 100644 --- a/app/javascript/hooks/mutations/sessions/useDeleteSession.jsx +++ b/app/javascript/hooks/mutations/sessions/useDeleteSession.jsx @@ -3,19 +3,23 @@ import { toast } from 'react-hot-toast'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import axios from '../../../helpers/Axios'; +import { useAuth } from '../../../contexts/auth/AuthProvider'; export default function useDeleteSession() { const { t } = useTranslation(); const queryClient = useQueryClient(); const navigate = useNavigate(); + const currentUser = useAuth(); return useMutation( () => axios.delete('/sessions/signout.json'), { onSuccess: async () => { - await navigate('/'); + currentUser.stateChanging = true; queryClient.refetchQueries('useSessions'); + await navigate('/'); toast.success(t('toast.success.session.signed_out')); + currentUser.stateChanging = false; }, onError: () => { toast.error(t('toast.error.problem_completing_action'));