Add programming languages to github page

This commit is contained in:
Camerin 2021-09-22 13:59:01 -04:00
parent ec15f5b6f3
commit a435b4d0e7
7 changed files with 124 additions and 10 deletions

33
package-lock.json generated
View File

@ -13,6 +13,7 @@
"@testing-library/user-event": "^12.8.3",
"axios": "^0.21.4",
"history": "^5.0.1",
"memoize": "^0.1.1",
"react": "^17.0.2",
"react-bootstrap-icons": "^1.5.0",
"react-dom": "^17.0.2",
@ -12635,6 +12636,17 @@
"node": ">= 0.6"
}
},
"node_modules/memoize": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/memoize/-/memoize-0.1.1.tgz",
"integrity": "sha1-0mWjRYvlzjvyVJmLMKmVq5FmiiQ=",
"dependencies": {
"tosource": ">=0.1.1"
},
"engines": {
"node": "*"
}
},
"node_modules/memory-fs": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
@ -18916,6 +18928,14 @@
"node": ">=0.6"
}
},
"node_modules/tosource": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/tosource/-/tosource-1.0.0.tgz",
"integrity": "sha1-QtiN0RZhi88A1hBt1URvNCeQL/E=",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/tough-cookie": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
@ -31031,6 +31051,14 @@
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
},
"memoize": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/memoize/-/memoize-0.1.1.tgz",
"integrity": "sha1-0mWjRYvlzjvyVJmLMKmVq5FmiiQ=",
"requires": {
"tosource": ">=0.1.1"
}
},
"memory-fs": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
@ -36034,6 +36062,11 @@
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
"tosource": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/tosource/-/tosource-1.0.0.tgz",
"integrity": "sha1-QtiN0RZhi88A1hBt1URvNCeQL/E="
},
"tough-cookie": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",

View File

@ -8,6 +8,7 @@
"@testing-library/user-event": "^12.8.3",
"axios": "^0.21.4",
"history": "^5.0.1",
"memoize": "^0.1.1",
"react": "^17.0.2",
"react-bootstrap-icons": "^1.5.0",
"react-dom": "^17.0.2",

View File

@ -17,7 +17,22 @@ export const updateEmailBody = (event) => async (dispatch, getState) => {
};
export const toggleContactModal = () => async (dispatch, getState) => {
dispatch({
type: 'TOGGLE_CONTACT_MODAL',
});
};
};
export const getRepoLanguages = (repoName) => async (dispatch, getState) => {
const response = await github.get(`/repos/RaspberryProgramming/${repoName}/languages`); // Request languages for the repo
// Each repo will have it's own object with it's languages
let payload = {};
payload[repoName] = response.data;
dispatch({
type: 'GET_LANGUAGES',
payload: payload,
});
}

View File

@ -1,47 +1,94 @@
import React from 'react';
import { connect } from 'react-redux';
import './css/Github.css';
import {getRepos} from '../actions';
import {getRepos, getRepoLanguages} from '../actions';
import Theater from './Theater';
import space from '../img/space.webp';
import _ from 'lodash';
class Github extends React.Component {
componentDidMount() {
document.title = "Github Repos";
if (!this.props.repos) {
this.props.getRepos();
this.props.getRepos(); // Receive the repos at start
}
}
renderLanguages(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 <div className="language" key={language}>{language}</div>; // Language bubble JSX
});
}
}
renderRepos() {
if (this.props.repos) {
if (this.props.repos) { // If the repos have been received
// Render each repo
const render = this.props.repos.map((repo) =>{
return (
<div className="repo" key={repo.id}>
<a href={repo.html_url} target="_blank" rel="noreferrer" className="title">{repo.name}</a>
<div className="content">
<p className="description">{repo.description ? repo.description : "No Description"}</p>
{
repo.homepage ?
repo.homepage ? // If the repo has a homepage, render a button
<a href={repo.homepage} target="_blank" rel="noreferrer" className="website"> Project Website </a>:
""
}
</div>
<div className="languages">
Languages:
{
this.renderLanguages(repo.name) // Render each language for the repo
}
</div>
</div>
);
});
return <div className="repo-list">{render}</div>;
}
// Return nothing if repos haven't been received
return <div></div>;
}
render() {
if (_.isEmpty(this.props.repoLanguages) && this.props.repos) {
// Attempt to request languages for all repos once the list of repos is received
this.props.repos.map((repo) => {
this.props.getRepoLanguages(repo.name);
return true;
});
}
return (
<div className="Github">
<Theater
title="Github"
description="This is a list of projects that I've uploaded to github.
@ -51,16 +98,18 @@ class Github extends React.Component {
background={space}
extraClasses="peak"
/>
<div>
{this.renderRepos()}
</div>
</div>
);
}
}
const mapStateToProps = (state) => {
return { repos: state.github.repos};
return { repos: state.github.repos, repoLanguages: state.github.repoLanguages};
}
export default connect(mapStateToProps, { getRepos })(Github);
export default connect(mapStateToProps, { getRepos, getRepoLanguages })(Github);

View File

@ -52,4 +52,18 @@
.repo .description {
flex-grow: 1;
padding:10px;
}
.repo .languages {
align-items: center;
display: flex;
flex-direction: row;
padding: 10px;
}
.repo .language {
padding: 5px;
margin-left: 5px;
border-radius: 10px;
background-color: #AAAAAA;
}

View File

@ -1,6 +1,6 @@
.Navigation {
height: 65px;
height: 63px;
display: flex;
flex-direction: row;
background-color: #3F3F4A;

View File

@ -1,7 +1,9 @@
let githubReducer = (state={}, action) => {
let githubReducer = (state={repoLanguages: {}}, action) => {
switch(action.type) {
case 'GET_REPOS':
return { ...state, repos: action.payload };
case 'GET_LANGUAGES':
return {...state, repoLanguages: {...state.repoLanguages, ...action.payload}}
default:
return state;
}