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);