2020-06-19 01:52:25 +00:00
|
|
|
import { Route, IndexRoute } from 'react-router';
|
2016-06-23 22:29:55 +00:00
|
|
|
import React from 'react';
|
2020-08-19 20:48:09 +00:00
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import MediaQuery from 'react-responsive';
|
|
|
|
|
2016-06-23 22:29:55 +00:00
|
|
|
import App from './modules/App/App';
|
2020-06-12 19:09:30 +00:00
|
|
|
import IDEView from './modules/IDE/pages/IDEView';
|
2020-06-22 18:10:20 +00:00
|
|
|
import MobileIDEView from './modules/IDE/pages/MobileIDEView';
|
2020-06-18 18:39:55 +00:00
|
|
|
import MobileSketchView from './modules/Mobile/MobileSketchView';
|
2020-06-23 00:06:40 +00:00
|
|
|
import MobilePreferences from './modules/Mobile/MobilePreferences';
|
2016-08-17 22:13:17 +00:00
|
|
|
import FullView from './modules/IDE/pages/FullView';
|
2016-12-15 23:43:58 +00:00
|
|
|
import LoginView from './modules/User/pages/LoginView';
|
|
|
|
import SignupView from './modules/User/pages/SignupView';
|
2016-12-19 21:49:37 +00:00
|
|
|
import ResetPasswordView from './modules/User/pages/ResetPasswordView';
|
2017-06-26 16:48:28 +00:00
|
|
|
import EmailVerificationView from './modules/User/pages/EmailVerificationView';
|
2016-12-19 21:49:37 +00:00
|
|
|
import NewPasswordView from './modules/User/pages/NewPasswordView';
|
2017-03-16 22:25:12 +00:00
|
|
|
import AccountView from './modules/User/pages/AccountView';
|
2019-07-09 16:24:09 +00:00
|
|
|
import CollectionView from './modules/User/pages/CollectionView';
|
2019-08-11 09:08:17 +00:00
|
|
|
import DashboardView from './modules/User/pages/DashboardView';
|
2019-08-24 10:38:42 +00:00
|
|
|
import createRedirectWithUsername from './components/createRedirectWithUsername';
|
2020-07-30 20:18:21 +00:00
|
|
|
import MobileDashboardView from './modules/Mobile/MobileDashboardView';
|
2016-06-23 22:29:55 +00:00
|
|
|
import { getUser } from './modules/User/actions';
|
2017-06-18 21:11:23 +00:00
|
|
|
import { stopSketch } from './modules/IDE/actions/ide';
|
2019-09-19 17:38:27 +00:00
|
|
|
import { userIsAuthenticated, userIsNotAuthenticated, userIsAuthorized } from './utils/auth';
|
2016-06-14 23:11:42 +00:00
|
|
|
|
|
|
|
const checkAuth = (store) => {
|
2016-06-23 22:29:55 +00:00
|
|
|
store.dispatch(getUser());
|
|
|
|
};
|
|
|
|
|
2020-08-20 18:59:05 +00:00
|
|
|
const mobileFirst = (MobileComponent, Fallback, store) => props => (
|
2020-08-19 21:38:33 +00:00
|
|
|
<MediaQuery minDeviceWidth={770}>
|
2020-08-20 18:59:05 +00:00
|
|
|
{matches => ((matches && (!store || store.getState().editorAccessibility.forceDesktop))
|
2020-08-19 20:53:51 +00:00
|
|
|
? <Fallback {...props} />
|
|
|
|
: <MobileComponent {...props} />)}
|
|
|
|
</MediaQuery>);
|
2020-08-19 20:48:09 +00:00
|
|
|
|
2020-06-29 17:30:34 +00:00
|
|
|
// TODO: This short-circuit seems unnecessary - using the mobile <Switch /> navigator (future) should prevent this from being called
|
2017-06-18 21:11:23 +00:00
|
|
|
const onRouteChange = (store) => {
|
2020-06-19 01:52:25 +00:00
|
|
|
const path = window.location.pathname;
|
2020-08-19 21:13:05 +00:00
|
|
|
if (path.includes('preview')) return;
|
2020-06-19 18:58:48 +00:00
|
|
|
|
2017-06-18 21:11:23 +00:00
|
|
|
store.dispatch(stopSketch());
|
|
|
|
};
|
|
|
|
|
2018-08-27 18:34:24 +00:00
|
|
|
const routes = store => (
|
|
|
|
<Route path="/" component={App} onChange={() => { onRouteChange(store); }}>
|
2020-08-19 20:53:51 +00:00
|
|
|
<IndexRoute onEnter={checkAuth(store)} component={mobileFirst(MobileIDEView, IDEView)} />
|
2020-08-19 20:48:09 +00:00
|
|
|
|
2019-09-19 17:38:27 +00:00
|
|
|
<Route path="/login" component={userIsNotAuthenticated(LoginView)} />
|
|
|
|
<Route path="/signup" component={userIsNotAuthenticated(SignupView)} />
|
|
|
|
<Route path="/reset-password" component={userIsNotAuthenticated(ResetPasswordView)} />
|
2018-08-27 18:34:24 +00:00
|
|
|
<Route path="/verify" component={EmailVerificationView} />
|
|
|
|
<Route
|
|
|
|
path="/reset-password/:reset_password_token"
|
|
|
|
component={NewPasswordView}
|
|
|
|
/>
|
|
|
|
<Route path="/projects/:project_id" component={IDEView} />
|
2018-10-18 18:10:37 +00:00
|
|
|
<Route path="/:username/full/:project_id" component={FullView} />
|
2018-08-27 18:34:24 +00:00
|
|
|
<Route path="/full/:project_id" component={FullView} />
|
2020-08-19 21:13:05 +00:00
|
|
|
|
|
|
|
<Route path="/:username/assets" component={userIsAuthenticated(userIsAuthorized(mobileFirst(MobileDashboardView, DashboardView)))} />
|
|
|
|
<Route path="/:username/sketches" component={mobileFirst(MobileDashboardView, DashboardView)} />
|
|
|
|
<Route path="/:username/sketches/:project_id" component={mobileFirst(MobileIDEView, IDEView)} />
|
|
|
|
<Route path="/:username/sketches/:project_id/add-to-collection" component={mobileFirst(MobileIDEView, IDEView)} />
|
|
|
|
<Route path="/:username/collections" component={mobileFirst(MobileDashboardView, DashboardView)} />
|
|
|
|
|
|
|
|
<Route path="/:username/collections/create" component={DashboardView} />
|
|
|
|
<Route path="/:username/collections/:collection_id" component={CollectionView} />
|
|
|
|
|
2019-08-24 10:38:42 +00:00
|
|
|
<Route path="/sketches" component={createRedirectWithUsername('/:username/sketches')} />
|
|
|
|
<Route path="/assets" component={createRedirectWithUsername('/:username/assets')} />
|
2019-09-19 17:38:27 +00:00
|
|
|
<Route path="/account" component={userIsAuthenticated(AccountView)} />
|
2018-08-27 18:34:24 +00:00
|
|
|
<Route path="/about" component={IDEView} />
|
2020-06-09 19:29:20 +00:00
|
|
|
|
2020-08-19 21:13:05 +00:00
|
|
|
{/* Mobile-only Routes */}
|
|
|
|
<Route path="/preview" component={MobileSketchView} />
|
|
|
|
<Route path="/preferences" component={MobilePreferences} />
|
2020-07-30 19:13:00 +00:00
|
|
|
|
2018-08-27 18:34:24 +00:00
|
|
|
</Route>
|
|
|
|
);
|
2016-05-18 17:37:59 +00:00
|
|
|
|
2016-06-23 22:29:55 +00:00
|
|
|
export default routes;
|