about summary refs log tree commit diff
path: root/app/javascript/flavours/glitch/features/getting_started
diff options
context:
space:
mode:
authorThibG <thib@sitedethib.com>2020-02-03 01:53:09 +0100
committerThibaut Girka <thib@sitedethib.com>2020-02-03 09:31:32 +0100
commit3dcb279da31bc7810b7f58991dad4f886aaade34 (patch)
tree66a2d3ef757eb5f7ed7b57a7dc215e77c0a18e97 /app/javascript/flavours/glitch/features/getting_started
parentdd6149ca0b05b05bd9103e2127adc387edb7fd22 (diff)
[Glitch] Change how unread announcements are handled
Port 3adc722d1cdd28d87d2724b8952d7ec52d241b52 to glitch-soc

Signed-off-by: Thibaut Girka <thib@sitedethib.com>
Diffstat (limited to 'app/javascript/flavours/glitch/features/getting_started')
-rw-r--r--app/javascript/flavours/glitch/features/getting_started/components/announcements.js34
-rw-r--r--app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js3
2 files changed, 35 insertions, 2 deletions
diff --git a/app/javascript/flavours/glitch/features/getting_started/components/announcements.js b/app/javascript/flavours/glitch/features/getting_started/components/announcements.js
index 4eeac8560..e34c9009b 100644
--- a/app/javascript/flavours/glitch/features/getting_started/components/announcements.js
+++ b/app/javascript/flavours/glitch/features/getting_started/components/announcements.js
@@ -302,10 +302,23 @@ class Announcement extends ImmutablePureComponent {
     addReaction: PropTypes.func.isRequired,
     removeReaction: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
+    selected: PropTypes.bool,
   };
 
+  state = {
+    unread: !this.props.announcement.get('read'),
+  };
+
+  componentDidUpdate () {
+    const { selected, announcement } = this.props;
+    if (!selected && this.state.unread !== !announcement.get('read')) {
+      this.setState({ unread: !announcement.get('read') });
+    }
+  }
+
   render () {
     const { announcement } = this.props;
+    const { unread } = this.state;
     const startsAt = announcement.get('starts_at') && new Date(announcement.get('starts_at'));
     const endsAt = announcement.get('ends_at') && new Date(announcement.get('ends_at'));
     const now = new Date();
@@ -330,6 +343,8 @@ class Announcement extends ImmutablePureComponent {
           removeReaction={this.props.removeReaction}
           emojiMap={this.props.emojiMap}
         />
+
+        {unread && <span className='announcements__item__unread' />}
       </div>
     );
   }
@@ -342,6 +357,7 @@ class Announcements extends ImmutablePureComponent {
   static propTypes = {
     announcements: ImmutablePropTypes.list,
     emojiMap: ImmutablePropTypes.map.isRequired,
+    dismissAnnouncement: PropTypes.func.isRequired,
     addReaction: PropTypes.func.isRequired,
     removeReaction: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
@@ -351,6 +367,21 @@ class Announcements extends ImmutablePureComponent {
     index: 0,
   };
 
+  componentDidMount () {
+    this._markAnnouncementAsRead();
+  }
+
+  componentDidUpdate () {
+    this._markAnnouncementAsRead();
+  }
+
+  _markAnnouncementAsRead () {
+    const { dismissAnnouncement, announcements } = this.props;
+    const { index } = this.state;
+    const announcement = announcements.get(index);
+    if (!announcement.get('read')) dismissAnnouncement(announcement.get('id'));
+  }
+
   handleChangeIndex = index => {
     this.setState({ index: index % this.props.announcements.size });
   }
@@ -377,7 +408,7 @@ class Announcements extends ImmutablePureComponent {
 
         <div className='announcements__container'>
           <ReactSwipeableViews animateHeight={!reduceMotion} adjustHeight={reduceMotion} index={index} onChangeIndex={this.handleChangeIndex}>
-            {announcements.map(announcement => (
+            {announcements.map((announcement, idx) => (
               <Announcement
                 key={announcement.get('id')}
                 announcement={announcement}
@@ -385,6 +416,7 @@ class Announcements extends ImmutablePureComponent {
                 addReaction={this.props.addReaction}
                 removeReaction={this.props.removeReaction}
                 intl={intl}
+                selected={index === idx}
               />
             ))}
           </ReactSwipeableViews>
diff --git a/app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js b/app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js
index 8fa695e34..d472323f8 100644
--- a/app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js
+++ b/app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js
@@ -1,5 +1,5 @@
 import { connect } from 'react-redux';
-import { addReaction, removeReaction } from 'flavours/glitch/actions/announcements';
+import { addReaction, removeReaction, dismissAnnouncement } from 'flavours/glitch/actions/announcements';
 import Announcements from '../components/announcements';
 import { createSelector } from 'reselect';
 import { Map as ImmutableMap } from 'immutable';
@@ -12,6 +12,7 @@ const mapStateToProps = state => ({
 });
 
 const mapDispatchToProps = dispatch => ({
+  dismissAnnouncement: id => dispatch(dismissAnnouncement(id)),
   addReaction: (id, name) => dispatch(addReaction(id, name)),
   removeReaction: (id, name) => dispatch(removeReaction(id, name)),
 });