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

126 lines
3.9 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';
import ViewOnWebButton from 'component/viewOnWebButton';
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
}
2018-05-31 05:50:12 +02:00
paginate(e, totalPages: number) {
// Change page if enter was pressed, and the given page is between
// the first and the last.
2018-05-31 05:50:12 +02:00
const pageFromInput = Number(e.target.value);
if (
e.keyCode === 13 &&
!Number.isNaN(pageFromInput) &&
pageFromInput > 0 &&
pageFromInput <= totalPages
) {
this.changePage(pageFromInput);
}
}
2017-05-13 00:50:51 +02:00
render() {
2018-05-31 05:50:12 +02:00
const { fetching, claimsInChannel, claim, page, totalPages } = this.props;
const { name, permanent_url: permanentUrl, claim_id: claimId } = claim;
2018-06-21 08:01:19 +02:00
const currentPage = parseInt((page || 1) - 1, 10);
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} />
2018-06-06 21:22:28 +02:00
<ViewOnWebButton claimId={claimId} claimName={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)}
2018-06-21 08:01:19 +02:00
forcePage={currentPage}
initialPage={currentPage}
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;