3 Commits

Author SHA1 Message Date
Ariful Alam
00ceae9337 Rename GitHub Project component 2023-07-28 21:28:22 +06:00
Ariful Alam
3ef0ca3a14 Add definition for projects 2023-07-28 21:21:13 +06:00
Ariful Alam
c0d9eb7aa9 Add new config projects 2023-07-27 13:41:22 +06:00
5 changed files with 135 additions and 75 deletions

View File

@@ -3,11 +3,37 @@
const config = { const config = {
github: { github: {
username: 'arifszn', // Your GitHub org/user name. (Required) username: 'arifszn', // Your GitHub org/user name. (Required)
sortBy: 'stars', // stars | updated },
limit: 10, // How many projects to display. projects: {
exclude: { github: {
forks: false, // Forked projects will not be displayed if set to true. header: 'Github Projects',
projects: [], // These projects will not be displayed. example: ['my-project1', 'my-project2'] display: true, // Display GitHub projects?
sortBy: 'stars', // stars | updated
limit: 10, // How many projects to display.
exclude: {
forks: false, // Forked projects will not be displayed if set to true.
projects: [], // These projects will not be displayed. example: ['my-project1', 'my-project2']
},
},
external: {
header: 'External Projects',
display: true, // Display external projects?
projects: [
{
title: 'Project Name',
description:
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed euismod, nunc ut.',
imageUrl: 'https://via.placeholder.com/250x250',
link: 'https://example.com',
},
{
title: 'Project Name',
description:
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed euismod, nunc ut.',
imageUrl: 'https://via.placeholder.com/250x250',
link: 'https://example.com',
},
],
}, },
}, },
social: { social: {
@@ -87,23 +113,6 @@ const config = {
}, },
], ],
// To hide the `My Projects` section, keep it empty.
externalProjects: [
{
title: 'Project Name',
description:
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed euismod, nunc ut.',
imageUrl: 'https://via.placeholder.com/250x250',
link: 'https://example.com',
},
{
title: 'Project Name',
description:
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed euismod, nunc ut.',
imageUrl: 'https://via.placeholder.com/250x250',
link: 'https://example.com',
},
],
// Display blog posts from your medium or dev account. (Optional) // Display blog posts from your medium or dev account. (Optional)
blog: { blog: {
source: 'dev', // medium | dev source: 'dev', // medium | dev

View File

@@ -9,7 +9,7 @@ import Skill from './skill';
import Experience from './experience'; import Experience from './experience';
import Certification from './certification'; import Certification from './certification';
import Education from './education'; import Education from './education';
import Project from './project'; import GitHubProject from './github-project';
import Blog from './blog'; import Blog from './blog';
import Footer from './footer'; import Footer from './footer';
import { import {
@@ -77,15 +77,15 @@ const GitProfile = ({ config }) => {
return; return;
} }
sanitizedConfig.github.exclude.projects.forEach((project) => { sanitizedConfig.projects.github.exclude.projects.forEach((project) => {
excludeRepo += `+-repo:${sanitizedConfig.github.username}/${project}`; excludeRepo += `+-repo:${sanitizedConfig.github.username}/${project}`;
}); });
let query = `user:${ let query = `user:${
sanitizedConfig.github.username sanitizedConfig.github.username
}+fork:${!sanitizedConfig.github.exclude.forks}${excludeRepo}`; }+fork:${!sanitizedConfig.projects.github.exclude.forks}${excludeRepo}`;
let url = `https://api.github.com/search/repositories?q=${query}&sort=${sanitizedConfig.github.sortBy}&per_page=${sanitizedConfig.github.limit}&type=Repositories`; let url = `https://api.github.com/search/repositories?q=${query}&sort=${sanitizedConfig.projects.github.sortBy}&per_page=${sanitizedConfig.projects.github.limit}&type=Repositories`;
axios axios
.get(url, { .get(url, {
@@ -197,7 +197,7 @@ const GitProfile = ({ config }) => {
</div> </div>
<div className="lg:col-span-2 col-span-1"> <div className="lg:col-span-2 col-span-1">
<div className="grid grid-cols-1 gap-6"> <div className="grid grid-cols-1 gap-6">
<Project <GitHubProject
repo={repo} repo={repo}
loading={loading} loading={loading}
github={sanitizedConfig.github} github={sanitizedConfig.github}
@@ -236,13 +236,31 @@ GitProfile.propTypes = {
config: PropTypes.shape({ config: PropTypes.shape({
github: PropTypes.shape({ github: PropTypes.shape({
username: PropTypes.string.isRequired, username: PropTypes.string.isRequired,
sortBy: PropTypes.oneOf(['stars', 'updated']),
limit: PropTypes.number,
exclude: PropTypes.shape({
forks: PropTypes.bool,
projects: PropTypes.array,
}),
}).isRequired, }).isRequired,
projects: {
github: PropTypes.shape({
header: PropTypes.string,
display: PropTypes.bool,
sortBy: PropTypes.oneOf(['stars', 'updated']),
limit: PropTypes.number,
exclude: PropTypes.shape({
forks: PropTypes.bool,
projects: PropTypes.array,
}),
}),
projects: PropTypes.shape({
header: PropTypes.string,
display: PropTypes.bool,
projects: PropTypes.arrayOf(
PropTypes.shape({
title: PropTypes.string.isRequired,
description: PropTypes.string.isRequired,
link: PropTypes.string.isRequired,
imageUrl: PropTypes.string,
})
),
}),
},
social: PropTypes.shape({ social: PropTypes.shape({
linkedin: PropTypes.string, linkedin: PropTypes.string,
twitter: PropTypes.string, twitter: PropTypes.string,
@@ -265,14 +283,6 @@ GitProfile.propTypes = {
fileUrl: PropTypes.string, fileUrl: PropTypes.string,
}), }),
skills: PropTypes.array, skills: PropTypes.array,
externalProjects: PropTypes.arrayOf(
PropTypes.shape({
title: PropTypes.string.isRequired,
description: PropTypes.string.isRequired,
link: PropTypes.string.isRequired,
imageUrl: PropTypes.string,
})
),
experiences: PropTypes.arrayOf( experiences: PropTypes.arrayOf(
PropTypes.shape({ PropTypes.shape({
company: PropTypes.string, company: PropTypes.string,

View File

@@ -4,7 +4,7 @@ import { AiOutlineFork, AiOutlineStar } from 'react-icons/ai';
import { MdInsertLink } from 'react-icons/md'; import { MdInsertLink } from 'react-icons/md';
import { ga, languageColor, skeleton } from '../../helpers/utils'; import { ga, languageColor, skeleton } from '../../helpers/utils';
const Project = ({ repo, loading, github, googleAnalytics }) => { const GitHubProject = ({ repo, loading, github, googleAnalytics }) => {
if (!loading && Array.isArray(repo) && repo.length === 0) { if (!loading && Array.isArray(repo) && repo.length === 0) {
return <></>; return <></>;
} }
@@ -166,11 +166,11 @@ const Project = ({ repo, loading, github, googleAnalytics }) => {
); );
}; };
Project.propTypes = { GitHubProject.propTypes = {
repo: PropTypes.array, repo: PropTypes.array,
loading: PropTypes.bool.isRequired, loading: PropTypes.bool.isRequired,
github: PropTypes.object.isRequired, github: PropTypes.object.isRequired,
googleAnalytics: PropTypes.object.isRequired, googleAnalytics: PropTypes.object.isRequired,
}; };
export default Project; export default GitHubProject;

View File

@@ -137,11 +137,22 @@ export const sanitizeConfig = (config) => {
return { return {
github: { github: {
username: config?.github?.username || '', username: config?.github?.username || '',
sortBy: config?.github?.sortBy || 'stars', },
limit: config?.github?.limit || 8, projects: {
exclude: { github: {
forks: config?.github?.exclude?.forks || false, header: config?.projects?.github?.header || 'GitHub Projects',
projects: config?.github?.exclude?.projects || [], display: config?.projects?.github?.display || true,
sortBy: config?.projects?.github?.sortBy || 'stars',
limit: config?.projects?.github?.limit || 8,
exclude: {
forks: config?.projects?.github?.exclude?.forks || false,
projects: config?.projects?.github?.exclude?.projects || [],
},
},
external: {
header: config?.projects?.external?.header || 'External Projects',
display: config?.projects?.external?.display || true,
projects: config?.projects?.external?.projects || [],
}, },
}, },
social: { social: {
@@ -166,7 +177,6 @@ export const sanitizeConfig = (config) => {
fileUrl: config?.resume?.fileUrl || '', fileUrl: config?.resume?.fileUrl || '',
}, },
skills: config?.skills || [], skills: config?.skills || [],
externalProjects: config?.externalProjects || [],
experiences: config?.experiences || [], experiences: config?.experiences || [],
certifications: config?.certifications || [], certifications: config?.certifications || [],
education: config?.education || [], education: config?.education || [],

81
types/index.d.ts vendored
View File

@@ -9,32 +9,63 @@ export interface Github {
* GitHub org/user name * GitHub org/user name
*/ */
username: string; username: string;
}
/** export interface Projects {
* stars | updated github: {
*/
sortBy?: string;
/**
* How many projects to display
*/
limit?: number;
/**
* Exclude projects option
*/
exclude?: {
/** /**
* Forked projects will not be displayed if set to true * Header Title
*/ */
forks?: boolean; header?: string;
/** /**
* These projects will not be displayed * Display GitHub projects?
*
* example: ['my-project1', 'my-project2']
*/ */
projects?: Array<string>; display?: boolean;
/**
* stars | updated
*/
sortBy?: string;
/**
* How many projects to display
*/
limit?: number;
/**
* Exclude projects option
*/
exclude?: {
/**
* Forked projects will not be displayed if set to true
*/
forks?: boolean;
/**
* These projects will not be displayed
*
* example: ['my-project1', 'my-project2']
*/
projects?: Array<string>;
};
};
external: {
/**
* Header Title
*/
header?: string;
/**
* Display external projects?
*/
display?: boolean;
/**
* External Projects
*/
projects?: Array<ExternalProjects>;
}; };
} }
@@ -265,6 +296,11 @@ export interface Config {
*/ */
github: Github; github: Github;
/**
* Projects
*/
projects?: Projects;
/** /**
* Social links * Social links
*/ */
@@ -285,11 +321,6 @@ export interface Config {
*/ */
experiences?: Array<Experience>; experiences?: Array<Experience>;
/**
* External Projects
*/
externalProjects?: Array<ExternalProjects>;
/** /**
* Certifications list * Certifications list
*/ */