import React, {FC} from 'react'; // Redux import {compose} from '@reduxjs/toolkit'; import {firestoreConnect} from 'react-redux-firebase'; import {connect} from 'react-redux'; import {RootState} from '../store'; // Routing import {Link, useParams} from 'react-router-dom'; import Routes from '../constants/routes'; import NotFound from './NotFound'; // Style import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import { faGithub, faFacebook, faInstagram, faLinkedin, faTwitter, faYoutube, } from '@fortawesome/free-brands-svg-icons'; import { faGlobe, IconDefinition, faCheck, faStar, faEye, faCodeBranch, } from '@fortawesome/free-solid-svg-icons'; // Typing import IDev, {getDescription} from '../models/Dev'; import Experience from '../types/Experience'; import {getTimePeriod} from '../types/TimePeriod'; import Education from '../types/Education'; import Repo from '../types/Repo'; import asyncGetRepos from '../services/github'; interface IProps { dev: IDev; } /** * Dev personal profile as seen by other people. */ const Profile: FC = ({dev}) => { // display 404 page if dev is null if (dev === null) { return ; } asyncGetRepos(); /** return the icon corresponding to the social name */ const renderSocialIcon = (name: string): IconDefinition => { switch (name) { case 'facebook': return faFacebook; case 'github': return faGithub; case 'instagram': return faInstagram; case 'linkedin': return faLinkedin; case 'twitter': return faTwitter; case 'youtube': return faYoutube; default: return faGlobe; } }; return dev === undefined ? (
Loading ...
) : (
Back to profiles
{dev.displayName}

{dev.displayName}

{getDescription(dev.status, dev.company)}

{dev.location}

{Object.entries(dev.links) .sort() .map(([icon, webAddress], i: number) => ( ))}

{`${dev.displayName}'s Bio`}

{dev.bio.length === 0 ? 'Add a short bio to present yourself!' : dev.bio}

Skill Set

{dev.skills.length === 0 ? 'Let us know about your skills!' : dev.skills?.map((s: string, i: number) => (
{s}
))}

Experiences

{dev.experiences.length === 0 ? (
no experiences
) : ( dev.experiences.map((exp: Experience, i: number) => (

{exp.company}

{getTimePeriod(exp.from, exp.to)}

Position: {exp.position}

Description: {exp.description}

)) )}

Education

{dev.educations.length === 0 ? (
no educations
) : ( dev.educations.map((edu: Education, i: number) => (

{edu.school}

{getTimePeriod(edu.from, edu.to)}

Degree: {edu.degree}

Field: {edu.field}

Description: {edu.description}

)) )}

GitHub Repos

{dev.repos?.length === 0 ? (
no repositories
) : ( dev.repos.map((r: Repo, i: number) => (

{r.name}

{r.description}

  • Stars: 42
  • Watchers: 2
  • Forks: 4
)) )}
); }; /** * Container to fetch id params from thr URI and pass it to Profile page */ const ProfileContainer: FC = () => { const {id} = useParams(); const Component = compose( firestoreConnect(() => [`users/${id}`]), connect(({firestore: {data}}: RootState) => ({ dev: data.users && data.users[id], })), )(Profile); return ; }; export default ProfileContainer;