FIX: fallback to default push notification icon if none exists (#16961)
Due to some changes we started notifying via push notifications on other families of notifications. There are a total of about 30 or so possible notification you could get, some can be pushed. This fallback means that if for any reason we are unable to find an icon for a push notification we just fallback to the Discourse logo. Also go with a simple reply icon for watching first post. Note, that in production `image_url` can return an exception if an image is missing. This is not the case in test / development.
This commit is contained in:
parent
bc8f651501
commit
7b4e338c0e
Binary file not shown.
After Width: | Height: | Size: 2.0 KiB |
|
@ -5,7 +5,14 @@ class PushNotificationPusher
|
||||||
CONNECTION_TIMEOUT_SECONDS = 5
|
CONNECTION_TIMEOUT_SECONDS = 5
|
||||||
|
|
||||||
def self.push(user, payload)
|
def self.push(user, payload)
|
||||||
|
message = nil
|
||||||
I18n.with_locale(user.effective_locale) do
|
I18n.with_locale(user.effective_locale) do
|
||||||
|
notification_icon_name = Notification.types[payload[:notification_type]]
|
||||||
|
if !File.exist?(File.expand_path("../../app/assets/images/push-notifications/#{notification_icon_name}.png", __dir__))
|
||||||
|
notification_icon_name = "discourse"
|
||||||
|
end
|
||||||
|
notification_icon = ActionController::Base.helpers.image_url("push-notifications/#{notification_icon_name}.png")
|
||||||
|
|
||||||
message = {
|
message = {
|
||||||
title: payload[:translated_title] || I18n.t(
|
title: payload[:translated_title] || I18n.t(
|
||||||
"discourse_push_notifications.popup.#{Notification.types[payload[:notification_type]]}",
|
"discourse_push_notifications.popup.#{Notification.types[payload[:notification_type]]}",
|
||||||
|
@ -15,7 +22,7 @@ class PushNotificationPusher
|
||||||
),
|
),
|
||||||
body: payload[:excerpt],
|
body: payload[:excerpt],
|
||||||
badge: get_badge,
|
badge: get_badge,
|
||||||
icon: ActionController::Base.helpers.image_url("push-notifications/#{Notification.types[payload[:notification_type]]}.png"),
|
icon: notification_icon,
|
||||||
tag: payload[:tag] || "#{Discourse.current_hostname}-#{payload[:topic_id]}",
|
tag: payload[:tag] || "#{Discourse.current_hostname}-#{payload[:topic_id]}",
|
||||||
base_url: Discourse.base_url,
|
base_url: Discourse.base_url,
|
||||||
url: payload[:post_url],
|
url: payload[:post_url],
|
||||||
|
@ -26,6 +33,8 @@ class PushNotificationPusher
|
||||||
send_notification(user, subscription, message)
|
send_notification(user, subscription, message)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
message
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.subscriptions(user)
|
def self.subscriptions(user)
|
||||||
|
|
|
@ -30,17 +30,27 @@ RSpec.describe PushNotificationPusher do
|
||||||
PushSubscription.create!(user_id: user.id, data: data)
|
PushSubscription.create!(user_id: user.id, data: data)
|
||||||
end
|
end
|
||||||
|
|
||||||
def execute_push
|
def execute_push(notification_type: 1)
|
||||||
PushNotificationPusher.push(user, {
|
PushNotificationPusher.push(user, {
|
||||||
topic_title: 'Topic',
|
topic_title: 'Topic',
|
||||||
username: 'system',
|
username: 'system',
|
||||||
excerpt: 'description',
|
excerpt: 'description',
|
||||||
topic_id: 1,
|
topic_id: 1,
|
||||||
post_url: "https://example.com/t/1/2",
|
post_url: "https://example.com/t/1/2",
|
||||||
notification_type: 1
|
notification_type: notification_type
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "correctly guesses an image if missing" do
|
||||||
|
message = execute_push(notification_type: -1)
|
||||||
|
expect(message[:icon]).to eq("/assets/push-notifications/discourse.png")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "correctly finds image if exists" do
|
||||||
|
message = execute_push(notification_type: 1)
|
||||||
|
expect(message[:icon]).to eq("/assets/push-notifications/mentioned.png")
|
||||||
|
end
|
||||||
|
|
||||||
it "sends notification in user's locale" do
|
it "sends notification in user's locale" do
|
||||||
SiteSetting.allow_user_locale = true
|
SiteSetting.allow_user_locale = true
|
||||||
user.update!(locale: 'pt_BR')
|
user.update!(locale: 'pt_BR')
|
||||||
|
|
Loading…
Reference in New Issue