feat(client, api): Add Camper Join Date to Profile (#38408)

This commit is contained in:
Manish Giri
2020-08-04 03:38:13 -04:00
committed by GitHub
parent 303e228299
commit 08d4811df3
5 changed files with 29 additions and 4 deletions

View File

@ -769,6 +769,7 @@ export default function(User) {
calendar, calendar,
completedChallenges, completedChallenges,
isDonating, isDonating,
joinDate,
location, location,
name, name,
points, points,
@ -813,6 +814,7 @@ export default function(User) {
} }
})(), })(),
isDonating: showDonation ? isDonating : null, isDonating: showDonation ? isDonating : null,
joinDate: showAbout ? joinDate : '',
location: showLocation ? location : '', location: showLocation ? location : '',
name: showName ? name : '', name: showName ? name : '',
points: showPoints ? points : null, points: showPoints ? points : null,
@ -843,7 +845,8 @@ export default function(User) {
points: progressTimestamps.length, points: progressTimestamps.length,
completedChallenges, completedChallenges,
...getProgress(progressTimestamps, timezone), ...getProgress(progressTimestamps, timezone),
...normaliseUserFields(user) ...normaliseUserFields(user),
joinDate: user.id.getTimestamp()
}; };
const publicUser = prepUserForPublish(allUser, profileUI); const publicUser = prepUserForPublish(allUser, profileUI);

View File

@ -39,7 +39,6 @@ function createReadSessionUser(app) {
return function getSessionUser(req, res, next) { return function getSessionUser(req, res, next) {
const queryUser = req.user; const queryUser = req.user;
const source = const source =
queryUser && queryUser &&
Observable.forkJoin( Observable.forkJoin(
@ -75,7 +74,8 @@ function createReadSessionUser(app) {
isLinkedIn: !!user.linkedin, isLinkedIn: !!user.linkedin,
isTwitter: !!user.twitter, isTwitter: !!user.twitter,
isWebsite: !!user.website, isWebsite: !!user.website,
...normaliseUserFields(user) ...normaliseUserFields(user),
joinDate: user.id.getTimestamp()
} }
}, },
sessionMeta, sessionMeta,

View File

@ -37,6 +37,7 @@ const propTypes = {
isLinkedIn: PropTypes.bool, isLinkedIn: PropTypes.bool,
isTwitter: PropTypes.bool, isTwitter: PropTypes.bool,
isWebsite: PropTypes.bool, isWebsite: PropTypes.bool,
joinDate: PropTypes.string,
linkedin: PropTypes.string, linkedin: PropTypes.string,
location: PropTypes.string, location: PropTypes.string,
name: PropTypes.string, name: PropTypes.string,
@ -114,6 +115,7 @@ function renderProfile(user) {
website, website,
name, name,
username, username,
joinDate,
location, location,
points, points,
picture, picture,
@ -133,6 +135,7 @@ function renderProfile(user) {
isLinkedIn={isLinkedIn} isLinkedIn={isLinkedIn}
isTwitter={isTwitter} isTwitter={isTwitter}
isWebsite={isWebsite} isWebsite={isWebsite}
joinDate={showAbout ? joinDate : null}
linkedin={linkedin} linkedin={linkedin}
location={showLocation ? location : null} location={showLocation ? location : null}
name={showName ? name : null} name={showName ? name : null}

View File

@ -32,6 +32,7 @@ const userProps = {
isLinkedIn: true, isLinkedIn: true,
isTwitter: true, isTwitter: true,
isWebsite: true, isWebsite: true,
joinDate: 'string',
linkedin: 'string', linkedin: 'string',
location: 'string', location: 'string',
name: 'string', name: 'string',

View File

@ -2,7 +2,11 @@ import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { Col, Row, Image } from '@freecodecamp/react-bootstrap'; import { Col, Row, Image } from '@freecodecamp/react-bootstrap';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faAward, faHeart } from '@fortawesome/free-solid-svg-icons'; import {
faAward,
faHeart,
faCalendar
} from '@fortawesome/free-solid-svg-icons';
import Identicon from 'react-identicons'; import Identicon from 'react-identicons';
import SocialIcons from './SocialIcons'; import SocialIcons from './SocialIcons';
@ -17,6 +21,7 @@ const propTypes = {
isLinkedIn: PropTypes.bool, isLinkedIn: PropTypes.bool,
isTwitter: PropTypes.bool, isTwitter: PropTypes.bool,
isWebsite: PropTypes.bool, isWebsite: PropTypes.bool,
joinDate: PropTypes.string,
linkedin: PropTypes.string, linkedin: PropTypes.string,
location: PropTypes.string, location: PropTypes.string,
name: PropTypes.string, name: PropTypes.string,
@ -46,6 +51,13 @@ function joinArray(array) {
}); });
} }
function parseDate(joinDate) {
joinDate = new Date(joinDate);
const year = joinDate.getFullYear();
const month = joinDate.toLocaleString('en-US', { month: 'long' });
return `Joined ${month} ${year}`;
}
function Camper({ function Camper({
name, name,
username, username,
@ -60,6 +72,7 @@ function Camper({
isGithub, isGithub,
isTwitter, isTwitter,
isWebsite, isWebsite,
joinDate,
linkedin, linkedin,
twitter, twitter,
website website
@ -110,6 +123,11 @@ function Camper({
</p> </p>
)} )}
{about && <p className='bio text-center'>{about}</p>} {about && <p className='bio text-center'>{about}</p>}
{joinDate && (
<p className='bio text-center'>
<FontAwesomeIcon icon={faCalendar} /> {parseDate(joinDate)}
</p>
)}
{yearsTopContributor.filter(Boolean).length > 0 && ( {yearsTopContributor.filter(Boolean).length > 0 && (
<div> <div>
<br /> <br />