import { withStyles } from '@material-ui/core/styles';
import Table from '@material-ui/core/Table/Table';
import TableBody from '@material-ui/core/TableBody/TableBody';
import TablePagination from '@material-ui/core/TablePagination/TablePagination';
import React from 'react';
import BugRow from './BugRow';
const styles = theme => ({
main: {
maxWidth: 600,
margin: 'auto',
marginTop: theme.spacing.unit * 4,
},
});
class List extends React.Component {
props: {
bugs: Array,
fetchMore: any => any,
classes: any,
};
state = {
page: 0,
rowsPerPage: 10,
lastQuery: {},
};
handleChangePage = (event, page) => {
const { bugs, fetchMore } = this.props;
const { rowsPerPage } = this.state;
const pageInfo = bugs.pageInfo;
if (page === this.state.page + 1) {
if (!pageInfo.hasNextPage) {
return;
}
const variables = {
after: pageInfo.endCursor,
first: rowsPerPage,
};
fetchMore({
variables,
updateQuery: this.updateQuery,
});
this.setState({ page, lastQuery: variables });
return;
}
if (page === this.state.page - 1) {
if (!pageInfo.hasPreviousPage) {
return;
}
const variables = {
before: pageInfo.startCursor,
last: rowsPerPage,
};
fetchMore({
variables,
updateQuery: this.updateQuery,
});
this.setState({ page, lastQuery: variables });
return;
}
throw new Error('non neighbour page pagination is not supported');
};
handleChangeRowsPerPage = event => {
const { fetchMore } = this.props;
const { lastQuery } = this.state;
const rowsPerPage = event.target.value;
const variables = lastQuery;
if (lastQuery.first) {
variables.first = rowsPerPage;
} else if (lastQuery.last) {
variables.last = rowsPerPage;
} else {
variables.first = rowsPerPage;
}
fetchMore({
variables,
updateQuery: this.updateQuery,
});
this.setState({ rowsPerPage, lastQuery: variables });
};
updateQuery = (previousResult, { fetchMoreResult }) => {
return fetchMoreResult ? fetchMoreResult : previousResult;
};
render() {
const { classes, bugs } = this.props;
const { page, rowsPerPage } = this.state;
return (
<main className={classes.main}>
<Table className={classes.table}>
<TableBody>
{bugs.edges.map(({ cursor, node }) => (
<BugRow bug={node} key={cursor} />
))}
</TableBody>
</Table>
<TablePagination
component="div"
count={bugs.totalCount}
rowsPerPage={rowsPerPage}
page={page}
backIconButtonProps={{
'aria-label': 'Previous Page',
}}
nextIconButtonProps={{
'aria-label': 'Next Page',
}}
onChangePage={this.handleChangePage}
onChangeRowsPerPage={this.handleChangeRowsPerPage}
/>
</main>
);
}
}
export default withStyles(styles)(List);