2018-03-26 23:32:43 +02:00
|
|
|
// @flow
|
2019-05-07 04:35:04 +02:00
|
|
|
import React from 'react';
|
|
|
|
import { parseURI } from 'lbry-redux';
|
2018-03-26 23:32:43 +02:00
|
|
|
import Page from 'component/page';
|
2019-05-07 04:35:04 +02:00
|
|
|
import SubscribeButton from 'component/subscribeButton';
|
|
|
|
import ShareButton from 'component/shareButton';
|
|
|
|
import { Tabs, TabList, Tab, TabPanels, TabPanel } from 'component/common/tabs';
|
|
|
|
import { withRouter } from 'react-router';
|
|
|
|
import { formatLbryUriForWeb } from 'util/uri';
|
|
|
|
import ChannelContent from 'component/channelContent';
|
|
|
|
import ChannelAbout from 'component/channelAbout';
|
|
|
|
import ChannelThumbnail from 'component/channelThumbnail';
|
|
|
|
|
|
|
|
const PAGE_VIEW_QUERY = `view`;
|
|
|
|
const ABOUT_PAGE = `about`;
|
2017-05-04 05:44:08 +02:00
|
|
|
|
2018-03-26 23:32:43 +02:00
|
|
|
type Props = {
|
|
|
|
uri: string,
|
2019-05-07 04:35:04 +02:00
|
|
|
title: ?string,
|
|
|
|
cover: ?string,
|
|
|
|
thumbnail: ?string,
|
2019-05-14 07:12:24 +02:00
|
|
|
page: number,
|
2019-05-07 04:35:04 +02:00
|
|
|
location: { search: string },
|
2019-04-04 23:05:23 +02:00
|
|
|
history: { push: string => void },
|
2019-05-07 04:35:04 +02:00
|
|
|
match: { params: { attribute: ?string } },
|
2018-03-26 23:32:43 +02:00
|
|
|
};
|
|
|
|
|
2019-03-28 17:53:13 +01:00
|
|
|
function ChannelPage(props: Props) {
|
2019-05-14 07:12:24 +02:00
|
|
|
const { uri, title, cover, history, location, page } = props;
|
2019-05-07 04:35:04 +02:00
|
|
|
const { channelName, claimName, claimId } = parseURI(uri);
|
2019-03-28 17:53:13 +01:00
|
|
|
const { search } = location;
|
|
|
|
const urlParams = new URLSearchParams(search);
|
2019-05-07 04:35:04 +02:00
|
|
|
const currentView = urlParams.get(PAGE_VIEW_QUERY) || undefined;
|
2019-03-28 17:53:13 +01:00
|
|
|
|
2019-05-07 04:35:04 +02:00
|
|
|
// If a user changes tabs, update the url so it stays on the same page if they refresh.
|
|
|
|
// We don't want to use links here because we can't animate the tab change and using links
|
|
|
|
// would alter the Tab label's role attribute, which should stay role="tab" to work with keyboards/screen readers.
|
|
|
|
const tabIndex = currentView === ABOUT_PAGE ? 1 : 0;
|
|
|
|
const onTabChange = newTabIndex => {
|
|
|
|
let url = formatLbryUriForWeb(uri);
|
2019-05-14 07:12:24 +02:00
|
|
|
let search = '?';
|
2019-05-07 04:35:04 +02:00
|
|
|
if (newTabIndex !== 0) {
|
2019-05-14 07:12:24 +02:00
|
|
|
search += `${PAGE_VIEW_QUERY}=${ABOUT_PAGE}`;
|
|
|
|
} else {
|
|
|
|
search += `page=${page}`;
|
2017-08-24 23:12:23 +02:00
|
|
|
}
|
2017-05-13 00:50:51 +02:00
|
|
|
|
2019-05-14 07:12:24 +02:00
|
|
|
history.push(`${url}${search}`);
|
2019-03-28 17:53:13 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
return (
|
2019-05-07 04:35:04 +02:00
|
|
|
<Page notContained className="main--no-padding-top">
|
2019-05-13 08:05:38 +02:00
|
|
|
<header className="channel-cover main__item--extend-outside">
|
|
|
|
{cover && <img className="channel-cover__custom" src={cover} />}
|
2019-03-28 17:53:13 +01:00
|
|
|
|
2019-05-07 04:35:04 +02:00
|
|
|
<div className="channel__primary-info">
|
|
|
|
<ChannelThumbnail uri={uri} />
|
|
|
|
|
|
|
|
<div>
|
|
|
|
<h1 className="channel__title">{title || channelName}</h1>
|
|
|
|
<h2 className="channel__url">
|
|
|
|
{claimName}
|
|
|
|
{claimId && `#${claimId}`}
|
|
|
|
</h2>
|
|
|
|
</div>
|
2019-03-28 17:53:13 +01:00
|
|
|
</div>
|
|
|
|
</header>
|
|
|
|
|
2019-05-07 04:35:04 +02:00
|
|
|
<Tabs onChange={onTabChange} index={tabIndex}>
|
|
|
|
<TabList className="main__item--extend-outside tabs__list--channel-page">
|
|
|
|
<Tab>{__('Content')}</Tab>
|
|
|
|
<Tab>{__('About')}</Tab>
|
|
|
|
<div className="card__actions">
|
|
|
|
<ShareButton uri={uri} />
|
|
|
|
<SubscribeButton uri={uri} />
|
|
|
|
</div>
|
|
|
|
</TabList>
|
2018-12-19 06:44:53 +01:00
|
|
|
|
2019-05-07 04:35:04 +02:00
|
|
|
<TabPanels>
|
|
|
|
<TabPanel>
|
|
|
|
<ChannelContent uri={uri} />
|
|
|
|
</TabPanel>
|
|
|
|
<TabPanel>
|
|
|
|
<ChannelAbout uri={uri} />
|
|
|
|
</TabPanel>
|
|
|
|
</TabPanels>
|
|
|
|
</Tabs>
|
2019-03-28 17:53:13 +01:00
|
|
|
</Page>
|
|
|
|
);
|
2017-05-04 05:44:08 +02:00
|
|
|
}
|
|
|
|
|
2019-04-04 23:05:23 +02:00
|
|
|
export default withRouter(ChannelPage);
|