2019-11-07 20:39:22 +01:00
|
|
|
// @flow
|
|
|
|
import * as PAGES from 'constants/pages';
|
2019-12-02 18:30:08 +01:00
|
|
|
import React, { useEffect } from 'react';
|
2020-02-05 15:49:03 +01:00
|
|
|
import { Route, Redirect, Switch, withRouter } from 'react-router-dom';
|
2019-11-07 20:39:22 +01:00
|
|
|
import SettingsPage from 'page/settings';
|
|
|
|
import HelpPage from 'page/help';
|
2020-02-21 20:27:54 +01:00
|
|
|
// @if TARGET='app'
|
2020-02-21 18:23:04 +01:00
|
|
|
import BackupPage from 'page/backup';
|
2020-02-21 20:27:54 +01:00
|
|
|
// @endif
|
2019-11-07 20:39:22 +01:00
|
|
|
import ReportPage from 'page/report';
|
|
|
|
import ShowPage from 'page/show';
|
|
|
|
import PublishPage from 'page/publish';
|
|
|
|
import DiscoverPage from 'page/discover';
|
2020-01-20 17:47:03 +01:00
|
|
|
import HomePage from 'page/home';
|
2020-01-14 21:44:07 +01:00
|
|
|
import InvitedPage from 'page/invited';
|
2019-11-07 20:39:22 +01:00
|
|
|
import RewardsPage from 'page/rewards';
|
|
|
|
import FileListDownloaded from 'page/fileListDownloaded';
|
|
|
|
import FileListPublished from 'page/fileListPublished';
|
|
|
|
import InvitePage from 'page/invite';
|
|
|
|
import SearchPage from 'page/search';
|
|
|
|
import LibraryPage from 'page/library';
|
|
|
|
import WalletPage from 'page/wallet';
|
2020-01-02 17:30:27 +01:00
|
|
|
import TagsFollowingPage from 'page/tagsFollowing';
|
|
|
|
import ChannelsFollowingPage from 'page/channelsFollowing';
|
2020-02-17 20:12:28 +01:00
|
|
|
import ChannelsFollowingDiscoverPage from 'page/channelsFollowingDiscover';
|
2020-01-02 23:43:09 +01:00
|
|
|
import TagsFollowingManagePage from 'page/tagsFollowingManage';
|
2019-11-07 20:39:22 +01:00
|
|
|
import ListBlockedPage from 'page/listBlocked';
|
|
|
|
import FourOhFourPage from 'page/fourOhFour';
|
|
|
|
import SignInPage from 'page/signIn';
|
2020-04-13 21:16:07 +02:00
|
|
|
import SignUpPage from 'page/signUp';
|
|
|
|
import PasswordSetPage from 'page/passwordSet';
|
2019-11-14 01:33:36 +01:00
|
|
|
import SignInVerifyPage from 'page/signInVerify';
|
2019-11-07 20:39:22 +01:00
|
|
|
import ChannelsPage from 'page/channels';
|
2019-12-30 20:54:53 +01:00
|
|
|
import EmbedWrapperPage from 'page/embedWrapper';
|
2020-02-11 20:04:51 +01:00
|
|
|
import TopPage from 'page/top';
|
2020-03-18 18:11:37 +01:00
|
|
|
import Welcome from 'page/welcome';
|
|
|
|
import CreatorDashboard from 'page/creatorDashboard';
|
2020-04-13 22:03:44 +02:00
|
|
|
import RewardsVerifyPage from 'page/rewardsVerify';
|
2020-01-25 21:37:02 +01:00
|
|
|
import { parseURI } from 'lbry-redux';
|
2020-02-19 07:31:40 +01:00
|
|
|
import { SITE_TITLE, WELCOME_VERSION } from 'config';
|
2019-11-07 20:39:22 +01:00
|
|
|
|
|
|
|
// Tell the browser we are handling scroll restoration
|
|
|
|
if ('scrollRestoration' in history) {
|
|
|
|
history.scrollRestoration = 'manual';
|
|
|
|
}
|
|
|
|
|
|
|
|
type PrivateRouteProps = {
|
|
|
|
component: any,
|
|
|
|
isAuthenticated: boolean,
|
2020-02-05 15:49:03 +01:00
|
|
|
location: { pathname: string },
|
2019-11-07 20:39:22 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
function PrivateRoute(props: PrivateRouteProps) {
|
|
|
|
const { component: Component, isAuthenticated, ...rest } = props;
|
|
|
|
return (
|
|
|
|
<Route
|
|
|
|
{...rest}
|
|
|
|
render={props =>
|
|
|
|
isAuthenticated || !IS_WEB ? (
|
|
|
|
<Component {...props} />
|
|
|
|
) : (
|
2020-02-05 15:49:03 +01:00
|
|
|
<Redirect to={`/$/${PAGES.AUTH}?redirect=${props.location.pathname}`} />
|
2019-11-07 20:39:22 +01:00
|
|
|
)
|
|
|
|
}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
type Props = {
|
|
|
|
currentScroll: number,
|
|
|
|
isAuthenticated: boolean,
|
2020-02-05 15:49:03 +01:00
|
|
|
location: { pathname: string, search: string },
|
2020-01-25 21:37:02 +01:00
|
|
|
history: {
|
|
|
|
entries: { title: string }[],
|
|
|
|
goBack: () => void,
|
|
|
|
goForward: () => void,
|
|
|
|
index: number,
|
|
|
|
length: number,
|
|
|
|
location: { pathname: string },
|
|
|
|
push: string => void,
|
|
|
|
state: {},
|
|
|
|
replaceState: ({}, string, string) => void,
|
|
|
|
},
|
|
|
|
uri: string,
|
|
|
|
title: string,
|
2020-02-19 07:31:40 +01:00
|
|
|
welcomeVersion: number,
|
2019-11-07 20:39:22 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
function AppRouter(props: Props) {
|
2020-02-05 15:49:03 +01:00
|
|
|
const {
|
|
|
|
currentScroll,
|
2020-02-27 20:00:23 +01:00
|
|
|
location: { pathname, search },
|
2020-02-05 15:49:03 +01:00
|
|
|
isAuthenticated,
|
2020-01-25 21:37:02 +01:00
|
|
|
history,
|
|
|
|
uri,
|
|
|
|
title,
|
2020-02-19 07:31:40 +01:00
|
|
|
welcomeVersion,
|
2020-02-05 15:49:03 +01:00
|
|
|
} = props;
|
2020-01-25 21:37:02 +01:00
|
|
|
const { entries } = history;
|
|
|
|
const entryIndex = history.index;
|
2020-02-27 20:00:23 +01:00
|
|
|
const urlParams = new URLSearchParams(search);
|
|
|
|
const resetScroll = urlParams.get('reset_scroll');
|
2020-01-25 21:37:02 +01:00
|
|
|
|
|
|
|
useEffect(() => {
|
2020-02-13 02:48:28 +01:00
|
|
|
if (uri) {
|
|
|
|
const { channelName, streamName } = parseURI(uri);
|
|
|
|
|
|
|
|
if (typeof title !== 'undefined' && title !== '') {
|
|
|
|
document.title = title;
|
|
|
|
} else if (streamName) {
|
|
|
|
document.title = streamName;
|
|
|
|
} else if (channelName) {
|
|
|
|
document.title = channelName;
|
|
|
|
} else {
|
|
|
|
document.title = IS_WEB ? SITE_TITLE : 'LBRY';
|
|
|
|
}
|
2020-01-25 21:37:02 +01:00
|
|
|
} else {
|
|
|
|
document.title = IS_WEB ? SITE_TITLE : 'LBRY';
|
|
|
|
}
|
|
|
|
|
2020-01-26 04:40:30 +01:00
|
|
|
// @if TARGET='app'
|
2020-01-25 21:37:02 +01:00
|
|
|
entries[entryIndex].title = document.title;
|
2020-01-26 04:40:30 +01:00
|
|
|
// @endif
|
2020-01-25 21:37:02 +01:00
|
|
|
return () => {
|
|
|
|
document.title = IS_WEB ? SITE_TITLE : 'LBRY';
|
|
|
|
};
|
2020-02-13 02:48:28 +01:00
|
|
|
}, [entries, entryIndex, title, uri]);
|
2019-11-07 20:39:22 +01:00
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
window.scrollTo(0, currentScroll);
|
2020-02-27 20:00:23 +01:00
|
|
|
}, [currentScroll, pathname, resetScroll]);
|
2019-11-07 20:39:22 +01:00
|
|
|
|
2020-01-29 21:21:03 +01:00
|
|
|
// react-router doesn't decode pathanmes before doing the route matching check
|
|
|
|
// We have to redirect here because if we redirect on the server, it might get encoded again
|
|
|
|
// in the browser causing a redirect loop
|
2020-03-31 22:35:33 +02:00
|
|
|
const decodedUrl = decodeURIComponent(pathname) + search;
|
2020-03-30 22:47:07 +02:00
|
|
|
if (decodedUrl !== pathname + search) {
|
|
|
|
return <Redirect to={decodedUrl} />;
|
2020-01-29 21:21:03 +01:00
|
|
|
}
|
|
|
|
|
2019-11-07 20:39:22 +01:00
|
|
|
return (
|
2019-12-02 18:30:08 +01:00
|
|
|
<Switch>
|
2020-02-19 07:31:40 +01:00
|
|
|
{/* @if TARGET='app' */}
|
|
|
|
{welcomeVersion < WELCOME_VERSION && <Route path="/*" component={Welcome} />}
|
|
|
|
{/* @endif */}
|
2020-02-26 19:39:03 +01:00
|
|
|
|
2020-02-26 20:14:10 +01:00
|
|
|
<Redirect
|
|
|
|
from={`/$/${PAGES.DEPRECATED__CHANNELS_FOLLOWING_MANAGE}`}
|
|
|
|
to={`/$/${PAGES.CHANNELS_FOLLOWING_DISCOVER}`}
|
|
|
|
/>
|
|
|
|
<Redirect from={`/$/${PAGES.DEPRECATED__CHANNELS_FOLLOWING}`} to={`/$/${PAGES.CHANNELS_FOLLOWING}`} />
|
|
|
|
<Redirect from={`/$/${PAGES.DEPRECATED__TAGS_FOLLOWING}`} to={`/$/${PAGES.TAGS_FOLLOWING}`} />
|
|
|
|
<Redirect from={`/$/${PAGES.DEPRECATED__TAGS_FOLLOWING_MANAGE}`} to={`/$/${PAGES.TAGS_FOLLOWING_MANAGE}`} />
|
2020-02-26 19:39:03 +01:00
|
|
|
|
2020-03-18 19:21:33 +01:00
|
|
|
<Route path={`/`} exact component={HomePage} />
|
2019-12-02 18:30:08 +01:00
|
|
|
<Route path={`/$/${PAGES.DISCOVER}`} exact component={DiscoverPage} />
|
2020-04-13 21:16:07 +02:00
|
|
|
<Route path={`/$/${PAGES.AUTH_SIGNIN}`} exact component={SignInPage} />
|
|
|
|
<Route path={`/$/${PAGES.AUTH_PASSWORD_SET}`} exact component={PasswordSetPage} />
|
|
|
|
<Route path={`/$/${PAGES.AUTH}`} exact component={SignUpPage} />
|
|
|
|
<Route path={`/$/${PAGES.AUTH}/*`} exact component={SignUpPage} />
|
2020-02-19 07:31:40 +01:00
|
|
|
<Route path={`/$/${PAGES.WELCOME}`} exact component={Welcome} />
|
2020-01-02 17:30:27 +01:00
|
|
|
<Route path={`/$/${PAGES.TAGS_FOLLOWING}`} exact component={TagsFollowingPage} />
|
2020-01-02 22:26:43 +01:00
|
|
|
<Route
|
|
|
|
path={`/$/${PAGES.CHANNELS_FOLLOWING}`}
|
|
|
|
exact
|
2020-01-21 17:49:47 +01:00
|
|
|
component={isAuthenticated || !IS_WEB ? ChannelsFollowingPage : DiscoverPage}
|
2020-01-02 22:26:43 +01:00
|
|
|
/>
|
2020-02-17 20:12:28 +01:00
|
|
|
<Route path={`/$/${PAGES.CHANNELS_FOLLOWING_DISCOVER}`} exact component={ChannelsFollowingDiscoverPage} />
|
2019-12-02 18:30:08 +01:00
|
|
|
<Route path={`/$/${PAGES.HELP}`} exact component={HelpPage} />
|
2020-02-21 20:27:54 +01:00
|
|
|
{/* @if TARGET='app' */}
|
2020-02-21 18:23:04 +01:00
|
|
|
<Route path={`/$/${PAGES.BACKUP}`} exact component={BackupPage} />
|
2020-02-21 20:27:54 +01:00
|
|
|
{/* @endif */}
|
2019-12-02 18:30:08 +01:00
|
|
|
<Route path={`/$/${PAGES.AUTH_VERIFY}`} exact component={SignInVerifyPage} />
|
|
|
|
<Route path={`/$/${PAGES.SEARCH}`} exact component={SearchPage} />
|
2020-02-11 20:04:51 +01:00
|
|
|
<Route path={`/$/${PAGES.TOP}`} exact component={TopPage} />
|
2019-12-02 18:30:08 +01:00
|
|
|
<Route path={`/$/${PAGES.SETTINGS}`} exact component={SettingsPage} />
|
2020-01-14 21:44:07 +01:00
|
|
|
<Route path={`/$/${PAGES.INVITE}/:referrer`} exact component={InvitedPage} />
|
2019-11-07 20:39:22 +01:00
|
|
|
|
2019-12-02 18:30:08 +01:00
|
|
|
<PrivateRoute {...props} path={`/$/${PAGES.INVITE}`} component={InvitePage} />
|
|
|
|
<PrivateRoute {...props} path={`/$/${PAGES.DOWNLOADED}`} component={FileListDownloaded} />
|
|
|
|
<PrivateRoute {...props} path={`/$/${PAGES.PUBLISHED}`} component={FileListPublished} />
|
2020-03-18 18:11:37 +01:00
|
|
|
<PrivateRoute {...props} path={`/$/${PAGES.CREATOR_DASHBOARD}`} component={CreatorDashboard} />
|
2019-12-02 18:30:08 +01:00
|
|
|
<PrivateRoute {...props} path={`/$/${PAGES.PUBLISH}`} component={PublishPage} />
|
|
|
|
<PrivateRoute {...props} path={`/$/${PAGES.REPORT}`} component={ReportPage} />
|
2020-04-13 22:03:44 +02:00
|
|
|
<PrivateRoute {...props} path={`/$/${PAGES.REWARDS}`} exact component={RewardsPage} />
|
|
|
|
<PrivateRoute {...props} path={`/$/${PAGES.REWARDS_VERIFY}`} component={RewardsVerifyPage} />
|
2019-12-02 18:30:08 +01:00
|
|
|
<PrivateRoute {...props} path={`/$/${PAGES.LIBRARY}`} component={LibraryPage} />
|
2020-01-02 23:43:09 +01:00
|
|
|
<PrivateRoute {...props} path={`/$/${PAGES.TAGS_FOLLOWING_MANAGE}`} component={TagsFollowingManagePage} />
|
2019-12-02 18:30:08 +01:00
|
|
|
<PrivateRoute {...props} path={`/$/${PAGES.BLOCKED}`} component={ListBlockedPage} />
|
|
|
|
<PrivateRoute {...props} path={`/$/${PAGES.WALLET}`} exact component={WalletPage} />
|
|
|
|
<PrivateRoute {...props} path={`/$/${PAGES.CHANNELS}`} component={ChannelsPage} />
|
2019-11-07 20:39:22 +01:00
|
|
|
|
2019-12-30 20:54:53 +01:00
|
|
|
<Route path={`/$/${PAGES.EMBED}/:claimName`} exact component={EmbedWrapperPage} />
|
|
|
|
<Route path={`/$/${PAGES.EMBED}/:claimName/:claimId`} exact component={EmbedWrapperPage} />
|
|
|
|
|
2019-12-02 18:30:08 +01:00
|
|
|
{/* Below need to go at the end to make sure we don't match any of our pages first */}
|
|
|
|
<Route path="/:claimName" exact component={ShowPage} />
|
|
|
|
<Route path="/:claimName/:streamName" exact component={ShowPage} />
|
|
|
|
<Route path="/*" component={FourOhFourPage} />
|
|
|
|
</Switch>
|
2019-11-07 20:39:22 +01:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2020-02-05 15:49:03 +01:00
|
|
|
export default withRouter(AppRouter);
|