Skip to content

Commit

Permalink
feat(notifications): implement time ago
Browse files Browse the repository at this point in the history
  • Loading branch information
epiqueras committed Nov 25, 2018
1 parent 3d22797 commit 16b5bf9
Show file tree
Hide file tree
Showing 4 changed files with 167 additions and 12 deletions.
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,15 @@
"dependencies": {
"antd": "^3.10.8",
"drizzle": "^1.2.4",
"javascript-time-ago": "^1.0.32",
"polished": "^2.3.0",
"prop-types": "^15.6.2",
"react": "16.7.0-alpha.2",
"react-dom": "16.7.0-alpha.2",
"react-helmet": "^5.2.0",
"react-router-dom": "^4.3.1",
"react-scripts": "2.1.1",
"react-time-ago": "^3.0.3",
"styled-components": "^4.1.1"
}
}
38 changes: 33 additions & 5 deletions src/components/notifications.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,38 @@ import { ReactComponent as Info } from '../assets/icons/info.svg'
import { NavLink } from 'react-router-dom'
import PropTypes from 'prop-types'
import React from 'react'
import TimeAgo from './time-ago'
import styled from 'styled-components/macro'

const Notification = ({ date: _date, message, to: _to, type }) => (
<List.Item>
<List.Item.Meta avatar={<Info className={type} />} description={message} />
</List.Item>
const StyledListItem = styled(List.Item)`
max-width: 358px;
padding: 11px 17px 23px 18px;
position: relative;
.ant-list-item-meta {
align-items: center;
display: flex;
&-title {
font-weight: normal;
}
&-description {
bottom: 4px;
font-weight: bold;
position: absolute;
right: 6px;
}
}
`
const Notification = ({ date, message, to: _to, type }) => (
<StyledListItem>
<List.Item.Meta
avatar={<Info className={type} />}
description={<TimeAgo>{date}</TimeAgo>}
title={message}
/>
</StyledListItem>
)

Notification.propTypes = {
Expand All @@ -25,15 +51,17 @@ const StyledNavLink = styled(NavLink)`
line-height: 21px;
`
const StyledBadge = styled(Badge)`
sup {
.ant-badge-count {
background: #009aff;
box-shadow: 0 0 0 1px #1e075f;
padding: 0 4px;
}
`
const Notifications = ({ notifications }) => (
<Popover
arrowPointAtCenter
content={<List dataSource={notifications} renderItem={Notification} />}
placement="bottomRight"
title={
<>
Notifications <StyledNavLink to="/notifications">History</StyledNavLink>
Expand Down
6 changes: 6 additions & 0 deletions src/components/time-ago.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import JavascriptTimeAgo from 'javascript-time-ago'
import en from 'javascript-time-ago/locale/en'

JavascriptTimeAgo.locale(en)

export { default } from 'react-time-ago'
133 changes: 126 additions & 7 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1701,7 +1701,7 @@ arrify@^1.0.0, arrify@^1.0.1:
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=

asap@~2.0.3, asap@~2.0.6:
asap@^2.0.6, asap@~2.0.3, asap@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
Expand Down Expand Up @@ -1795,6 +1795,11 @@ atob@^2.1.1:
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==

autobind-decorator@^2.1.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/autobind-decorator/-/autobind-decorator-2.3.1.tgz#d7ef8b752d6874ffe713f45431018a6565f9e8da"
integrity sha512-YQIx7zLi++ctT0sZNLKxMyNQ+fUsBJD3rnZC9PYFl8a6Nvtek45BJF/jJ1v+n1BgHYVvRKsdsW6b77S4a/1Ybw==

autoprefixer@^9.0.0, autoprefixer@^9.1.5:
version "9.3.1"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.3.1.tgz#71b622174de2b783d5fd99f9ad617b7a3c78443e"
Expand Down Expand Up @@ -3073,6 +3078,11 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"

change-emitter@^0.1.2:
version "0.1.6"
resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515"
integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=

character-entities-html4@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.2.tgz#c44fdde3ce66b52e8d321d6c1bf46101f0150610"
Expand Down Expand Up @@ -3463,6 +3473,11 @@ compression@^1.5.2:
safe-buffer "5.1.2"
vary "~1.1.2"

compute-scroll-into-view@1.0.11:
version "1.0.11"
resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.11.tgz#7ff0a57f9aeda6314132d8994cce7aeca794fecf"
integrity sha512-uUnglJowSe0IPmWOdDtrlHXof5CTIJitfJEyITHBW6zDVOGu9Pjk5puaLM73SLcwak0L4hEjO7Td88/a6P5i7A==

concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
Expand Down Expand Up @@ -3802,7 +3817,7 @@ create-react-class@^15.5.2, create-react-class@^15.5.3, create-react-class@^15.6
loose-envify "^1.3.1"
object-assign "^4.1.1"

create-react-context@0.2.3:
create-react-context@0.2.3, create-react-context@^0.2.2:
version "0.2.3"
resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.3.tgz#9ec140a6914a22ef04b8b09b7771de89567cb6f3"
integrity sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==
Expand Down Expand Up @@ -4447,6 +4462,16 @@ dir-glob@^2.0.0:
arrify "^1.0.1"
path-type "^3.0.0"

dnd-core@^4.0.5:
version "4.0.5"
resolved "https://registry.yarnpkg.com/dnd-core/-/dnd-core-4.0.5.tgz#3b83d138d0d5e265c73ec978dec5e1ed441dc665"
integrity sha1-O4PRONDV4mXHPsl43sXh7UQdxmU=
dependencies:
asap "^2.0.6"
invariant "^2.2.4"
lodash "^4.17.10"
redux "^4.0.0"

dns-equal@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
Expand Down Expand Up @@ -5334,7 +5359,7 @@ execall@^1.0.0:
dependencies:
clone-regexp "^1.0.0"

exenv@^1.2.1:
exenv@^1.2.0, exenv@^1.2.1:
version "1.2.2"
resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d"
integrity sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=
Expand Down Expand Up @@ -5561,7 +5586,7 @@ fb-watchman@^2.0.0:
dependencies:
bser "^2.0.0"

fbjs@^0.8.0, fbjs@^0.8.15, fbjs@^0.8.16, fbjs@^0.8.5, fbjs@^0.8.9:
fbjs@^0.8.0, fbjs@^0.8.1, fbjs@^0.8.15, fbjs@^0.8.16, fbjs@^0.8.5, fbjs@^0.8.9:
version "0.8.17"
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=
Expand Down Expand Up @@ -6988,7 +7013,7 @@ intersperse@^1.0.0:
resolved "https://registry.yarnpkg.com/intersperse/-/intersperse-1.0.0.tgz#f2561fb1cfef9f5277cc3347a22886b4351a5181"
integrity sha1-8lYfsc/vn1J3zDNHoiiGtDUaUYE=

invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4:
invariant@^2.1.0, invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
Expand Down Expand Up @@ -7576,6 +7601,11 @@ isurl@^1.0.0-alpha5:
has-to-string-tag-x "^1.2.0"
is-object "^1.0.1"

javascript-time-ago@^1.0.20, javascript-time-ago@^1.0.32:
version "1.0.32"
resolved "https://registry.yarnpkg.com/javascript-time-ago/-/javascript-time-ago-1.0.32.tgz#8c43a6f8ac8eb0eb438a1df337425c8370ef9097"
integrity sha512-EbQty2KmZVA6ZimGVVv/J3bD8jZiL3UR0uBiHdhYf2xcMAN0b/EIySFCDyZpxmusmsZtekj4tAnVxLPXNOuDaA==

jest-changed-files@^23.4.2:
version "23.4.2"
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83"
Expand Down Expand Up @@ -11509,6 +11539,18 @@ react-app-polyfill@^0.1.3:
raf "3.4.0"
whatwg-fetch "3.0.0"

react-create-ref@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/react-create-ref/-/react-create-ref-1.0.0.tgz#c9fc1b40acfc05449c4ee84cc44a4635088938c2"
integrity sha512-hU9+UtbQKgmzg0biTYlH89ULxwcwlWF0WfMsYZfGNRxrmSoTEqt4IhH9aVeLKx/ToOdB0osBgQy1RRWxhX5KNQ==

react-day-picker@^7.1.6:
version "7.2.4"
resolved "https://registry.yarnpkg.com/react-day-picker/-/react-day-picker-7.2.4.tgz#3c3bea7aa1910bef7bad17f25ff15cd26a7d1848"
integrity sha512-LaePKijvAdXTrQhTyU7XfxxD5NQIFb4FH4vr1T862xNtmncoS8jZLliyHieMHNhZZ8RJU1pruqoQzkZQ05646w==
dependencies:
prop-types "^15.6.2"

react-dev-utils@^6.1.1:
version "6.1.1"
resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-6.1.1.tgz#a07e3e8923c4609d9f27e5af5207e3ca20724895"
Expand Down Expand Up @@ -11539,6 +11581,28 @@ react-dev-utils@^6.1.1:
strip-ansi "4.0.0"
text-table "0.2.0"

react-dnd-html5-backend@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/react-dnd-html5-backend/-/react-dnd-html5-backend-5.0.1.tgz#0b578d79c5c01317c70414c8d717f632b919d4f1"
integrity sha1-C1eNecXAExfHBBTI1xf2MrkZ1PE=
dependencies:
autobind-decorator "^2.1.0"
dnd-core "^4.0.5"
lodash "^4.17.10"
shallowequal "^1.0.2"

react-dnd@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/react-dnd/-/react-dnd-5.0.0.tgz#c4a17c70109e456dad8906be838e6ee8f32b06b5"
integrity sha1-xKF8cBCeRW2tiQa+g45u6PMrBrU=
dependencies:
dnd-core "^4.0.5"
hoist-non-react-statics "^2.5.0"
invariant "^2.1.0"
lodash "^4.17.10"
recompose "^0.27.1"
shallowequal "^1.0.2"

react-dom@16.7.0-alpha.2:
version "16.7.0-alpha.2"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.7.0-alpha.2.tgz#16632880ed43676315991d8b412cce6975a30282"
Expand Down Expand Up @@ -11579,11 +11643,38 @@ react-lazy-load@^3.0.13:
lodash.throttle "^4.0.0"
prop-types "^15.5.8"

react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4:
react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==

react-modal@^3.4.4:
version "3.6.1"
resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.6.1.tgz#54d27a1ec2b493bbc451c7efaa3557b6af82332d"
integrity sha512-vAhnawahH1fz8A5x/X/1X20KHMe6Q0mkfU5BKPgKSVPYhMhsxtRbNHSitsoJ7/oP27xZo3naZZlwYuuzuSO1xw==
dependencies:
exenv "^1.2.0"
prop-types "^15.5.10"
react-lifecycles-compat "^3.0.0"
warning "^3.0.0"

react-responsive-ui@^0.14.32:
version "0.14.64"
resolved "https://registry.yarnpkg.com/react-responsive-ui/-/react-responsive-ui-0.14.64.tgz#4f5adfeda4d135cd22ea437e6320215d9d4e43db"
integrity sha512-s6iXOC3rspfVvv8IEKwlOEK5cfcIIO7npQIihMiKnsv28YBWqzaZEMUw+25DYSAeGe9z62l7u77KCuWYAc7ZtQ==
dependencies:
classnames "^2.2.5"
create-react-context "^0.2.2"
lodash "^4.17.4"
prop-types "^15.5.6"
react-create-ref "^1.0.0"
react-day-picker "^7.1.6"
react-dnd "^5.0.0"
react-dnd-html5-backend "^5.0.1"
react-lifecycles-compat "^3.0.2"
react-modal "^3.4.4"
scroll-into-view-if-needed "^2.2.16"

react-router-dom@^4.3.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6"
Expand Down Expand Up @@ -11684,6 +11775,15 @@ react-slick@~0.23.2:
prettier "^1.14.3"
resize-observer-polyfill "^1.5.0"

react-time-ago@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/react-time-ago/-/react-time-ago-3.0.3.tgz#3e312d408586c6b25183b5eeb60f91ecb7496cd5"
integrity sha512-vcE0ZX8vHaxS1OFCUL5R78cb1qf1pef7VKIa0j/Xgajzf8ZPa4m7xFtWsAb3nMPgG+KDl6GYQe5pr0VAL57sqw==
dependencies:
javascript-time-ago "^1.0.20"
prop-types "^15.6.0"
react-responsive-ui "^0.14.32"

react@16.7.0-alpha.2:
version "16.7.0-alpha.2"
resolved "https://registry.yarnpkg.com/react/-/react-16.7.0-alpha.2.tgz#924f2ae843a46ea82d104a8def7a599fbf2c78ce"
Expand Down Expand Up @@ -11818,6 +11918,18 @@ rechoir@^0.6.2:
dependencies:
resolve "^1.1.6"

recompose@^0.27.1:
version "0.27.1"
resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.27.1.tgz#1a49e931f183634516633bbb4f4edbfd3f38a7ba"
integrity sha512-p7xsyi/rfNjHfdP7vPU02uSFa+Q1eHhjKrvO+3+kRP4Ortj+MxEmpmd+UQtBGM2D2iNAjzNI5rCyBKp9Ob5McA==
dependencies:
babel-runtime "^6.26.0"
change-emitter "^0.1.2"
fbjs "^0.8.1"
hoist-non-react-statics "^2.3.1"
react-lifecycles-compat "^3.0.2"
symbol-observable "^1.0.4"

recursive-readdir@2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f"
Expand Down Expand Up @@ -12423,6 +12535,13 @@ schema-utils@^1.0.0:
ajv-errors "^1.0.0"
ajv-keywords "^3.1.0"

scroll-into-view-if-needed@^2.2.16:
version "2.2.20"
resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.20.tgz#3a46847a72233a3af9770e55df450f2a7f2e2a0e"
integrity sha512-P9kYMrhi9f6dvWwTGpO5I3HgjSU/8Mts7xL3lkoH5xlewK7O9Obdc5WmMCzppln7bCVGNmf3qfoZXrpCeyNJXw==
dependencies:
compute-scroll-into-view "1.0.11"

scrypt-js@2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.3.tgz#bb0040be03043da9a012a2cea9fc9f852cfc87d4"
Expand Down Expand Up @@ -13480,7 +13599,7 @@ swarm-js@0.1.37:
tar.gz "^1.0.5"
xhr-request-promise "^0.1.2"

symbol-observable@^1.1.0, symbol-observable@^1.2.0:
symbol-observable@^1.0.4, symbol-observable@^1.1.0, symbol-observable@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
Expand Down

0 comments on commit 16b5bf9

Please sign in to comment.