about summary refs log tree commit diff
path: root/app
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-09-21 22:07:18 +0200
committerEugen Rochko <eugen@zeonfederated.com>2016-09-21 22:07:18 +0200
commite46abc71cad590c2113247d41feca80d27a557b0 (patch)
tree7c7947aa82231a1d28fd2240a689ca057550ea1d /app
parent4bec613897d8835bb78202c7a36691b654f14967 (diff)
Fix notifications in UI, added new API for fetching account relationships
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/components/actions/notifications.jsx7
-rw-r--r--app/assets/javascripts/components/features/ui/containers/notifications_container.jsx24
-rw-r--r--app/assets/javascripts/components/reducers/notifications.jsx5
-rw-r--r--app/controllers/api/accounts_controller.rb8
-rw-r--r--app/models/account.rb8
-rw-r--r--app/views/api/accounts/lookup/index.rabl2
-rw-r--r--app/views/api/accounts/relationships.rabl5
-rw-r--r--app/views/api/accounts/show.rabl1
8 files changed, 44 insertions, 16 deletions
diff --git a/app/assets/javascripts/components/actions/notifications.jsx b/app/assets/javascripts/components/actions/notifications.jsx
index cf1e50a69..f19a356c2 100644
--- a/app/assets/javascripts/components/actions/notifications.jsx
+++ b/app/assets/javascripts/components/actions/notifications.jsx
@@ -1,4 +1,5 @@
 export const NOTIFICATION_DISMISS = 'NOTIFICATION_DISMISS';
+export const NOTIFICATION_CLEAR   = 'NOTIFICATION_CLEAR';
 
 export function dismissNotification(notification) {
   return {
@@ -6,3 +7,9 @@ export function dismissNotification(notification) {
     notification: notification
   };
 };
+
+export function clearNotifications() {
+  return {
+    type: NOTIFICATION_CLEAR
+  };
+};
diff --git a/app/assets/javascripts/components/features/ui/containers/notifications_container.jsx b/app/assets/javascripts/components/features/ui/containers/notifications_container.jsx
index 2db1603fc..bc339ef28 100644
--- a/app/assets/javascripts/components/features/ui/containers/notifications_container.jsx
+++ b/app/assets/javascripts/components/features/ui/containers/notifications_container.jsx
@@ -1,18 +1,18 @@
 import { connect }             from 'react-redux';
 import { NotificationStack }   from 'react-notification';
-import { dismissNotification } from '../../../actions/notifications';
+import {
+  dismissNotification,
+  clearNotifications
+}                              from '../../../actions/notifications';
 
-const mapStateToProps = (state, props) => {
-  return {
-    notifications: state.get('notifications').map((item, i) => ({
-      message: item.get('message'),
-      title: item.get('title'),
-      key: i,
-      action: 'Dismiss',
-      dismissAfter: 5000
-    })).toJS()
-  };
-};
+const mapStateToProps = (state, props) => ({
+  notifications: state.get('notifications').map((item, i) => ({
+    message: item.get('message'),
+    title: item.get('title'),
+    key: item.get('key'),
+    dismissAfter: 5000
+  })).toJS()
+});
 
 const mapDispatchToProps = (dispatch) => {
   return {
diff --git a/app/assets/javascripts/components/reducers/notifications.jsx b/app/assets/javascripts/components/reducers/notifications.jsx
index 694d9ff4b..a1d99f0e1 100644
--- a/app/assets/javascripts/components/reducers/notifications.jsx
+++ b/app/assets/javascripts/components/reducers/notifications.jsx
@@ -2,13 +2,14 @@ import { COMPOSE_SUBMIT_FAIL, COMPOSE_UPLOAD_FAIL } from '../actions/compose';
 import { FOLLOW_SUBMIT_FAIL }                       from '../actions/follow';
 import { REBLOG_FAIL, FAVOURITE_FAIL }              from '../actions/interactions';
 import { TIMELINE_REFRESH_FAIL }                    from '../actions/timelines';
-import { NOTIFICATION_DISMISS }                     from '../actions/notifications';
+import { NOTIFICATION_DISMISS, NOTIFICATION_CLEAR } from '../actions/notifications';
 import Immutable                                    from 'immutable';
 
 const initialState = Immutable.List();
 
 function notificationFromError(state, error) {
   let n = Immutable.Map({
+    key: state.size > 0 ? state.last().get('key') + 1 : 0,
     message: ''
   });
 
@@ -34,6 +35,8 @@ export default function notifications(state = initialState, action) {
     case TIMELINE_REFRESH_FAIL:
       return notificationFromError(state, action.error);
     case NOTIFICATION_DISMISS:
+      return state.filterNot(item => item.get('key') === action.notification.key);
+    case NOTIFICATION_CLEAR:
       return state.clear();
     default:
       return state;
diff --git a/app/controllers/api/accounts_controller.rb b/app/controllers/api/accounts_controller.rb
index 1a19ae43e..ccbbc93ff 100644
--- a/app/controllers/api/accounts_controller.rb
+++ b/app/controllers/api/accounts_controller.rb
@@ -28,6 +28,14 @@ class Api::AccountsController < ApiController
     render action: :show
   end
 
+  def relationships
+    ids = params[:id].is_a?(Enumerable) ? params[:id].map { |id| id.to_i } : [params[:id].to_i]
+    @accounts    = Account.find(ids)
+    @following   = Account.following_map(ids, current_user.account_id)
+    @followed_by = Account.followed_by_map(ids, current_user.account_id)
+    @blocking    = {}
+  end
+
   private
 
   def set_account
diff --git a/app/models/account.rb b/app/models/account.rb
index bfb10ae51..25316c9a4 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -127,6 +127,14 @@ class Account < ApplicationRecord
     nil
   end
 
+  def self.following_map(target_account_ids, account_id)
+    Follow.where(target_account_id: target_account_ids).where(account_id: account_id).map { |f| [f.target_account_id, true] }.to_h
+  end
+
+  def self.followed_by_map(target_account_ids, account_id)
+    Follow.where(account_id: target_account_ids).where(target_account_id: account_id).map { |f| [f.account_id, true] }.to_h
+  end
+
   before_create do
     if local?
       keypair = OpenSSL::PKey::RSA.new(Rails.env.test? ? 1024 : 2048)
diff --git a/app/views/api/accounts/lookup/index.rabl b/app/views/api/accounts/lookup/index.rabl
deleted file mode 100644
index f6ae172ed..000000000
--- a/app/views/api/accounts/lookup/index.rabl
+++ /dev/null
@@ -1,2 +0,0 @@
-collection @accounts
-extends('api/accounts/show')
diff --git a/app/views/api/accounts/relationships.rabl b/app/views/api/accounts/relationships.rabl
new file mode 100644
index 000000000..dc1c1bc65
--- /dev/null
+++ b/app/views/api/accounts/relationships.rabl
@@ -0,0 +1,5 @@
+collection @accounts
+attribute :id
+node(:following)   { |account| @following[account.id]   || false }
+node(:followed_by) { |account| @followed_by[account.id] || false }
+node(:blocking)    { |account| @blocking[account.id]    || false }
diff --git a/app/views/api/accounts/show.rabl b/app/views/api/accounts/show.rabl
index 5af295c54..4f6a3ff99 100644
--- a/app/views/api/accounts/show.rabl
+++ b/app/views/api/accounts/show.rabl
@@ -8,4 +8,3 @@ node(:header)          { |account| full_asset_url(account.header.url(:medium, fa
 node(:followers_count) { |account| account.followers.count }
 node(:following_count) { |account| account.following.count }
 node(:statuses_count)  { |account| account.statuses.count  }
-node(:following)       { |account| current_account.following?(account) }