diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2016-11-20 19:39:18 +0100 |
---|---|---|
committer | Eugen Rochko <eugen@zeonfederated.com> | 2016-11-20 19:39:58 +0100 |
commit | 38dd85daab8e8342ec608d24cf81254c0dfde95c (patch) | |
tree | 33502dcbfd0af447fb5b1ef7147485c8c9de95b0 /app/assets/javascripts/components/actions | |
parent | da2ef4d676ff71e6ab3edf8d1a7cee8bf6b6d353 (diff) |
Adding notifications column
Diffstat (limited to 'app/assets/javascripts/components/actions')
-rw-r--r-- | app/assets/javascripts/components/actions/alerts.jsx | 24 | ||||
-rw-r--r-- | app/assets/javascripts/components/actions/notifications.jsx | 124 |
2 files changed, 136 insertions, 12 deletions
diff --git a/app/assets/javascripts/components/actions/alerts.jsx b/app/assets/javascripts/components/actions/alerts.jsx new file mode 100644 index 000000000..086e0727e --- /dev/null +++ b/app/assets/javascripts/components/actions/alerts.jsx @@ -0,0 +1,24 @@ +export const ALERT_SHOW = 'ALERT_SHOW'; +export const ALERT_DISMISS = 'ALERT_DISMISS'; +export const ALERT_CLEAR = 'ALERT_CLEAR'; + +export function dismissAlert(alert) { + return { + type: ALERT_DISMISS, + alert + }; +}; + +export function clearAlert() { + return { + type: ALERT_CLEAR + }; +}; + +export function showAlert(title, message) { + return { + type: ALERT_SHOW, + title, + message + }; +}; diff --git a/app/assets/javascripts/components/actions/notifications.jsx b/app/assets/javascripts/components/actions/notifications.jsx index 79457eba6..7863d9683 100644 --- a/app/assets/javascripts/components/actions/notifications.jsx +++ b/app/assets/javascripts/components/actions/notifications.jsx @@ -1,24 +1,124 @@ -export const NOTIFICATION_SHOW = 'NOTIFICATION_SHOW'; -export const NOTIFICATION_DISMISS = 'NOTIFICATION_DISMISS'; -export const NOTIFICATION_CLEAR = 'NOTIFICATION_CLEAR'; +import api, { getLinks } from '../api' +import Immutable from 'immutable'; -export function dismissNotification(notification) { +import { fetchRelationships } from './accounts'; + +export const NOTIFICATIONS_UPDATE = 'NOTIFICATIONS_UPDATE'; + +export const NOTIFICATIONS_REFRESH_REQUEST = 'NOTIFICATIONS_REFRESH_REQUEST'; +export const NOTIFICATIONS_REFRESH_SUCCESS = 'NOTIFICATIONS_REFRESH_SUCCESS'; +export const NOTIFICATIONS_REFRESH_FAIL = 'NOTIFICATIONS_REFRESH_FAIL'; + +export const NOTIFICATIONS_EXPAND_REQUEST = 'NOTIFICATIONS_EXPAND_REQUEST'; +export const NOTIFICATIONS_EXPAND_SUCCESS = 'NOTIFICATIONS_EXPAND_SUCCESS'; +export const NOTIFICATIONS_EXPAND_FAIL = 'NOTIFICATIONS_EXPAND_FAIL'; + +const fetchRelatedRelationships = (dispatch, notifications) => { + const accountIds = notifications.filter(item => item.type === 'follow').map(item => item.account.id); + + if (accountIds > 0) { + dispatch(fetchRelationships(accountIds)); + } +}; + +export function updateNotifications(notification) { + return dispatch => { + dispatch({ + type: NOTIFICATIONS_UPDATE, + notification, + account: notification.account, + status: notification.status + }); + + fetchRelatedRelationships(dispatch, [notification]); + }; +}; + +export function refreshNotifications() { + return (dispatch, getState) => { + dispatch(refreshNotificationsRequest()); + + const params = {}; + const ids = getState().getIn(['notifications', 'items']); + + if (ids.size > 0) { + params.since_id = ids.first().get('id'); + } + + api(getState).get('/api/v1/notifications', { params }).then(response => { + const next = getLinks(response).refs.find(link => link.rel === 'next'); + + dispatch(refreshNotificationsSuccess(response.data, next ? next.uri : null)); + fetchRelatedRelationships(dispatch, response.data); + }).catch(error => { + dispatch(refreshNotificationsFail(error)); + }); + }; +}; + +export function refreshNotificationsRequest() { + return { + type: NOTIFICATIONS_REFRESH_REQUEST + }; +}; + +export function refreshNotificationsSuccess(notifications, next) { + return { + type: NOTIFICATIONS_REFRESH_SUCCESS, + notifications, + accounts: notifications.map(item => item.account), + statuses: notifications.map(item => item.status), + next + }; +}; + +export function refreshNotificationsFail(error) { + return { + type: NOTIFICATIONS_REFRESH_FAIL, + error + }; +}; + +export function expandNotifications() { + return (dispatch, getState) => { + const url = getState().getIn(['notifications', 'next'], null); + + if (url === null) { + return; + } + + dispatch(expandNotificationsRequest()); + + api(getState).get(url).then(response => { + const next = getLinks(response).refs.find(link => link.rel === 'next'); + + dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null)); + fetchRelatedRelationships(dispatch, response.data); + }).catch(error => { + dispatch(expandNotificationsFail(error)); + }); + }; +}; + +export function expandNotificationsRequest() { return { - type: NOTIFICATION_DISMISS, - notification: notification + type: NOTIFICATIONS_EXPAND_REQUEST }; }; -export function clearNotifications() { +export function expandNotificationsSuccess(notifications, next) { return { - type: NOTIFICATION_CLEAR + type: NOTIFICATIONS_EXPAND_SUCCESS, + notifications, + accounts: notifications.map(item => item.account), + statuses: notifications.map(item => item.status), + next }; }; -export function showNotification(title, message) { +export function expandNotificationsFail(error) { return { - type: NOTIFICATION_SHOW, - title: title, - message: message + type: NOTIFICATIONS_EXPAND_FAIL, + error }; }; |