Adds a Certifications section

This commit is contained in:
Nate Goldsborough
2022-11-01 00:36:23 -05:00
parent cdb3542844
commit 9e34239877
5 changed files with 123 additions and 0 deletions

View File

@@ -59,6 +59,13 @@ const config = {
companyLink: 'https://example.com', companyLink: 'https://example.com',
}, },
], ],
certifications: [
{
body: 'Certification Body Name',
name: 'My Sample Certification',
year: 'March 2022',
},
],
education: [ education: [
{ {
institution: 'Institution Name', institution: 'Institution Name',

View File

@@ -7,6 +7,7 @@ import AvatarCard from './avatar-card';
import Details from './details'; import Details from './details';
import Skill from './skill'; import Skill from './skill';
import Experience from './experience'; import Experience from './experience';
import Certifications from './certifications';
import Education from './education'; import Education from './education';
import Project from './project'; import Project from './project';
import Blog from './blog'; import Blog from './blog';
@@ -183,6 +184,10 @@ const GitProfile = ({ config }) => {
loading={loading} loading={loading}
experiences={sanitizedConfig.experiences} experiences={sanitizedConfig.experiences}
/> />
<Certifications
loading={loading}
certifications={sanitizedConfig.certifications}
/>
<Education <Education
loading={loading} loading={loading}
education={sanitizedConfig.education} education={sanitizedConfig.education}
@@ -272,6 +277,13 @@ GitProfile.propTypes = {
to: PropTypes.string, to: PropTypes.string,
}) })
), ),
certifications: PropTypes.arrayOf(
PropTypes.shape({
body: PropTypes.string,
name: PropTypes.string,
year: PropTypes.string,
})
),
education: PropTypes.arrayOf( education: PropTypes.arrayOf(
PropTypes.shape({ PropTypes.shape({
institution: PropTypes.string, institution: PropTypes.string,

View File

@@ -0,0 +1,93 @@
import { skeleton } from '../../helpers/utils';
import { Fragment } from 'react';
import PropTypes from 'prop-types';
const ListItem = ({ year, name, body }) => (
<li className="mb-5 ml-4">
<div
className="absolute w-2 h-2 bg-base-300 rounded-full border border-base-300 mt-1.5"
style={{ left: '-4.5px' }}
></div>
<div className="my-0.5 text-xs">{year}</div>
<h3 className="font-semibold">{name}</h3>
<div className="mb-4 font-normal">{body}</div>
</li>
);
const Certifications = ({ certifications, loading }) => {
const renderSkeleton = () => {
let array = [];
for (let index = 0; index < 2; index++) {
array.push(
<ListItem
key={index}
year={skeleton({
width: 'w-5/12',
height: 'h-4',
})}
name={skeleton({
width: 'w-6/12',
height: 'h-4',
className: 'my-1.5',
})}
body={skeleton({ width: 'w-6/12', height: 'h-3' })}
/>
);
}
return array;
};
return (
<>
{certifications?.length !== 0 && (
<div className="card shadow-lg compact bg-base-100">
<div className="card-body">
<div className="mx-3">
<h5 className="card-title">
{loading ? (
skeleton({ width: 'w-32', height: 'h-8' })
) : (
<span className="text-base-content opacity-70">
Certifications
</span>
)}
</h5>
</div>
<div className="text-base-content text-opacity-60">
<ol className="relative border-l border-base-300 border-opacity-30 my-2 mx-4">
{loading ? (
renderSkeleton()
) : (
<Fragment>
{certifications.map((certification, index) => (
<ListItem
key={index}
year={`${certification.year}`}
name={certification.name}
body={certification.body}
/>
))}
</Fragment>
)}
</ol>
</div>
</div>
</div>
)}
</>
);
};
ListItem.propTypes = {
year: PropTypes.node,
name: PropTypes.node,
body: PropTypes.node,
};
Certifications.propTypes = {
certifications: PropTypes.array.isRequired,
loading: PropTypes.bool.isRequired,
};
export default Certifications;

View File

@@ -163,6 +163,7 @@ export const sanitizeConfig = (config) => {
}, },
skills: config?.skills || [], skills: config?.skills || [],
experiences: config?.experiences || [], experiences: config?.experiences || [],
certifications: config?.certifications || [],
education: config?.education || [], education: config?.education || [],
blog: { blog: {
source: config?.blog?.source, source: config?.blog?.source,

10
types/index.d.ts vendored
View File

@@ -214,6 +214,11 @@ export interface Experience {
to?: string; to?: string;
companyLink?: string; companyLink?: string;
} }
export interface Certifications {
body?: string;
name?: string;
year?: string;
}
export interface Education { export interface Education {
institution?: string; institution?: string;
@@ -252,6 +257,11 @@ export interface Config {
*/ */
experiences?: Array<Experience>; experiences?: Array<Experience>;
/**
* Certifications list
*/
certifications?: Array<Certifications>;
/** /**
* Education list * Education list
*/ */