lbry-desktop/src/renderer/page/channel/view.jsx

116 lines
3.6 KiB
React
Raw Normal View History

2018-03-26 23:32:43 +02:00
// @flow
import React from 'react';
2018-03-26 23:32:43 +02:00
import BusyIndicator from 'component/common/busy-indicator';
import { FormField, FormRow } from 'component/common/form';
import ReactPaginate from 'react-paginate';
import SubscribeButton from 'component/subscribeButton';
2018-03-26 23:32:43 +02:00
import Page from 'component/page';
import FileList from 'component/fileList';
import type { Claim } from 'types/claim';
2017-05-04 05:44:08 +02:00
2018-03-26 23:32:43 +02:00
type Props = {
uri: string,
page: number,
totalPages: number,
fetching: boolean,
params: { page: number },
claim: Claim,
2018-03-26 23:32:43 +02:00
claimsInChannel: Array<{}>,
fetchClaims: (string, number) => void,
fetchClaimCount: string => void,
navigate: (string, {}) => void,
};
class ChannelPage extends React.PureComponent<Props> {
2017-05-13 00:50:51 +02:00
componentDidMount() {
2017-09-08 05:15:05 +02:00
const { uri, page, fetchClaims, fetchClaimCount } = this.props;
2017-07-17 08:06:04 +02:00
2017-09-08 05:15:05 +02:00
fetchClaims(uri, page || 1);
2017-08-24 23:12:23 +02:00
fetchClaimCount(uri);
2017-05-13 00:50:51 +02:00
}
2017-05-04 05:44:08 +02:00
2018-03-26 23:32:43 +02:00
componentWillReceiveProps(nextProps: Props) {
const { page, uri, fetchClaims, fetchClaimCount } = this.props;
2017-07-17 08:06:04 +02:00
2017-09-20 19:12:53 +02:00
if (nextProps.page && page !== nextProps.page) {
2017-09-08 05:15:05 +02:00
fetchClaims(nextProps.uri, nextProps.page);
2017-08-24 23:12:23 +02:00
}
if (nextProps.uri !== uri) {
2017-08-24 23:12:23 +02:00
fetchClaimCount(uri);
}
2017-05-13 00:50:51 +02:00
}
2018-03-26 23:32:43 +02:00
changePage(pageNumber: number) {
2017-09-20 16:57:43 +02:00
const { params } = this.props;
2017-07-17 08:06:04 +02:00
const newParams = Object.assign({}, params, { page: pageNumber });
this.props.navigate('/show', newParams);
2017-05-13 00:50:51 +02:00
}
paginate(e, totalPages) {
// Change page if enter was pressed, and the given page is between
// the first and the last.
if (e.keyCode === 13 && e.target.value > 0 && e.target.value <= totalPages) {
this.changePage(e.target.value);
}
}
2017-05-13 00:50:51 +02:00
render() {
const { fetching, claimsInChannel, claim, page, totalPages } = this.props;
const { name, permanent_url: permanentUrl } = claim;
2017-12-08 21:14:35 +01:00
2017-06-06 23:19:12 +02:00
let contentList;
2017-09-20 19:12:53 +02:00
if (fetching) {
2018-03-26 23:32:43 +02:00
contentList = <BusyIndicator message={__('Fetching content')} />;
2017-09-20 19:12:53 +02:00
} else {
2017-11-24 15:31:05 +01:00
contentList =
claimsInChannel && claimsInChannel.length ? (
2018-04-23 07:49:52 +02:00
<FileList sortByHeight hideFilter fileInfos={claimsInChannel} />
2017-11-24 15:31:05 +01:00
) : (
<span className="empty">{__('No content found.')}</span>
2017-11-24 15:31:05 +01:00
);
2017-05-21 16:42:34 +02:00
}
2017-06-06 23:19:12 +02:00
return (
2018-03-26 23:32:43 +02:00
<Page notContained>
<section className="card__channel-info card__channel-info--large">
<h1>{name}</h1>
<div className="card__actions card__actions--no-margin">
<SubscribeButton uri={permanentUrl} channelName={name} />
2017-06-06 23:19:12 +02:00
</div>
</section>
2018-03-26 23:32:43 +02:00
<section>{contentList}</section>
2017-07-17 08:06:04 +02:00
{(!fetching || (claimsInChannel && claimsInChannel.length)) &&
2017-11-24 15:31:05 +01:00
totalPages > 1 && (
<FormRow verticallyCentered centered>
<ReactPaginate
pageCount={totalPages}
pageRangeDisplayed={2}
previousLabel=""
nextLabel=""
activeClassName="pagination__item--selected"
pageClassName="pagination__item"
previousClassName="pagination__item pagination__item--previous"
nextClassName="pagination__item pagination__item--next"
breakClassName="pagination__item pagination__item--break"
marginPagesDisplayed={2}
onPageChange={e => this.changePage(e.selected + 1)}
initialPage={parseInt(page - 1, 10)}
containerClassName="pagination"
/>
<FormField
className="paginate-channel"
onKeyUp={e => this.paginate(e, totalPages)}
prefix={__('Go to page:')}
type="text"
/>
</FormRow>
2017-11-24 15:31:05 +01:00
)}
2018-03-26 23:32:43 +02:00
</Page>
2017-06-06 23:19:12 +02:00
);
2017-05-13 00:50:51 +02:00
}
2017-05-04 05:44:08 +02:00
}
export default ChannelPage;