From 216a19476b16f91d4f8df6a14fb2d835a5fd670b Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Thu, 28 Sep 2017 12:28:33 -0400 Subject: [PATCH] add hover states and empty case --- app/assets/stylesheets/notifications.scss.erb | 35 ++++--- .../src/components/App/NotificationBox.js | 13 ++- frontend/src/components/Loading.js | 92 +++++++++++++++++++ 3 files changed, 126 insertions(+), 14 deletions(-) create mode 100644 frontend/src/components/Loading.js diff --git a/app/assets/stylesheets/notifications.scss.erb b/app/assets/stylesheets/notifications.scss.erb index 3168f591..f6d01dc8 100644 --- a/app/assets/stylesheets/notifications.scss.erb +++ b/app/assets/stylesheets/notifications.scss.erb @@ -1,4 +1,5 @@ $notifications-border-color: #DDDDDD; +$notifications-hover-color: #F6F6F6; $unread_notifications_dot_size: 8px; .unread-notifications-dot { @@ -48,6 +49,20 @@ $unread_notifications_dot_size: 8px; ul.notifications { max-height: 500px; overflow-y: auto; + + .notification { + font-size: 13px; + + .notification-body { + border-bottom: 1px solid $notifications-border-color; + } + } + + .notificationsEmpty { + font-family: din-regular, helvetica, sans-serif; + margin: 50px 10px; + text-align: center; + } } .notificationsBoxSeeAll { @@ -56,15 +71,11 @@ $unread_notifications_dot_size: 8px; text-align: center; padding: 6px 0; font-family: din-regular, helvetica, sans-serif; - color: #4fb5c0; border-top: 1px solid rgba(0, 0, 0, 0.1); - } - .notification { - font-size: 13px; - - .notification-body { - border-bottom: 1px solid $notifications-border-color; + &:hover { + color: #333; + background: $notifications-hover-color; } } } @@ -150,8 +161,12 @@ ul.notifications { position: relative; font-family: 'din-regular', Sans-Serif; + &.unread { + background: #EEE; + } + &:hover { - background: #F6F6F6; + background: $notifications-hover-color; .notification-read-unread { display:block; @@ -219,8 +234,4 @@ ul.notifications { cursor: pointer; } } - - &.unread { - background: #EEE; - } } diff --git a/frontend/src/components/App/NotificationBox.js b/frontend/src/components/App/NotificationBox.js index 2f9591ff..5d4dcc2b 100644 --- a/frontend/src/components/App/NotificationBox.js +++ b/frontend/src/components/App/NotificationBox.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types' import onClickOutsideAddon from 'react-onclickoutside' import Notification from '../Notification' +import Loading from '../Loading' class NotificationBox extends Component { @@ -27,10 +28,15 @@ class NotificationBox extends Component { render = () => { const { notifications, markAsRead, markAsUnread } = this.props + const empty = notifications && notifications.length === 0 return
    - {!notifications &&
  • loading...
  • } + {!notifications &&
  • } + {empty &&
  • + You have no notifications.
    + More time for dancing. +
  • } {notifications && notifications.slice(0, 10).map(n => { return })}
- See all + {notifications && !empty && + See all + }
} } diff --git a/frontend/src/components/Loading.js b/frontend/src/components/Loading.js new file mode 100644 index 00000000..018806af --- /dev/null +++ b/frontend/src/components/Loading.js @@ -0,0 +1,92 @@ +import React from 'react' +import PropTypes from 'prop-types' + +// based on https://www.npmjs.com/package/react-loading-animation + +const loading_style = { + position: 'relative', + margin: '0 auto', + width: '30px', + height: '30px', +} + +const svg_style = { + animation: 'rotate 2s linear infinite', + height: '100%', + transformOrigin: 'center center', + width: '100%', + position: 'absolute', + top: 0, + bottom: 0, + left: 0, + right: 0, + margin: 'auto' +} + +const circle_style = { + strokeDasharray: '1,200', + strokeDashoffset: '0', + animation: 'dash 1.5s ease-in-out infinite, color 6s ease-in-out infinite', + strokeLinecap: 'round' +} + +const animation = `@keyframes rotate { + 100% { + transform: rotate(360deg); + } +} +@keyframes dash { + 0% { + stroke-dasharray: 1,200; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 89,200; + stroke-dashoffset: -35px; + } + 100% { + stroke-dasharray: 89,200; + stroke-dashoffset: -124px; + } +} +@keyframes color { + 100%, 0% { + stroke: #a354cd; + } + 50% { + stroke: #4fb5c0; + } +}` + +class Loading extends React.Component { + static propTypes = { + style: PropTypes.object, + width: PropTypes.string, + height: PropTypes.string, + margin: PropTypes.string + } + + static defaultProps = { + style: {}, + width: '30px', + height: '30px', + margin: '0 auto' + } + + render () { + let { width, height, margin, style } = this.props + + loading_style.width = width + loading_style.height = height + loading_style.margin = margin + + return
+ + + + +
+ } +} + +export default Loading