From fb48cc3b7400f73c01d59a038eaf7fc3020c39f4 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 21 Nov 2016 10:24:50 +0100 Subject: [PATCH] Desktop notifications --- .../javascripts/components/actions/notifications.jsx | 9 ++++++++- .../javascripts/components/containers/mastodon.jsx | 8 +++++--- app/controllers/application_controller.rb | 4 ++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/components/actions/notifications.jsx b/app/assets/javascripts/components/actions/notifications.jsx index 7863d9683..b34fc7289 100644 --- a/app/assets/javascripts/components/actions/notifications.jsx +++ b/app/assets/javascripts/components/actions/notifications.jsx @@ -1,5 +1,6 @@ import api, { getLinks } from '../api' import Immutable from 'immutable'; +import IntlMessageFormat from 'intl-messageformat'; import { fetchRelationships } from './accounts'; @@ -21,7 +22,7 @@ const fetchRelatedRelationships = (dispatch, notifications) => { } }; -export function updateNotifications(notification) { +export function updateNotifications(notification, intlMessages, intlLocale) { return dispatch => { dispatch({ type: NOTIFICATIONS_UPDATE, @@ -31,6 +32,12 @@ export function updateNotifications(notification) { }); fetchRelatedRelationships(dispatch, [notification]); + + // Desktop notifications + const title = new IntlMessageFormat(intlMessages[`notification.${notification.type}`], intlLocale).format({ name: notification.account.display_name.length > 0 ? notification.account.display_name : notification.account.username }); + const body = $('

').html(notification.status ? notification.status.content : '').text(); + + new Notification(title, { body }); }; }; diff --git a/app/assets/javascripts/components/containers/mastodon.jsx b/app/assets/javascripts/components/containers/mastodon.jsx index cf77c169d..a8a9e365e 100644 --- a/app/assets/javascripts/components/containers/mastodon.jsx +++ b/app/assets/javascripts/components/containers/mastodon.jsx @@ -60,8 +60,10 @@ const Mastodon = React.createClass({ mixins: [PureRenderMixin], componentWillMount() { - store.dispatch(setAccessToken(this.props.token)); - store.dispatch(setAccountSelf(JSON.parse(this.props.account))); + const { token, account, locale } = this.props; + + store.dispatch(setAccessToken(token)); + store.dispatch(setAccountSelf(JSON.parse(account))); if (typeof App !== 'undefined') { this.subscription = App.cable.subscriptions.create('TimelineChannel', { @@ -78,7 +80,7 @@ const Mastodon = React.createClass({ case 'block': return store.dispatch(refreshTimeline('mentions', true)); case 'notification': - return store.dispatch(updateNotifications(JSON.parse(data.message))); + return store.dispatch(updateNotifications(JSON.parse(data.message), getMessagesForLocale(locale), locale)); } } diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f9aeb127a..3a4c95db4 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -13,7 +13,7 @@ class ApplicationController < ActionController::Base rescue_from ActiveRecord::RecordNotFound, with: :not_found before_action :store_current_location, except: :raise_not_found, unless: :devise_controller? - before_action :set_locale, if: 'user_signed_in?' + before_action :set_locale def raise_not_found raise ActionController::RoutingError, "No route matches #{params[:unmatched_route]}" @@ -26,7 +26,7 @@ class ApplicationController < ActionController::Base end def set_locale - I18n.locale = current_user.locale || I18n.default_locale + I18n.locale = current_user.try(:locale) || I18n.default_locale rescue I18n::InvalidLocale I18n.locale = I18n.default_locale end