FEATURE: Send notification when member was accepted to group. (#7503)

FEATURE: Send notification when member was accepted to group. (#7503)

diff --git a/app/assets/javascripts/discourse-common/lib/icon-library.js.es6 b/app/assets/javascripts/discourse-common/lib/icon-library.js.es6
index a875180..e945fc2 100644
--- a/app/assets/javascripts/discourse-common/lib/icon-library.js.es6
+++ b/app/assets/javascripts/discourse-common/lib/icon-library.js.es6
@@ -35,7 +35,8 @@ const REPLACEMENTS = {
   "notification.topic_reminder": "far-clock",
   "notification.watching_first_post": "far-dot-circle",
   "notification.group_message_summary": "group",
-  "notification.post_approved": "check"
+  "notification.post_approved": "check",
+  "notification.group_invite": "user-plus"
 };
 
 // TODO: use lib/svg_sprite/fa4-renames.json here
diff --git a/app/assets/javascripts/discourse/components/concerns/notification-types.js.es6.erb b/app/assets/javascripts/discourse/components/concerns/notification-types.js.es6.erb
new file mode 100644
index 0000000..476ea70
--- /dev/null
+++ b/app/assets/javascripts/discourse/components/concerns/notification-types.js.es6.erb
@@ -0,0 +1,3 @@
+<% Notification.types.each do |key, value| %>
+export const <%= key.upcase %>_TYPE = <%= value %>;
+<% end %>
diff --git a/app/assets/javascripts/discourse/widgets/notification-item.js.es6 b/app/assets/javascripts/discourse/widgets/notification-item.js.es6
index a298e1a..e727659 100644
--- a/app/assets/javascripts/discourse/widgets/notification-item.js.es6
+++ b/app/assets/javascripts/discourse/widgets/notification-item.js.es6
@@ -10,13 +10,15 @@ import {
   formatUsername
 } from "discourse/lib/utilities";
 import { setTransientHeader } from "discourse/lib/ajax";
-import { userPath } from "discourse/lib/url";
+import { groupPath, userPath } from "discourse/lib/url";
 import { iconNode } from "discourse-common/lib/icon-library";
-
-const LIKED_TYPE = 5;
-const INVITED_TYPE = 8;
-const GROUP_SUMMARY_TYPE = 16;
-export const LIKED_CONSOLIDATED_TYPE = 19;
+import {
+  LIKED_TYPE,
+  INVITED_TYPE,
+  GROUP_SUMMARY_TYPE,
+  LIKED_CONSOLIDATED_TYPE,
+  GROUP_INVITE_TYPE
+} from "discourse/components/concerns/notification-types";
 
 createWidget("notification-item", {
   tagName: "li",
@@ -72,6 +74,10 @@ createWidget("notification-item", {
       );
     }
 
+    if (attrs.notification_type === GROUP_INVITE_TYPE) {
+      return groupPath(data.group_name);
+    }
+
     if (data.group_id) {
       return userPath(data.username + "/messages/group/" + data.group_name);
     }
@@ -114,8 +120,11 @@ createWidget("notification-item", {
 
     if (notificationType === GROUP_SUMMARY_TYPE) {
       const count = data.inbox_count;
-      const group_name = data.group_name;
-      return I18n.t(scope, { count, group_name });
+      const groupName = data.group_name;
+      return I18n.t(scope, { count, group_name: groupName });
+    } else if (notificationType === GROUP_INVITE_TYPE) {
+      const groupName = data.group_name;
+      return I18n.t(scope, { group_name: groupName });
     }
 
     const username = formatUsername(data.display_username);
diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index 7a632eb..5cdfb6d 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -341,7 +341,7 @@ class GroupsController < ApplicationController
       raise Discourse::InvalidParameters.new(:user_id) if user.blank?
 
       if params[:accept]
-        group.add(user)
+        group.add(user, notify: true)
         GroupActionLogger.new(current_user, group).log_add_user_to_group(user)
       end
 
diff --git a/app/models/group.rb b/app/models/group.rb
index bb0adf7..04327c9 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -506,9 +506,20 @@ class Group < ActiveRecord::Base
 
   PUBLISH_CATEGORIES_LIMIT = 10
 
-  def add(user)
+  def add(user, notify: false)
     self.users.push(user) unless self.users.include?(user)
 
+    if notify
+      Notification.create!(
+        notification_type: Notification.types[:group_invite],
+        user_id: user.id,
+        data: {
+          group_id: id,
+          group_name: name
+        }.to_json
+      )
+    end
+
     if self.categories.count < PUBLISH_CATEGORIES_LIMIT
       MessageBus.publish('/categories', {
         categories: ActiveModel::ArraySerializer.new(self.categories).as_json
diff --git a/app/models/notification.rb b/app/models/notification.rb
index c54d449..c0be484 100644
--- a/app/models/notification.rb
+++ b/app/models/notification.rb
@@ -63,7 +63,8 @@ class Notification < ActiveRecord::Base
                         watching_first_post: 17,
                         topic_reminder: 18,
                         liked_consolidated: 19,
-                        post_approved: 20
+                        post_approved: 20,
+                        group_invite: 21
                        )
   end
 
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 1d16b9b..dbbf6dd 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -1689,6 +1689,7 @@ en:
       granted_badge: "Earned '{{description}}'"
       topic_reminder: "<span>{{username}}</span> {{description}}"
       watching_first_post: "<span>New Topic</span> {{description}}"
+      group_invite: "Invited to '{{group_name}}'"
 
       group_message_summary:
         one: "{{count}} message in your {{group_name}} inbox"
diff --git a/test/javascripts/fixtures/notification_fixtures.js.es6 b/test/javascripts/fixtures/notification_fixtures.js.es6
index 0ebf8bd..5e3c1bd 100644
--- a/test/javascripts/fixtures/notification_fixtures.js.es6
+++ b/test/javascripts/fixtures/notification_fixtures.js.es6
@@ -1,5 +1,5 @@
 /*jshint maxlen:10000000 */
-import { LIKED_CONSOLIDATED_TYPE } from "discourse/widgets/notification-item";
+import { LIKED_CONSOLIDATED_TYPE } from "discourse/components/concerns/notification-types";
 
 export default {
   "/notifications": {
diff --git a/test/javascripts/fixtures/site-fixtures.js.es6 b/test/javascripts/fixtures/site-fixtures.js.es6
index 25d1dc3..a567dcd 100644
--- a/test/javascripts/fixtures/site-fixtures.js.es6
+++ b/test/javascripts/fixtures/site-fixtures.js.es6
@@ -1,4 +1,4 @@
-import { LIKED_CONSOLIDATED_TYPE } from "discourse/widgets/notification-item";
+import { LIKED_CONSOLIDATED_TYPE } from "discourse/components/concerns/notification-types";
 
 export default {
   "site.json": {

GitHub sha: 42c82d54

This commit has been mentioned on Discourse Meta. There might be relevant details there:

Revert "FEATURE: Send notification when member was accepted to group. (#7503)"