about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--app/assets/javascripts/components/actions/notifications.jsx9
-rw-r--r--app/assets/javascripts/components/containers/mastodon.jsx8
-rw-r--r--app/controllers/application_controller.rb4
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  = $('<p>').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