ilp-core
Version:
ILP core module managing ledger abstraction
208 lines (167 loc) • 6.16 kB
JavaScript
import React from 'react'
import { Router, IndexRoute, Route } from 'react-router'
import { isLoaded as isAuthLoaded, load, locationUpdate } from 'redux/actions/auth'
import App from 'containers/App/App'
import NotFound from 'containers/NotFound/NotFound'
import Widget from 'containers/Widget/Widget'
export default (store) => {
const isAuth = () => {
return store.getState().auth.user
}
let authLoadPromise
const loadAuth = (cb) => {
if (!isAuthLoaded(store.getState()) && !authLoadPromise) {
authLoadPromise = store.dispatch(load())
}
if (authLoadPromise) {
authLoadPromise.then(() => {
authLoadPromise = undefined
cb()
}).catch(() => {
authLoadPromise = undefined
cb()
})
} else {
cb()
}
}
const noAuth = (nextState, replace, cb) => {
loadAuth(() => {
if (isAuth()) replace('/')
cb()
})
}
const requireAuth = (nextState, replace, cb) => {
loadAuth(() => {
if (!isAuth()) replace('/')
cb()
})
}
const requireAdmin = (nextState, replace, cb) => {
loadAuth(() => {
if (!isAuth() || !isAuth().isAdmin) replace('/')
cb()
})
}
const getHome = (nextState, cb) => {
require.ensure(['./containers/Home/Home'], require => {
cb(null, require('./containers/Home/Home'))
store.dispatch(locationUpdate())
}, 'home')
}
const getAuth = (nextState, cb) => {
require.ensure(['./containers/Auth/Auth'], require => {
cb(null, require('./containers/Auth/Auth'))
store.dispatch(locationUpdate())
}, 'auth')
}
const rootComponent = (nextState, cb) => {
loadAuth(() => isAuth() ? getHome(null, cb) : getAuth(null, cb))
}
const getButton = (nextState, cb) => {
require.ensure(['./containers/Button/Button'], require => {
cb(null, require('./containers/Button/Button'))
store.dispatch(locationUpdate())
}, 'button')
}
const getSettings = (nextState, cb) => {
require.ensure(['./containers/Settings/Settings'], require => {
cb(null, require('./containers/Settings/Settings'))
store.dispatch(locationUpdate())
}, 'settings')
}
const getInvites = (nextState, cb) => {
require.ensure(['./containers/Invites/Invites'], require => {
cb(null, require('./containers/Invites/Invites'))
store.dispatch(locationUpdate())
}, 'invites')
}
const getUsers = (nextState, cb) => {
require.ensure(['./containers/Users/Users'], require => {
cb(null, require('./containers/Users/Users'))
store.dispatch(locationUpdate())
}, 'users')
}
const getWithdrawals = (nextState, cb) => {
require.ensure(['./containers/Withdrawals/Withdrawals'], require => {
cb(null, require('./containers/Withdrawals/Withdrawals'))
store.dispatch(locationUpdate())
}, 'withdrawals')
}
const getPeers = (nextState, cb) => {
require.ensure(['./containers/Peers/Peers'], require => {
cb(null, require('./containers/Peers/Peers'))
store.dispatch(locationUpdate())
}, 'peers')
}
const getSettlement = (nextState, cb) => {
require.ensure(['./containers/Settlement/Settlement'], require => {
cb(null, require('./containers/Settlement/Settlement'))
store.dispatch(locationUpdate())
}, 'settlement')
}
const getSettle = (nextState, cb) => {
require.ensure(['./containers/Settle/Settle'], require => {
cb(null, require('./containers/Settle/Settle'))
store.dispatch(locationUpdate())
}, 'settle')
}
const getSettlementInfo = (nextState, cb) => {
require.ensure(['./containers/SettlementInfo/SettlementInfo'], require => {
cb(null, require('./containers/SettlementInfo/SettlementInfo'))
store.dispatch(locationUpdate())
}, 'settlementInfo')
}
const getSettlementCancel = (nextState, cb) => {
require.ensure(['./containers/SettlementCancel/SettlementCancel'], require => {
cb(null, require('./containers/SettlementCancel/SettlementCancel'))
store.dispatch(locationUpdate())
}, 'settlementCancel')
}
const getWithdraw = (nextState, cb) => {
require.ensure(['./containers/Withdraw/Withdraw'], require => {
cb(null, require('./containers/Withdraw/Withdraw'))
store.dispatch(locationUpdate())
}, 'withdraw')
}
/**
* Please keep routes in alphabetical order
*/
return (
<Router>
<Route path="widget" component={Widget} />
<Route path="/" component={App}>
{ /* Home (main) route */ }
<IndexRoute getComponent={rootComponent} />
{ /* Routes only available to guests */ }
<Route onEnter={noAuth}>
<Route path="login" getComponent={getAuth} />
<Route path="register(/:inviteCode)" getComponent={getAuth} />
<Route path="forgot-password" getComponent={getAuth} />
<Route path="change-password/:username/:passwordChangeCode" getComponent={getAuth} />
</Route>
{ /* Routes requiring Auth */ }
<Route onEnter={requireAuth}>
<Route path="button" getComponent={getButton} />
<Route path="settings" getComponent={getSettings} />
</Route>
{ /* Admin pages */ }
<Route onEnter={requireAdmin}>
<Route path="invites" getComponent={getInvites} />
<Route path="users" getComponent={getUsers} />
<Route path="withdrawals" getComponent={getWithdrawals} />
<Route path="peers" getComponent={getPeers} />
<Route path="settlement" getComponent={getSettlement} />
</Route>
{ /* Routes available to all */ }
<Route path="settle/:method/:destination" getComponent={getSettle} />
<Route path="settlement/cancel" getComponent={getSettlementCancel} />
<Route path="settlement/:id" getComponent={getSettlementInfo} />
<Route path="withdraw" getComponent={getWithdraw} />
<Route path="verify/:username/:verifyCode" getComponent={rootComponent} />
{ /* Catch all route */ }
<Route path="*" component={NotFound} status={404} />
</Route>
</Router>
)
}