import React from 'react';
import { connect } from 'react-redux';
import { getRepos, getUser, getRepoLanguages, nextPage, setSortValue } from '../../actions';
import { ToggleButton, Button } from './Buttons';
class GithubRepos extends React.Component {
perPage = 5;
sortOptions = [
// text: displayed text, value: value used for sorting
{text: "Created Date", value: "created_at"},
{text: "Last Pushed", value: "pushed_at"},
{text: "Name", value: "name"},
{text: "Number of Forks", value: "forks"},
{text: "Size", value: "size"},
{text: "Last Updated", value: "updated_at"},
];
componentDidMount() {
document.title = "Github Repos";
if (!this.props.repos) {
this.props.getUser(this.props.username); // Receive the repos at start
this.props.getRepos(this.props.username); // Receive the repos at start
}
}
renderLanguages(name) {
this.props.getRepoLanguages(this.props.username, name);
// Given that we've already received the repo's languages
if (this.props.repoLanguages && this.props.repoLanguages[name]) {
// Create a bubble for each language
return Object.keys(this.props.repoLanguages[name]).map(language=>{
return
{language}
; // Language bubble JSX
});
}
}
roundUp(num) {
return num%1 === 0? num : num-(num%1)+1
}
objArrayBubbleSort(arr, value) {
/**
* arrayBubbleSort
*/
let unsorted;
let tmp;
do {
unsorted = false;
for (let i = 0; i < arr.length-1; i++) {
if (
(value.asc && arr[i][value.value] > arr[i+1][value.value]) // Ascending
|| (!value.asc && arr[i][value.value] < arr[i+1][value.value]) // Descending
) {
tmp = arr[i+1];
arr[i+1] = arr[i];
arr[i] = tmp;
unsorted = true;
}
}
} while (unsorted);
return arr;
}
renderRepos() {
if (this.props.repos) { // If the repos have been received
if (this.props.repos.length > 0) {
// Render each repo
let repos = this.props.single ? [this.props.repos[0]] : this.props.repos
let pages = this.roundUp(repos.length/this.perPage);
let sortedRepos = this.objArrayBubbleSort([...repos], this.props.sortedValue);
const render = sortedRepos.slice(0, this.props.page*this.perPage).map((repo) =>{
let updated = (new Date (repo.updated_at)).toLocaleString();
let created = (new Date (repo.created_at)).toLocaleString();
return (
{repo.name}
{repo.description ? repo.description : "No Description"}
{
repo.homepage ? // If the repo has a homepage, render a button
Project Website :
""
}
Languages:
{
this.renderLanguages(repo.name) // Render each language for the repo
}
Last Updated: {updated}
Created: {created}
);
});
return (
Sort By:
{
console.warn(val);
this.props.setSortValue({
...this.props.sortedValue,
asc: val
});
}} />
{render}
{this.props.page < pages ?
: ""
}
); // display the repo list with the rendered repos
} else {
return User doesn't have any repositories
}
}
// Return nothing if repos haven't been received
return Loading Repositories...
; // Return nothing if repos haven't been collected
}
render = () => {
return ({this.renderRepos()}
);
}
}
const mapStateToProps = (state) => {
return {
repos: state.github.repos,
repoLanguages: state.github.repoLanguages,
page: state.github.page,
sortedValue: state.github.sortedValue
};
}
export default connect(mapStateToProps, {
getRepos,
getRepoLanguages,
getUser,
nextPage,
setSortValue
})(GithubRepos);