diff --git a/client/package-lock.json b/client/package-lock.json index a0348b3125..16dc857c14 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -16617,6 +16617,15 @@ } } }, + "react-tooltip": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-3.10.0.tgz", + "integrity": "sha512-GGdxJvM1zSFztkTP7gCQbLTstWr1OOoMpJ5WZUGhimj0nhRY+MPz+92MpEnKmj0cftJ9Pd/M6FfSl0sfzmZWkg==", + "requires": { + "classnames": "^2.2.5", + "prop-types": "^15.6.0" + } + }, "react-transition-group": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.1.0.tgz", diff --git a/client/package.json b/client/package.json index 367697ff4d..ee19c731a1 100644 --- a/client/package.json +++ b/client/package.json @@ -53,6 +53,7 @@ "react-responsive": "^6.1.1", "react-spinkit": "^3.0.0", "react-stripe-elements": "^2.0.3", + "react-tooltip": "^3.10.0", "react-transition-group": "^4.1.0", "react-youtube": "^7.9.0", "redux": "^4.0.1", diff --git a/client/src/components/profile/components/HeatMap.js b/client/src/components/profile/components/HeatMap.js index 574f216071..acbfacb33d 100644 --- a/client/src/components/profile/components/HeatMap.js +++ b/client/src/components/profile/components/HeatMap.js @@ -1,8 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Helmet } from 'react-helmet'; import CalendarHeatMap from 'react-calendar-heatmap'; -import startOfMonth from 'date-fns/start_of_month'; +import ReactTooltip from 'react-tooltip'; +import addDays from 'date-fns/add_days'; +import addMonths from 'date-fns/add_months'; import startOfDay from 'date-fns/start_of_day'; import format from 'date-fns/format'; @@ -20,44 +21,42 @@ const propTypes = { }) }; -const now = Date.now(); -const today = new Date(now); -const sixMonthsInMillseconds = 15780000000; -const sixMonthsAgoInMilliseconds = now - sixMonthsInMillseconds; -const sixMonthsAgo = startOfMonth(sixMonthsAgoInMilliseconds); - function HeatMap({ calendar, streak }) { - const dateValueMap = Object.keys(calendar) - .map(ts => Number(ts * 1000) || null) - .filter(Boolean) - .reduce((map, current) => { - const startOfCurrent = format(startOfDay(current), 'YYYY-MM-DD'); - if (startOfCurrent in map) { - map[startOfCurrent] = map[startOfCurrent] + 1; - } else { - map[startOfCurrent] = 1; - } - return map; - }, {}); + const startOfToday = startOfDay(Date.now()); + const sixMonthsAgo = addMonths(startOfToday, -6); + const startOfCalendar = format(addDays(sixMonthsAgo, -1), 'YYYY-MM-DD'); + const endOfCalendar = format(startOfToday, 'YYYY-MM-DD'); - const calendarValues = Object.keys(dateValueMap).map(key => ({ + let calendarData = {}; + let dayCounter = sixMonthsAgo; + + while (dayCounter <= startOfToday) { + calendarData[format(dayCounter, 'YYYY-MM-DD')] = 0; + dayCounter = addDays(dayCounter, 1); + } + + for (let timestamp in calendar) { + if (calendar.hasOwnProperty(timestamp)) { + timestamp = Number(timestamp * 1000) || null; + if (timestamp) { + const startOfTimestampDay = format(startOfDay(timestamp), 'YYYY-MM-DD'); + calendarData[startOfTimestampDay] = + calendarData[startOfTimestampDay] + 1 || 1; + } + } + } + + const calendarValues = Object.keys(calendarData).map(key => ({ date: key, - count: dateValueMap[key] + count: calendarData[key] })); return ( - - -