Для этого я создал пользовательский редуктор, nextTokenReducer
, который ищет действие CRUD_GET_LIST_SUCCESS
React Admin, полезной нагрузкой которого является полный ответ от конечной точки AppSync GraphQL. Я могу извлечь значение nextToken
из этого:
import { CRUD_GET_LIST_SUCCESS } from "react-admin";
export default (previousState = null, { type, payload }) => {
if (type === CRUD_GET_LIST_SUCCESS) {
return payload.nextToken;
}
return previousState;
};
Я передал этот пользовательский редуктор компоненту Admin
в моем главном App
компоненте:
import nextTokenReducer from "./reducers/nextTokenReducer";
...
class App extends Component {
...
render() {
const { dataProvider } = this.state;
if (!dataProvider) {
return <div>Loading</div>;
}
return (
<Admin
customReducers={{ nextToken: nextTokenReducer }}
dataProvider={dataProvider}
>
<Resource name="packs" list={PackList} />
</Admin>
);
}
}
Затем я подключил хранилище nextToken
к своему пользовательскому компоненту нумерации страниц. Он будет отображать «следующий», «предыдущий» или ничего, в зависимости от того, находится ли nextToken
в его реквизитах:
import React from "react";
import Button from "@material-ui/core/Button";
import ChevronLeft from "@material-ui/icons/ChevronLeft";
import ChevronRight from "@material-ui/icons/ChevronRight";
import Toolbar from "@material-ui/core/Toolbar";
import { connect } from "react-redux";
class CustomPagination extends React.Component {
render() {
if (this.props.page === 1 && !this.props.nextToken) {
return null;
}
return (
<Toolbar>
{this.props.page > 1 && (
<Button
color="primary"
key="prev"
icon={<ChevronLeft />}
onClick={() => this.props.setPage(this.props.page - 1)}
>
Prev
</Button>
)}
{this.props.nextToken && (
<Button
color="primary"
key="next"
icon={<ChevronRight />}
onClick={() => this.props.setPage(this.props.page + 1)}
labelposition="before"
>
Next
</Button>
)}
</Toolbar>
);
}
}
const mapStateToProps = state => ({ nextToken: state.nextToken });
export default connect(mapStateToProps)(CustomPagination);
Наконец, я передал пользовательский компонент нумерации страниц в свой компонент списка:
import React from "react";
import { List, Datagrid, DateField, TextField, EditButton } from "react-admin";
import CustomPagination from "./pagination";
export const PackList = props => (
<List {...props} pagination={<CustomPagination />}>
<Datagrid>
...
</Datagrid>
</List>
);