#M2#A68 - Adicionando parâmetros de paginação para os repositórios
Precisamos separar os estados das páginas para cada tipo de repositório para quando trocarmos as páginas fiquem independentes. Assim trocamos o array repos
por objeto repos
para sempre guardar essa informacões e o estado inicial da pagina ativa e total serão 1
class App extends Component {
constructor () {
super()
this.state = {
userinfo: null,
repos: [],
starred: [],
isFetching: false
}
...
}
class App extends Component {
constructor () {
super()
this.state = {
userinfo: null,
repos: {
repos: [],
pagination: {
total: 1,
activePage: 1
}
},
starred: {
repos: [],
pagination: {
total: 1,
activePage: 1
}
},
isFetching: false
}
...
}
Antes repos e starred eram arrays e agora passaram a virar objetos. Nessa funcão é necessários zerarmos sempre essas popriedades então alteramos ela para:
if (keyCode === ENTER) {
this.setState({ isFetching: true })
ajax().get(this.getGithubApiUrl(value))
.then((result) => {
this.setState({
userinfo: {
username: result.name,
photo: result.avatar_url,
login: result.login,
repos: result.public_repos,
followers: result.followers,
following: result.following
},
repos: {}, // alteramos aqui
starred: {} // alteramos aqui
})
})
Aqui repos
era um array:
...
.then((result) => {
this.setState({
[type]: result.map((repo) => ({
name: repo.name,
link: repo.html_url
}))
})
})
...
Agora alteramos para objeto
...
.then((result) => {
this.setState({
[type]: {
repos: result.map((repo) => ({
name: repo.name,
link: repo.html_url
})),
pagination: this.state[type].pagination
}
})
})
Antes repos era um array e checavamos se tinha algo assim repos.length
mais agora como se transformou em um objeto e precisamos alterar sua chamada para repos.repos.length
sendo assim conseguirmos utilizar a propriedade length
...
<div className='repos-container'>
{!!repos.repos.length &&
<Repos
clasName='repos'
title='Repositórios:'
repos={repos}
handlePagination={(clicked) => handlePagination('repos', clicked)}
/>
}
{!!starred.repos.length &&
<Repos
clasName='starred'
title='Favoritos:'
repos={starred}
handlePagination={(clicked) => handlePagination(`starred`, clicked)}
/>
}
</div>
...
AppContent.propTypes = {
...
repos: PropTypes.object.isRequired,
starred: PropTypes.object.isRequired,
...
}
Como vamos ter um estado inicial e teremos que zera sempre ele quando fizermos uma nova busca, vamos criar uma referência, passar ela no ponto inicial e zerar antes de fazer uma busca.
Criando referência
const initialReposState = {
repos: [],
pagination: {}
}
Passando inicialmente
class App extends Component {
constructor () {
super()
this.state = {
userinfo: null,
repos: initialReposState,
starred: initialReposState,
isFetching: false
}
...
Zerando quando realizamos uma nova busca
handleSearch (e) {
...
this.setState({
userinfo: {
username: result.name,
photo: result.avatar_url,
login: result.login,
repos: result.public_repos,
followers: result.followers,
following: result.following
},
repos: initialReposState,
starred: initialReposState
})
})
...
}