import React, { useEffect, useState } from 'react'; import { Redirect, Route } from 'react-router-dom'; import Loading from './Loading'; import Error from './Error'; export default function ProtectedRoute({ component: Component, ...rest }) { const [ user, setUser ] = useState(''); const [ fetchingUser, setFetchingUser ] = useState(true); const [ noError, setNoError ] = useState(true); useEffect(() => { const fetchUser = async () => { try { const response = await fetch('http://localhost:5000/user', { credentials: 'include' }); if (fetchingUser) { const data = await response.json(); setUser(data.session.passport.user); } setFetchingUser(false); } catch { setNoError(false); } } fetchUser(); }, []) return ( <div> <Route { ...rest } render={ () => { if (!noError) return <Error />} }/> <Route { ...rest } render={ () => { if (fetchingUser && noError) return <Loading />} }/> <Route { ...rest } render={ () => { if (user && !fetchingUser && noError) return <Component />} }/> <Route { ...rest } render={ () => { if (!user && !fetchingUser && noError) return <Redirect to="/login" />} }/> </div> ) }
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter