import * as React from 'react' import ReactDOM from 'react-dom' import {createBrowserHistory as createHistory} from 'history' import route from '../src/route' import RouterProvider from '../src/components/RouterProvider' import {Router} from '../src/types' import NotFound from './components/NotFound' import Main from './components/Main' const router: Router = route('/omg/lol', [ route.scope('product', '/products/:id', [route('/:detailView'), route('/user/:userId')]), route('/users/:userId', (params) => { if (params.userId === 'me') { return route('/:profileSection') } return undefined }), route.intents('/intents2'), ]) const history = createHistory() function handleNavigate(nextUrl, {replace}: {replace?: boolean} = {}) { if (replace) { history.replace(nextUrl) } else { history.push(nextUrl) } } function render(state, pathname) { ReactDOM.render(
{router.isNotFound(pathname) ? :
}
, document.getElementById('root') ) } if (router.isRoot(location.pathname)) { const basePath = router.getBasePath() if (basePath !== location.pathname) { history.replace(basePath) } } const intentHandlers = [] intentHandlers.push({ canHandle: (intent, params) => intent === 'open' && params.type === 'product', resolveRedirectState(intent, params) { return {product: {id: params.id}} }, }) function checkPath() { const pathname = document.location.pathname const state: any = router.decode(pathname) if (state && state.intent) { // get intent redirect url const handler = intentHandlers.find((candidate) => candidate.canHandle(state.intent, state.params) ) if (handler) { handleNavigate(router.encode(handler.resolveRedirectState(state.intent, state.params)), { replace: true, }) return } // eslint-disable-next-line no-console console.log('No intent handler for intent "%s" with params %o', state.intent, state.params) } render(state || {}, pathname) } checkPath() history.listen(checkPath)