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 (
{bugs.edges.map(({ cursor, node }) => ( ))}
); } } export default withStyles(styles)(List);