import { createRef, useCallback, useEffect, useState } from 'react'; import { Route, Switch } from 'react-router'; import SelectLocation from '../components/select-location/SelectLocationContainer'; import LoginPage from '../containers/LoginPage'; import { useAppContext } from '../context'; import { ITransitionSpecification, transitions, useHistory } from '../lib/history'; import { RoutePath } from '../lib/routes'; import Account from './Account'; import Connect from './Connect'; import Debug from './Debug'; import { DeviceRevokedView } from './DeviceRevokedView'; import { SetupFinished, TimeAdded, VoucherInput, VoucherVerificationSuccess, } from './ExpiredAccountAddTime'; import ExpiredAccountErrorView from './ExpiredAccountErrorView'; import Filter from './Filter'; import Focus, { IFocusHandle } from './Focus'; import Launch from './Launch'; import OpenVpnSettings from './OpenVpnSettings'; import ProblemReport from './ProblemReport'; import SelectLanguage from './SelectLanguage'; import Settings from './Settings'; import SplitTunnelingSettings from './SplitTunnelingSettings'; import Support from './Support'; import TooManyDevices from './TooManyDevices'; import TransitionContainer, { TransitionView } from './TransitionContainer'; import UserInterfaceSettings from './UserInterfaceSettings'; import VpnSettings from './VpnSettings'; import WireguardSettings from './WireguardSettings'; export default function AppRouter() { const history = useHistory(); const [currentLocation, setCurrentLocation] = useState(history.location); const [transition, setTransition] = useState(transitions.none); const { setNavigationHistory } = useAppContext(); const focusRef = createRef(); let unobserveHistory: () => void; useEffect(() => { // React throttles updates, so it's impossible to capture the intermediate navigation without // listening to the history directly. unobserveHistory = history.listen((location, _, transition) => { setNavigationHistory(history.asObject); setCurrentLocation(location); setTransition(transition); }); return () => unobserveHistory?.(); }, []); const onNavigation = useCallback(() => { focusRef.current?.resetFocus(); }, []); return ( ); }