e3c2919373
language and API consts improve customization custom homepages get config from .env.default custom title and logo small changes add pinned item to sidebar rebase?
256 lines
7.8 KiB
JavaScript
256 lines
7.8 KiB
JavaScript
// @flow
|
|
import * as PAGES from 'constants/pages';
|
|
import * as ICONS from 'constants/icons';
|
|
import React from 'react';
|
|
import { withRouter } from 'react-router';
|
|
import Button from 'component/button';
|
|
import Tag from 'component/tag';
|
|
import StickyBox from 'react-sticky-box/dist/esnext';
|
|
import Spinner from 'component/spinner';
|
|
import usePersistedState from 'effects/use-persisted-state';
|
|
import classnames from 'classnames';
|
|
import { PINNED_LABEL_1, PINNED_URI_1, PINNED_URI_2, PINNED_LABEL_2 } from 'config';
|
|
// @if TARGET='web'
|
|
// import Ads from 'web/component/ads';
|
|
// @endif
|
|
|
|
const SHOW_CHANNELS = 'SHOW_CHANNELS';
|
|
const SHOW_TAGS = 'SHOW_TAGS';
|
|
|
|
type Props = {
|
|
subscriptions: Array<Subscription>,
|
|
followedTags: Array<Tag>,
|
|
email: ?string,
|
|
uploadCount: number,
|
|
sticky: boolean,
|
|
expanded: boolean,
|
|
doSignOut: () => void,
|
|
location: { pathname: string },
|
|
purchaseSuccess: boolean,
|
|
doClearPurchasedUriSuccess: () => void,
|
|
};
|
|
|
|
function SideNavigation(props: Props) {
|
|
const {
|
|
subscriptions,
|
|
followedTags,
|
|
uploadCount,
|
|
doSignOut,
|
|
email,
|
|
sticky = true,
|
|
expanded = false,
|
|
location,
|
|
purchaseSuccess,
|
|
doClearPurchasedUriSuccess,
|
|
} = props;
|
|
const { pathname } = location;
|
|
const isAuthenticated = Boolean(email);
|
|
const [pulseLibrary, setPulseLibrary] = React.useState(false);
|
|
const [sideInformation, setSideInformation] = usePersistedState(
|
|
'side-navigation:information',
|
|
getSideInformation(pathname)
|
|
);
|
|
|
|
const isPersonalized = !IS_WEB || isAuthenticated;
|
|
const requireAuthOnPersonalizedActions = IS_WEB;
|
|
|
|
function getSideInformation(path) {
|
|
switch (path) {
|
|
case `/$/${PAGES.CHANNELS_FOLLOWING}`:
|
|
return SHOW_CHANNELS;
|
|
|
|
case `/$/${PAGES.TAGS_FOLLOWING}`:
|
|
return SHOW_TAGS;
|
|
|
|
default:
|
|
return sideInformation;
|
|
}
|
|
}
|
|
|
|
React.useEffect(() => {
|
|
const sideInfo = getSideInformation(pathname);
|
|
setSideInformation(sideInfo);
|
|
}, [pathname, setSideInformation]);
|
|
|
|
React.useEffect(() => {
|
|
if (purchaseSuccess) {
|
|
setPulseLibrary(true);
|
|
|
|
let timeout = setTimeout(() => {
|
|
setPulseLibrary(false);
|
|
doClearPurchasedUriSuccess();
|
|
}, 2500);
|
|
|
|
return () => clearTimeout(timeout);
|
|
}
|
|
}, [setPulseLibrary, purchaseSuccess, doClearPurchasedUriSuccess]);
|
|
|
|
function buildLink(path, label, icon, onClick, requiresAuth = false, isLiteral = false) {
|
|
return {
|
|
navigate: !isLiteral ? `$/${path}` : `${path}`,
|
|
label,
|
|
icon,
|
|
onClick,
|
|
requiresAuth,
|
|
};
|
|
}
|
|
|
|
const Wrapper = ({ children }: any) =>
|
|
sticky ? (
|
|
<StickyBox offsetTop={100} offsetBottom={20}>
|
|
{children}
|
|
</StickyBox>
|
|
) : (
|
|
<div>{children}</div>
|
|
);
|
|
|
|
return (
|
|
<Wrapper>
|
|
<nav className="navigation">
|
|
<ul className="navigation-links">
|
|
{[
|
|
{
|
|
...(expanded && !isAuthenticated ? { ...buildLink(PAGES.AUTH, __('Sign Up'), ICONS.SIGN_UP) } : {}),
|
|
},
|
|
{
|
|
...(expanded && !isAuthenticated
|
|
? { ...buildLink(PAGES.AUTH_SIGNIN, __('Sign In'), ICONS.SIGN_IN) }
|
|
: {}),
|
|
},
|
|
{
|
|
...buildLink('/', __('Home'), ICONS.HOME, null, null, true),
|
|
},
|
|
{
|
|
...buildLink(
|
|
PAGES.CHANNELS_FOLLOWING,
|
|
__('Following'),
|
|
ICONS.SUBSCRIBE,
|
|
null,
|
|
requireAuthOnPersonalizedActions
|
|
),
|
|
},
|
|
{
|
|
...buildLink(PAGES.TAGS_FOLLOWING, __('Your Tags'), ICONS.TAG, null, requireAuthOnPersonalizedActions),
|
|
},
|
|
{
|
|
...buildLink(PAGES.DISCOVER, __('All Content'), ICONS.DISCOVER),
|
|
},
|
|
{
|
|
...buildLink(PAGES.LIBRARY, __('Library'), ICONS.LIBRARY),
|
|
},
|
|
// @if TARGET='web'
|
|
{
|
|
...(PINNED_URI_1
|
|
? { ...buildLink(`${PINNED_URI_1}`, `${PINNED_LABEL_1}`, ICONS.PINNED, null, null, true) }
|
|
: {}),
|
|
},
|
|
{
|
|
...(PINNED_URI_2
|
|
? { ...buildLink(`${PINNED_URI_2}`, `${PINNED_LABEL_2}`, ICONS.PINNED, null, null, true) }
|
|
: {}),
|
|
},
|
|
// @endif
|
|
{
|
|
...(expanded ? { ...buildLink(PAGES.SETTINGS, __('Settings'), ICONS.SETTINGS) } : {}),
|
|
},
|
|
].map(
|
|
linkProps =>
|
|
linkProps.navigate && (
|
|
<li key={linkProps.navigate}>
|
|
<Button
|
|
{...linkProps}
|
|
icon={pulseLibrary && linkProps.icon === ICONS.LIBRARY ? ICONS.PURCHASED : linkProps.icon}
|
|
className={classnames('navigation-link', {
|
|
'navigation-link--pulse': linkProps.icon === ICONS.LIBRARY && pulseLibrary,
|
|
})}
|
|
activeClass="navigation-link--active"
|
|
/>
|
|
</li>
|
|
)
|
|
)}
|
|
|
|
{expanded &&
|
|
isPersonalized &&
|
|
[
|
|
{
|
|
...buildLink(PAGES.CHANNELS, __('Channels'), ICONS.CHANNEL),
|
|
},
|
|
{
|
|
...buildLink(
|
|
PAGES.PUBLISHED,
|
|
uploadCount ? (
|
|
<span>
|
|
{__('Publishes')}
|
|
<Spinner type="small" />
|
|
</span>
|
|
) : (
|
|
__('Publishes')
|
|
),
|
|
ICONS.PUBLISH
|
|
),
|
|
},
|
|
{
|
|
...buildLink(PAGES.CREATOR_DASHBOARD, __('Creator Analytics'), ICONS.ANALYTICS),
|
|
},
|
|
{
|
|
...buildLink(PAGES.WALLET, __('Wallet'), ICONS.WALLET),
|
|
},
|
|
{
|
|
...buildLink(PAGES.REWARDS, __('Rewards'), ICONS.REWARDS),
|
|
},
|
|
{
|
|
...buildLink(PAGES.INVITE, __('Invites'), ICONS.INVITE),
|
|
},
|
|
{
|
|
...buildLink(PAGES.PUBLISH, __('Publish'), ICONS.PUBLISH),
|
|
},
|
|
{
|
|
...buildLink(PAGES.HELP, __('Help'), ICONS.HELP),
|
|
},
|
|
{
|
|
...(isAuthenticated ? { ...buildLink(PAGES.AUTH, __('Sign Out'), ICONS.SIGN_OUT, doSignOut) } : {}),
|
|
},
|
|
].map(
|
|
linkProps =>
|
|
Object.keys(linkProps).length > 0 &&
|
|
linkProps && (
|
|
<li key={linkProps.navigate}>
|
|
<Button {...linkProps} className="navigation-link" activeClass="navigation-link--active" />
|
|
</li>
|
|
)
|
|
)}
|
|
</ul>
|
|
|
|
{sideInformation === SHOW_TAGS && !expanded && isPersonalized && (
|
|
<ul className="navigation__secondary navigation-links--small tags--vertical">
|
|
{followedTags.map(({ name }, key) => (
|
|
<li className="navigation-link__wrapper" key={name}>
|
|
<Tag navigate={`/$/tags?t${name}`} name={name} />
|
|
</li>
|
|
))}
|
|
</ul>
|
|
)}
|
|
|
|
{sideInformation === SHOW_CHANNELS && !expanded && isPersonalized && (
|
|
<ul className="navigation__secondary navigation-links--small">
|
|
{subscriptions.map(({ uri, channelName }, index) => (
|
|
<li key={uri} className="navigation-link__wrapper">
|
|
<Button
|
|
navigate={uri}
|
|
label={channelName}
|
|
className="navigation-link"
|
|
activeClass="navigation-link--active"
|
|
/>
|
|
</li>
|
|
))}
|
|
</ul>
|
|
)}
|
|
</nav>
|
|
// @if TARGET='web'
|
|
{/* {!isAuthenticated && !expanded && <Ads />} commenting out sidebar ads for test */}
|
|
// @endif
|
|
</Wrapper>
|
|
);
|
|
}
|
|
|
|
export default withRouter(SideNavigation);
|