@selfcommunity/react-ui 0.7.9-alpha.8 → 0.7.9-alpha.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/lib/cjs/components/AccountRecover/AccountRecover.js +6 -1
  2. package/lib/cjs/components/BottomNavigation/BottomNavigation.js +4 -3
  3. package/lib/cjs/components/CategoryHeader/Skeleton.js +3 -2
  4. package/lib/cjs/components/ChangeGroupCover/ChangeGroupCover.js +6 -6
  5. package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +19 -16
  6. package/lib/cjs/components/Composer/Attributes/Attributes.js +3 -3
  7. package/lib/cjs/components/Composer/Composer.js +3 -3
  8. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -1
  9. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +9 -19
  10. package/lib/cjs/components/Editor/Editor.js +2 -0
  11. package/lib/cjs/components/Editor/nodes/ImageNode.js +6 -0
  12. package/lib/cjs/components/Editor/plugins/ImagePlugin.js +4 -0
  13. package/lib/cjs/components/Editor/plugins/ToolbarPlugin.js +17 -3
  14. package/lib/cjs/components/FeedObject/Actions/Share/Share.js +18 -16
  15. package/lib/cjs/components/FeedObject/Contributors/Contributors.js +1 -1
  16. package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
  17. package/lib/cjs/components/FeedObject/FeedObject.js +27 -8
  18. package/lib/cjs/components/FeedObject/Poll/Poll.js +20 -20
  19. package/lib/cjs/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  20. package/lib/cjs/components/Footer/Footer.js +1 -1
  21. package/lib/cjs/components/Group/Group.d.ts +9 -1
  22. package/lib/cjs/components/Group/Group.js +18 -6
  23. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.d.ts +0 -1
  24. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +1 -2
  25. package/lib/cjs/components/GroupForm/GroupForm.js +64 -13
  26. package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -6
  27. package/lib/cjs/components/GroupHeader/GroupHeader.js +53 -12
  28. package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +63 -9
  29. package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +31 -9
  30. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +73 -0
  31. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.js +220 -0
  32. package/lib/cjs/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  33. package/lib/cjs/components/GroupInvitedWidget/Skeleton.js +38 -0
  34. package/lib/cjs/components/GroupInvitedWidget/constants.d.ts +1 -0
  35. package/lib/cjs/components/GroupInvitedWidget/constants.js +4 -0
  36. package/lib/cjs/components/GroupInvitedWidget/index.d.ts +4 -0
  37. package/lib/cjs/components/GroupInvitedWidget/index.js +8 -0
  38. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  39. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +8 -3
  40. package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +25 -4
  41. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +12 -7
  42. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +19 -9
  43. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  44. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +151 -0
  45. package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
  46. package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
  47. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  48. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +30 -11
  49. package/lib/cjs/components/Groups/Groups.d.ts +15 -8
  50. package/lib/cjs/components/Groups/Groups.js +86 -32
  51. package/lib/cjs/components/Groups/Skeleton.d.ts +4 -0
  52. package/lib/cjs/components/Groups/Skeleton.js +2 -2
  53. package/lib/cjs/components/InlineComposerWidget/InlineComposerWidget.js +7 -0
  54. package/lib/cjs/components/NavigationSettingsIconButton/NavigationSettingsIconButton.js +4 -4
  55. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.js +9 -2
  56. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +1 -0
  57. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +9 -1
  58. package/lib/cjs/components/Notification/Group/Group.d.ts +15 -0
  59. package/lib/cjs/components/Notification/Group/Group.js +78 -0
  60. package/lib/cjs/components/Notification/Group/index.d.ts +3 -0
  61. package/lib/cjs/components/Notification/Group/index.js +5 -0
  62. package/lib/cjs/components/Notification/Notification.js +31 -1
  63. package/lib/cjs/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  64. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +7 -1
  65. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +16 -8
  66. package/lib/cjs/components/PrivateMessageSettingsIconButton/PrivateMessageSettingsIconButton.js +1 -1
  67. package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  68. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +9 -4
  69. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +24 -6
  70. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  71. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +46 -20
  72. package/lib/cjs/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +6 -0
  73. package/lib/cjs/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  74. package/lib/cjs/components/SnippetNotifications/SnippetNotifications.js +7 -0
  75. package/lib/cjs/components/ToastNotifications/ToastNotifications.js +7 -0
  76. package/lib/cjs/components/User/User.d.ts +6 -1
  77. package/lib/cjs/components/User/User.js +5 -4
  78. package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
  79. package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.js +46 -0
  80. package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
  81. package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +183 -0
  82. package/lib/cjs/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
  83. package/lib/cjs/components/UserSubscribedGroupsWidget/constants.js +4 -0
  84. package/lib/cjs/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
  85. package/lib/cjs/components/UserSubscribedGroupsWidget/index.js +8 -0
  86. package/lib/cjs/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
  87. package/lib/cjs/constants/PubSub.d.ts +28 -0
  88. package/lib/cjs/constants/PubSub.js +22 -0
  89. package/lib/cjs/index.d.ts +6 -3
  90. package/lib/cjs/index.js +13 -4
  91. package/lib/cjs/types/index.d.ts +2 -1
  92. package/lib/esm/components/AccountRecover/AccountRecover.js +6 -1
  93. package/lib/esm/components/BottomNavigation/BottomNavigation.js +5 -4
  94. package/lib/esm/components/CategoryHeader/Skeleton.js +3 -2
  95. package/lib/esm/components/ChangeGroupCover/ChangeGroupCover.js +6 -6
  96. package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +19 -16
  97. package/lib/esm/components/Composer/Attributes/Attributes.js +3 -3
  98. package/lib/esm/components/Composer/Composer.js +3 -3
  99. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -1
  100. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +9 -19
  101. package/lib/esm/components/Editor/Editor.js +2 -0
  102. package/lib/esm/components/Editor/nodes/ImageNode.js +6 -0
  103. package/lib/esm/components/Editor/plugins/ImagePlugin.js +4 -0
  104. package/lib/esm/components/Editor/plugins/ToolbarPlugin.js +19 -5
  105. package/lib/esm/components/FeedObject/Actions/Share/Share.js +19 -17
  106. package/lib/esm/components/FeedObject/Contributors/Contributors.js +1 -1
  107. package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
  108. package/lib/esm/components/FeedObject/FeedObject.js +28 -9
  109. package/lib/esm/components/FeedObject/Poll/Poll.js +20 -20
  110. package/lib/esm/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  111. package/lib/esm/components/Footer/Footer.js +2 -2
  112. package/lib/esm/components/Group/Group.d.ts +9 -1
  113. package/lib/esm/components/Group/Group.js +22 -10
  114. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.d.ts +0 -1
  115. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +1 -2
  116. package/lib/esm/components/GroupForm/GroupForm.js +64 -13
  117. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -6
  118. package/lib/esm/components/GroupHeader/GroupHeader.js +55 -14
  119. package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +63 -9
  120. package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +31 -9
  121. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +73 -0
  122. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.js +217 -0
  123. package/lib/esm/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  124. package/lib/esm/components/GroupInvitedWidget/Skeleton.js +34 -0
  125. package/lib/esm/components/GroupInvitedWidget/constants.d.ts +1 -0
  126. package/lib/esm/components/GroupInvitedWidget/constants.js +1 -0
  127. package/lib/esm/components/GroupInvitedWidget/index.d.ts +4 -0
  128. package/lib/esm/components/GroupInvitedWidget/index.js +4 -0
  129. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  130. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +9 -4
  131. package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +26 -5
  132. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +12 -7
  133. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +19 -9
  134. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  135. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +148 -0
  136. package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
  137. package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
  138. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  139. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +30 -11
  140. package/lib/esm/components/Groups/Groups.d.ts +15 -8
  141. package/lib/esm/components/Groups/Groups.js +91 -37
  142. package/lib/esm/components/Groups/Skeleton.d.ts +4 -0
  143. package/lib/esm/components/Groups/Skeleton.js +2 -2
  144. package/lib/esm/components/InlineComposerWidget/InlineComposerWidget.js +9 -2
  145. package/lib/esm/components/NavigationSettingsIconButton/NavigationSettingsIconButton.js +4 -4
  146. package/lib/esm/components/NavigationToolbar/NavigationToolbar.js +10 -3
  147. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +1 -0
  148. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +11 -3
  149. package/lib/esm/components/Notification/Group/Group.d.ts +15 -0
  150. package/lib/esm/components/Notification/Group/Group.js +75 -0
  151. package/lib/esm/components/Notification/Group/index.d.ts +3 -0
  152. package/lib/esm/components/Notification/Group/index.js +2 -0
  153. package/lib/esm/components/Notification/Notification.js +31 -1
  154. package/lib/esm/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  155. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +7 -1
  156. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +17 -9
  157. package/lib/esm/components/PrivateMessageSettingsIconButton/PrivateMessageSettingsIconButton.js +1 -1
  158. package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  159. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +9 -4
  160. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
  161. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  162. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +48 -22
  163. package/lib/esm/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +7 -1
  164. package/lib/esm/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  165. package/lib/esm/components/SnippetNotifications/SnippetNotifications.js +7 -0
  166. package/lib/esm/components/ToastNotifications/ToastNotifications.js +7 -0
  167. package/lib/esm/components/User/User.d.ts +6 -1
  168. package/lib/esm/components/User/User.js +5 -4
  169. package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
  170. package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.js +42 -0
  171. package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
  172. package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +180 -0
  173. package/lib/esm/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
  174. package/lib/esm/components/UserSubscribedGroupsWidget/constants.js +1 -0
  175. package/lib/esm/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
  176. package/lib/esm/components/UserSubscribedGroupsWidget/index.js +4 -0
  177. package/lib/esm/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
  178. package/lib/esm/constants/PubSub.d.ts +28 -0
  179. package/lib/esm/constants/PubSub.js +19 -0
  180. package/lib/esm/index.d.ts +6 -3
  181. package/lib/esm/index.js +6 -3
  182. package/lib/esm/types/index.d.ts +2 -1
  183. package/lib/umd/311.js +2 -0
  184. package/lib/umd/react-ui.js +1 -1
  185. package/package.json +9 -9
  186. package/lib/umd/871.js +0 -2
  187. /package/lib/umd/{871.js.LICENSE.txt → 311.js.LICENSE.txt} +0 -0
@@ -57,7 +57,7 @@ function PrivateMessageComponent(inProps) {
57
57
  props: inProps,
58
58
  name: constants_1.PREFIX
59
59
  });
60
- const { id = null, className = null, onItemClick = null, onThreadBack = null, onSingleMessageOpen = null } = props, rest = tslib_1.__rest(props, ["id", "className", "onItemClick", "onThreadBack", "onSingleMessageOpen"]);
60
+ const { id = null, type = null, className = null, onItemClick = null, onThreadBack = null, onSingleMessageOpen = null } = props, rest = tslib_1.__rest(props, ["id", "type", "className", "onItemClick", "onThreadBack", "onSingleMessageOpen"]);
61
61
  // CONTEXT
62
62
  const scUserContext = (0, react_core_1.useSCUser)();
63
63
  const scPreferences = (0, react_core_1.useSCPreferences)();
@@ -67,6 +67,7 @@ function PrivateMessageComponent(inProps) {
67
67
  const isMobile = (0, material_1.useMediaQuery)(theme.breakpoints.down('md'));
68
68
  const [layout, setLayout] = (0, react_1.useState)('default');
69
69
  const [obj, setObj] = (0, react_1.useState)(id !== null && id !== void 0 ? id : null);
70
+ const [_type, _setType] = (0, react_1.useState)(type);
70
71
  const isNew = obj && obj === types_1.SCPrivateMessageStatusType.NEW;
71
72
  const [openNewMessage, setOpenNewMessage] = (0, react_1.useState)(isNew !== null && isNew !== void 0 ? isNew : false);
72
73
  const mobileSnippetsView = (layout === 'default' && !obj) || (layout === 'mobile' && !obj);
@@ -84,14 +85,19 @@ function PrivateMessageComponent(inProps) {
84
85
  (0, react_1.useEffect)(() => {
85
86
  setObj(id !== null && id !== void 0 ? id : null);
86
87
  }, [id]);
88
+ (0, react_1.useEffect)(() => {
89
+ _setType(type !== null && type !== void 0 ? type : null);
90
+ }, [type]);
87
91
  // HANDLERS
88
92
  /**
89
93
  * Handles thread opening on click
90
94
  * @param item
95
+ * @param type
91
96
  */
92
- const handleThreadOpening = (item) => {
93
- onItemClick && onItemClick(messageReceiver(item, authUserId));
94
- setObj(messageReceiver(item, authUserId));
97
+ const handleThreadOpening = (item, type) => {
98
+ onItemClick && onItemClick(item.group ? item.group.id : messageReceiver(item, authUserId), type);
99
+ _setType(type);
100
+ setObj(item.group ? item : messageReceiver(item, authUserId));
95
101
  setOpenNewMessage(false);
96
102
  };
97
103
  /**
@@ -107,7 +113,8 @@ function PrivateMessageComponent(inProps) {
107
113
  const handleOpenNewMessage = () => {
108
114
  setOpenNewMessage(!openNewMessage);
109
115
  setObj(types_1.SCPrivateMessageStatusType.NEW);
110
- onItemClick && onItemClick(types_1.SCPrivateMessageStatusType.NEW);
116
+ _setType(types_1.SCPrivateMessageType.NEW);
117
+ onItemClick && onItemClick(types_1.SCPrivateMessageStatusType.NEW, types_1.SCPrivateMessageType.NEW);
111
118
  };
112
119
  /**
113
120
  * Handles new messages open from user profile page or notifications section
@@ -123,13 +130,14 @@ function PrivateMessageComponent(inProps) {
123
130
  id && setLayout('mobile');
124
131
  setOpenNewMessage(false);
125
132
  setObj(null);
133
+ _setType(null);
126
134
  onThreadBack && onThreadBack();
127
135
  };
128
136
  /**
129
137
  * Handles state update when a new message is sent
130
138
  */
131
139
  const handleOnNewMessageSent = (msg, isOne) => {
132
- onItemClick && onItemClick(isOne ? messageReceiver(msg, authUserId) : '');
140
+ onItemClick && onItemClick(isOne ? messageReceiver(msg, authUserId) : '', msg.group ? types_1.SCPrivateMessageType.GROUP : types_1.SCPrivateMessageType.USER);
133
141
  setObj(isOne ? messageReceiver(msg, authUserId) : null);
134
142
  setOpenNewMessage(false);
135
143
  };
@@ -149,14 +157,14 @@ function PrivateMessageComponent(inProps) {
149
157
  onSnippetClick: handleThreadOpening,
150
158
  onNewMessageClick: handleOpenNewMessage,
151
159
  onDeleteConfirm: handleDeleteThread
152
- }, userObj: obj, clearSearch: clear, elevation: 0 })));
160
+ }, threadObj: obj, clearSearch: clear, elevation: 0, type: _type })));
153
161
  }
154
162
  /**
155
163
  * Renders thread section
156
164
  */
157
165
  function renderThread() {
158
166
  return (react_1.default.createElement(material_1.Grid, { item: true, xs: 12, md: 7, className: (0, classnames_1.default)(classes.threadBox, { [classes.hide]: isMobile && mobileSnippetsView }) },
159
- react_1.default.createElement(PrivateMessageThread_1.default, { userObj: obj, openNewMessage: openNewMessage, onNewMessageClose: handleMessageBack, onNewMessageSent: handleOnNewMessageSent, onSingleMessageOpen: handleSingleMessage, elevation: 0 })));
167
+ react_1.default.createElement(PrivateMessageThread_1.default, { threadObj: obj, type: _type, openNewMessage: openNewMessage, onNewMessageClose: handleMessageBack, onNewMessageSent: handleOnNewMessageSent, onSingleMessageOpen: handleSingleMessage, elevation: 0 })));
160
168
  }
161
169
  /**
162
170
  * Renders the component (if not hidden by autoHide prop)
@@ -116,7 +116,7 @@ function PrivateMessageSettingsIconButton(inProps) {
116
116
  }
117
117
  else {
118
118
  return [
119
- user && (react_1.default.createElement(material_1.MenuItem, { className: classes.item, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, user), key: "profile" },
119
+ user && (react_1.default.createElement(material_1.MenuItem, { className: classes.item, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, user), key: "profile", onClick: handleCloseDialog },
120
120
  react_1.default.createElement(material_1.ListItemIcon, null,
121
121
  react_1.default.createElement(Icon_1.default, { fontSize: "small" }, "people_alt")),
122
122
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.privateMessageSettingsIconButton.item.profile", defaultMessage: "ui.privateMessageSettingsIconButton.item.profile" }))),
@@ -74,10 +74,12 @@ function PrivateMessageSnippetItem(inProps) {
74
74
  // STATE
75
75
  const hasBadge = () => {
76
76
  var _a;
77
- if ((message === null || message === void 0 ? void 0 : message.receiver.id) !== ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id)) {
78
- return message === null || message === void 0 ? void 0 : message.receiver.community_badge;
77
+ if (message.receiver) {
78
+ if ((message === null || message === void 0 ? void 0 : message.receiver.id) !== ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id)) {
79
+ return message === null || message === void 0 ? void 0 : message.receiver.community_badge;
80
+ }
81
+ return message === null || message === void 0 ? void 0 : message.sender.community_badge;
79
82
  }
80
- return message === null || message === void 0 ? void 0 : message.sender.community_badge;
81
83
  };
82
84
  if (!message) {
83
85
  return react_1.default.createElement(Skeleton_1.default, { elevation: 0 });
@@ -88,10 +90,13 @@ function PrivateMessageSnippetItem(inProps) {
88
90
  return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, rest, { secondaryAction: secondaryAction, disablePadding: true }),
89
91
  react_1.default.createElement(material_1.ListItemButton, { onClick: onItemClick, classes: { root: (0, classnames_1.default)({ [classes.unread]: message.thread_status === types_1.SCPrivateMessageStatusType.NEW }) } },
90
92
  react_1.default.createElement(material_1.ListItemAvatar, null,
91
- react_1.default.createElement(UserAvatar_1.default, { hide: !hasBadge() },
92
- react_1.default.createElement(material_1.Avatar, { alt: ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) === message.receiver.username ? message.sender.username : message.receiver.username, src: ((_b = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _b === void 0 ? void 0 : _b.username) === message.receiver.username ? message.sender.avatar : message.receiver.avatar }))),
93
+ react_1.default.createElement(UserAvatar_1.default, { hide: !hasBadge() }, message.group ? (react_1.default.createElement(material_1.Avatar, { alt: message.group.name, src: message.group.image_big })) : (react_1.default.createElement(material_1.Avatar, { alt: ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) === message.receiver.username ? message.sender.username : message.receiver.username, src: ((_b = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _b === void 0 ? void 0 : _b.username) === message.receiver.username ? message.sender.avatar : message.receiver.avatar })))),
93
94
  react_1.default.createElement(material_1.ListItemText, { primary: react_1.default.createElement(react_1.default.Fragment, null,
94
- react_1.default.createElement(material_1.Typography, { component: "span", className: classes.username }, ((_c = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _c === void 0 ? void 0 : _c.username) === message.receiver.username ? message.sender.username : message.receiver.username),
95
+ react_1.default.createElement(material_1.Typography, { component: "span", className: classes.username }, message.group
96
+ ? message.group.name
97
+ : ((_c = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _c === void 0 ? void 0 : _c.username) === message.receiver.username
98
+ ? message.sender.username
99
+ : message.receiver.username),
95
100
  hasBadge() && preferences && (react_1.default.createElement(material_1.Chip, { component: "span", className: classes.badgeLabel, size: "small", label: preferences[react_core_1.SCPreferences.STAFF_STAFF_BADGE_LABEL] })),
96
101
  react_1.default.createElement(material_1.Typography, { color: "secondary", className: classes.time, component: "span" }, `${intl.formatDate(message.last_message_at, {
97
102
  day: '2-digit',
@@ -1,5 +1,5 @@
1
1
  import { CardProps } from '@mui/material';
2
- import { SCPrivateMessageSnippetType } from '@selfcommunity/types';
2
+ import { SCPrivateMessageSnippetType, SCPrivateMessageType } from '@selfcommunity/types';
3
3
  export interface PrivateMessageSnippetsProps extends CardProps {
4
4
  /**
5
5
  * Snippets list
@@ -20,7 +20,7 @@ export interface PrivateMessageSnippetsProps extends CardProps {
20
20
  *
21
21
  */
22
22
  snippetActions?: {
23
- onSnippetClick?: (msg: any) => void;
23
+ onSnippetClick?: (msg: any, type: any) => void;
24
24
  onNewMessageClick?: () => void;
25
25
  onDeleteConfirm?: (msg: any) => void;
26
26
  };
@@ -29,10 +29,15 @@ export interface PrivateMessageSnippetsProps extends CardProps {
29
29
  */
30
30
  [p: string]: any;
31
31
  /**
32
- * thread user object
32
+ * thread user/ group object
33
33
  * @default null
34
34
  */
35
- userObj?: any;
35
+ threadObj?: any;
36
+ /**
37
+ * Thread type
38
+ * @default SCPrivateMessageType.USER
39
+ */
40
+ type?: SCPrivateMessageType;
36
41
  }
37
42
  /**
38
43
  * > API documentation for the Community-JS PrivateMessageSnippets component. Learn about the available props and the CSS API.
@@ -71,25 +71,30 @@ function PrivateMessageSnippets(inProps) {
71
71
  props: inProps,
72
72
  name: constants_1.PREFIX
73
73
  });
74
- const { className = null, userObj = null, snippetActions, clearSearch } = props, rest = tslib_1.__rest(props, ["className", "userObj", "snippetActions", "clearSearch"]);
74
+ const { className = null, threadObj = null, type = null, snippetActions, clearSearch } = props, rest = tslib_1.__rest(props, ["className", "threadObj", "type", "snippetActions", "clearSearch"]);
75
75
  // STATE
76
76
  const theme = (0, material_1.useTheme)();
77
77
  const isMobile = (0, useMediaQuery_1.default)(theme.breakpoints.down('md'));
78
78
  const { data, updateSnippets } = (0, react_core_1.useSCFetchPrivateMessageSnippets)({ cacheStrategy: utils_1.CacheStrategies.CACHE_FIRST });
79
79
  const [search, setSearch] = (0, react_1.useState)('');
80
- const isObj = typeof userObj === 'object';
80
+ const isObj = typeof threadObj === 'object';
81
81
  const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
82
82
  const authUserId = scUserContext.user ? scUserContext.user.id : null;
83
+ const [_type, _setType] = (0, react_1.useState)(type);
83
84
  // INTL
84
85
  const intl = (0, react_intl_1.useIntl)();
85
86
  // REFS
86
87
  const refreshSubscription = (0, react_1.useRef)(null);
87
88
  // CONST
88
89
  const filteredSnippets = data.snippets.filter((el) => {
90
+ var _a;
89
91
  if (search === '') {
90
92
  return el;
91
93
  }
92
- else if (el.receiver.id === authUserId) {
94
+ else if (el.group) {
95
+ return el.group.slug.includes(search.toLowerCase());
96
+ }
97
+ else if (((_a = el === null || el === void 0 ? void 0 : el.receiver) === null || _a === void 0 ? void 0 : _a.id) === authUserId) {
93
98
  return el.sender.username.includes(search.toLowerCase());
94
99
  }
95
100
  return el.receiver.username.includes(search.toLowerCase());
@@ -101,6 +106,18 @@ function PrivateMessageSnippets(inProps) {
101
106
  }
102
107
  return ((_b = item === null || item === void 0 ? void 0 : item.receiver) === null || _b === void 0 ? void 0 : _b.id) !== loggedUserId ? (_c = item === null || item === void 0 ? void 0 : item.receiver) === null || _c === void 0 ? void 0 : _c.id : (_d = item === null || item === void 0 ? void 0 : item.sender) === null || _d === void 0 ? void 0 : _d.id;
103
108
  };
109
+ const isSelected = (0, react_1.useMemo)(() => {
110
+ return (message) => {
111
+ var _a, _b;
112
+ if (threadObj && _type === types_1.SCPrivateMessageType.GROUP) {
113
+ return ((_a = message === null || message === void 0 ? void 0 : message.group) === null || _a === void 0 ? void 0 : _a.id) === (isObj ? (_b = threadObj === null || threadObj === void 0 ? void 0 : threadObj.group) === null || _b === void 0 ? void 0 : _b.id : threadObj);
114
+ }
115
+ else if (threadObj && threadObj !== types_1.SCPrivateMessageType.NEW) {
116
+ return messageReceiver(message, authUserId) === (isObj ? messageReceiver(threadObj, authUserId) : threadObj);
117
+ }
118
+ return null;
119
+ };
120
+ }, [threadObj, authUserId, _type]);
104
121
  //HANDLERS
105
122
  const handleChange = (event) => {
106
123
  setSearch(event.target.value);
@@ -116,7 +133,9 @@ function PrivateMessageSnippets(inProps) {
116
133
  snippetActions && snippetActions.onDeleteConfirm(msg);
117
134
  };
118
135
  function handleOpenThread(msg) {
119
- snippetActions && snippetActions.onSnippetClick(msg);
136
+ const threadType = msg.group !== null ? types_1.SCPrivateMessageType.GROUP : types_1.SCPrivateMessageType.USER;
137
+ _setType(threadType);
138
+ snippetActions && snippetActions.onSnippetClick(msg, threadType);
120
139
  handleClear();
121
140
  updateSnippetsParams(msg.id, 'seen');
122
141
  }
@@ -221,7 +240,6 @@ function PrivateMessageSnippets(inProps) {
221
240
  } }),
222
241
  react_1.default.createElement(material_1.List, null, filteredSnippets.map((message) => (react_1.default.createElement(PrivateMessageSnippetItem_1.default, { message: message, key: message.id, onItemClick: () => handleOpenThread(message), secondaryAction: react_1.default.createElement(react_1.default.Fragment, null,
223
242
  message.thread_status === types_1.SCPrivateMessageStatusType.NEW && (react_1.default.createElement(material_1.Icon, { fontSize: "small", color: "secondary" }, "fiber_manual_record")),
224
- !isMobile && (react_1.default.createElement(PrivateMessageSettingsIconButton_1.default, { threadToDelete: messageReceiver(message, authUserId), onItemDeleteConfirm: () => handleDeleteConversation(messageReceiver(message, authUserId)), user: messageReceiver(message, authUserId, true) }))), selected: userObj !== types_1.SCPrivateMessageStatusType.NEW &&
225
- messageReceiver(message, authUserId) === (isObj ? messageReceiver(userObj, authUserId) : userObj) })))))))));
243
+ !isMobile && (react_1.default.createElement(PrivateMessageSettingsIconButton_1.default, { threadToDelete: messageReceiver(message, authUserId), onItemDeleteConfirm: () => handleDeleteConversation(messageReceiver(message, authUserId)), user: messageReceiver(message, authUserId, true) }))), selected: isSelected(message) })))))))));
226
244
  }
227
245
  exports.default = PrivateMessageSnippets;
@@ -1,10 +1,11 @@
1
+ import { SCPrivateMessageType } from '@selfcommunity/types';
1
2
  import { CardProps } from '@mui/material';
2
3
  export interface PrivateMessageThreadProps extends CardProps {
3
4
  /**
4
5
  * Thread object or thread id
5
6
  * default null
6
7
  */
7
- userObj?: any;
8
+ threadObj?: any;
8
9
  /**
9
10
  * Overrides or extends the styles applied to the component.
10
11
  * @default null
@@ -30,6 +31,10 @@ export interface PrivateMessageThreadProps extends CardProps {
30
31
  * @default null
31
32
  */
32
33
  onSingleMessageOpen?: (open: boolean) => void;
34
+ /**
35
+ * The Thread type
36
+ */
37
+ type?: SCPrivateMessageType;
33
38
  /**
34
39
  * Any other properties
35
40
  */
@@ -43,6 +43,8 @@ const classes = {
43
43
  newMessageContent: `${constants_1.PREFIX}-new-message-content`,
44
44
  sender: `${constants_1.PREFIX}-sender`,
45
45
  receiver: `${constants_1.PREFIX}-receiver`,
46
+ avatar: `${constants_1.PREFIX}-avatar`,
47
+ item: `${constants_1.PREFIX}-item`,
46
48
  autocomplete: `${constants_1.PREFIX}-autocomplete`,
47
49
  autocompleteDialog: `${constants_1.PREFIX}-autocomplete-dialog`,
48
50
  editor: `${constants_1.PREFIX}-editor`
@@ -95,7 +97,7 @@ function PrivateMessageThread(inProps) {
95
97
  props: inProps,
96
98
  name: constants_1.PREFIX
97
99
  });
98
- const { userObj, openNewMessage = false, onNewMessageClose = null, onNewMessageSent = null, onSingleMessageOpen = null, className } = props, rest = tslib_1.__rest(props, ["userObj", "openNewMessage", "onNewMessageClose", "onNewMessageSent", "onSingleMessageOpen", "className"]);
100
+ const { threadObj, openNewMessage = false, onNewMessageClose = null, onNewMessageSent = null, onSingleMessageOpen = null, className, type } = props, rest = tslib_1.__rest(props, ["threadObj", "openNewMessage", "onNewMessageClose", "onNewMessageSent", "onSingleMessageOpen", "className", "type"]);
99
101
  // CONTEXT
100
102
  const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
101
103
  // STATE
@@ -106,7 +108,7 @@ function PrivateMessageThread(inProps) {
106
108
  const [loading, setLoading] = (0, react_1.useState)(false);
107
109
  const [isHovered, setIsHovered] = (0, react_1.useState)({});
108
110
  const [followers, setFollowers] = (0, react_1.useState)([]);
109
- const isNew = userObj && userObj === types_1.SCPrivateMessageStatusType.NEW;
111
+ const isNew = threadObj && threadObj === types_1.SCPrivateMessageStatusType.NEW;
110
112
  const authUserId = scUserContext.user ? scUserContext.user.id : null;
111
113
  const [singleMessageUser, setSingleMessageUser] = (0, react_1.useState)(null);
112
114
  const [receiver, setReceiver] = (0, react_1.useState)(null);
@@ -115,7 +117,7 @@ function PrivateMessageThread(inProps) {
115
117
  const [openDeleteMessageDialog, setOpenDeleteMessageDialog] = (0, react_1.useState)(false);
116
118
  const [recipients, setRecipients] = (0, react_1.useState)([]);
117
119
  const { enqueueSnackbar, closeSnackbar } = (0, notistack_1.useSnackbar)();
118
- const isNumber = typeof userObj === 'number';
120
+ const isNumber = typeof threadObj === 'number';
119
121
  const messageReceiver = (item, loggedUserId) => {
120
122
  var _a, _b, _c;
121
123
  return ((_a = item === null || item === void 0 ? void 0 : item.receiver) === null || _a === void 0 ? void 0 : _a.id) !== loggedUserId ? (_b = item === null || item === void 0 ? void 0 : item.receiver) === null || _b === void 0 ? void 0 : _b.id : (_c = item === null || item === void 0 ? void 0 : item.sender) === null || _c === void 0 ? void 0 : _c.id;
@@ -128,7 +130,7 @@ function PrivateMessageThread(inProps) {
128
130
  // HOOKS
129
131
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
130
132
  // @ts-ignore
131
- const { scUser } = (0, react_core_1.useSCFetchUser)({ id: userObj, userObj });
133
+ const { scUser } = (0, react_core_1.useSCFetchUser)({ id: threadObj, threadObj });
132
134
  const messagesEndRef = (0, react_1.useRef)(null);
133
135
  const scrollToBottom = () => {
134
136
  var _a;
@@ -256,9 +258,9 @@ function PrivateMessageThread(inProps) {
256
258
  * Fetches thread
257
259
  */
258
260
  function fetchThread() {
259
- if (userObj && typeof userObj !== 'string') {
261
+ if (threadObj && typeof threadObj !== 'string' && type !== types_1.SCPrivateMessageType.GROUP) {
260
262
  setLoadingMessageObjs(true);
261
- const _userObjId = isNumber ? userObj : messageReceiver(userObj, authUserId);
263
+ const _userObjId = isNumber ? threadObj : messageReceiver(threadObj, authUserId);
262
264
  api_services_1.PrivateMessageService.getAThread({ user: _userObjId, limit: 10 })
263
265
  .then((res) => {
264
266
  setMessageObjs(res.results);
@@ -291,6 +293,20 @@ function PrivateMessageThread(inProps) {
291
293
  utils_1.Logger.error(Errors_1.SCOPE_SC_UI, { error });
292
294
  });
293
295
  }
296
+ else if (type === types_1.SCPrivateMessageType.GROUP) {
297
+ api_services_1.PrivateMessageService.getAThread({ group: isNumber ? threadObj : threadObj.group.id, limit: 10 })
298
+ .then((res) => {
299
+ setMessageObjs(res.results);
300
+ setPrevious(res.next && updateAndDeleteURLParameters(res.next, 'before_message', res.results[0].id, 'offset'));
301
+ setLoadingMessageObjs(false);
302
+ setSingleMessageThread(false);
303
+ })
304
+ .catch((error) => {
305
+ setLoadingMessageObjs(false);
306
+ console.log(error);
307
+ utils_1.Logger.error(Errors_1.SCOPE_SC_UI, { error });
308
+ });
309
+ }
294
310
  }
295
311
  const isNewerThan60Seconds = (creationTime) => {
296
312
  const date = new Date(creationTime);
@@ -355,11 +371,15 @@ function PrivateMessageThread(inProps) {
355
371
  .request({
356
372
  url: api_services_1.Endpoints.SendMessage.url(),
357
373
  method: api_services_1.Endpoints.SendMessage.method,
358
- data: {
359
- recipients: openNewMessage || isNew || singleMessageThread ? ids : [isNumber && userObj ? userObj : messageReceiver(userObj, authUserId)],
360
- message: message,
361
- file_uuid: file && !message ? file : null
362
- }
374
+ data: Object.assign(Object.assign({}, (type === types_1.SCPrivateMessageType.GROUP
375
+ ? { group: isNumber ? threadObj : threadObj.group.id }
376
+ : {
377
+ recipients: openNewMessage || isNew || singleMessageThread
378
+ ? ids
379
+ : [isNumber && threadObj ? threadObj : messageReceiver(threadObj, authUserId)]
380
+ })), {
381
+ // recipients: openNewMessage || isNew || singleMessageThread ? ids : [isNumber && threadObj ? threadObj : messageReceiver(threadObj, authUserId)],
382
+ message: message, file_uuid: file && !message ? file : null })
363
383
  })
364
384
  .then((res) => {
365
385
  const isOne = res.data.length <= 1;
@@ -405,13 +425,13 @@ function PrivateMessageThread(inProps) {
405
425
  if (!authUserId) {
406
426
  return;
407
427
  }
408
- if (userObj) {
428
+ if (threadObj) {
409
429
  fetchThread();
410
430
  }
411
431
  else {
412
432
  reset();
413
433
  }
414
- }, [userObj, authUserId, scUser]);
434
+ }, [threadObj, authUserId, scUser]);
415
435
  /**
416
436
  * Notification subscriber
417
437
  */
@@ -426,7 +446,7 @@ function PrivateMessageThread(inProps) {
426
446
  if (index !== -1) {
427
447
  setMessageObjs((prev) => [...prev, res.notification_obj.message]);
428
448
  }
429
- if (isNumber ? userObj === res.thread_id : userObj.id === res.thread_id) {
449
+ if (isNumber ? threadObj === res.thread_id : threadObj.id === res.thread_id) {
430
450
  scrollToBottom();
431
451
  }
432
452
  };
@@ -453,11 +473,17 @@ function PrivateMessageThread(inProps) {
453
473
  react_1.default.createElement("ul", null,
454
474
  react_1.default.createElement(material_1.ListSubheader, null,
455
475
  react_1.default.createElement(material_1.Typography, { align: "center", className: classes.subHeader }, key)),
456
- formattedMessages[key].map((msg) => (react_1.default.createElement(PrivateMessageThreadItem_1.default, { className: authUserId === msg.sender.id ? classes.sender : classes.receiver, message: msg, key: msg.id, mouseEvents: {
457
- onMouseEnter: () => handleMouseEnter(msg.id),
458
- onMouseLeave: () => handleMouseLeave(msg.id)
459
- }, isHovering: isHovered[msg.id], showMenuIcon: authUserId === msg.sender.id, onMenuIconClick: () => handleOpenDeleteMessageDialog(msg) }))))))))),
460
- react_1.default.createElement(PrivateMessageEditor_1.default, { className: classes.editor, send: handleSend, autoHide: !(scUser === null || scUser === void 0 ? void 0 : scUser.can_send_pm_to), autoHideDeletion: (receiver === null || receiver === void 0 ? void 0 : receiver.deleted) || (scUser === null || scUser === void 0 ? void 0 : scUser.deleted), onThreadChangeId: isNumber ? userObj : userObj.receiver.id, error: error, onErrorRemove: () => setError(false) }),
476
+ formattedMessages[key].map((msg) => {
477
+ var _a;
478
+ return (react_1.default.createElement(material_1.Box, { className: classes.item, key: msg.id },
479
+ msg.group && ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) !== msg.sender.username && (react_1.default.createElement(material_1.ListItemAvatar, null,
480
+ react_1.default.createElement(material_1.Avatar, { alt: msg.sender.username, src: msg.sender.avatar, className: classes.avatar }))),
481
+ react_1.default.createElement(PrivateMessageThreadItem_1.default, { className: authUserId === msg.sender.id ? classes.sender : classes.receiver, message: msg, key: msg.id, mouseEvents: {
482
+ onMouseEnter: () => handleMouseEnter(msg.id),
483
+ onMouseLeave: () => handleMouseLeave(msg.id)
484
+ }, isHovering: isHovered[msg.id], showMenuIcon: authUserId === msg.sender.id, onMenuIconClick: () => handleOpenDeleteMessageDialog(msg) })));
485
+ }))))))),
486
+ react_1.default.createElement(PrivateMessageEditor_1.default, { className: classes.editor, send: handleSend, autoHide: type !== types_1.SCPrivateMessageType.GROUP && !(scUser === null || scUser === void 0 ? void 0 : scUser.can_send_pm_to), autoHideDeletion: type === types_1.SCPrivateMessageType.USER && ((receiver === null || receiver === void 0 ? void 0 : receiver.deleted) || (scUser === null || scUser === void 0 ? void 0 : scUser.deleted)), onThreadChangeId: isNumber ? threadObj : type === types_1.SCPrivateMessageType.USER ? threadObj.receiver.id : threadObj.group.id, error: error, onErrorRemove: () => setError(false) }),
461
487
  openDeleteMessageDialog && (react_1.default.createElement(ConfirmDialog_1.default, { open: openDeleteMessageDialog, title: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.privateMessage.component.delete.message.dialog.msg", defaultMessage: "ui.privateMessage.component.delete.message.dialog.msg" }), btnConfirm: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.privateMessage.component.delete.message.dialog.confirm", defaultMessage: "ui.privateMessage.component.delete.message.dialog.confirm" }), onConfirm: handleDeleteMessage, onClose: handleCloseDeleteMessageDialog }))));
462
488
  }
463
489
  /**
@@ -485,6 +511,6 @@ function PrivateMessageThread(inProps) {
485
511
  /**
486
512
  * Renders the component
487
513
  */
488
- return (react_1.default.createElement(Root, Object.assign({}, rest, { className: (0, classnames_1.default)(classes.root, className) }), userObj !== null && !isNew && !singleMessageThread ? renderThread() : renderNewOrNoMessageBox()));
514
+ return (react_1.default.createElement(Root, Object.assign({}, rest, { className: (0, classnames_1.default)(classes.root, className) }), threadObj !== null && !isNew && !singleMessageThread ? renderThread() : renderNewOrNoMessageBox()));
489
515
  }
490
516
  exports.default = PrivateMessageThread;
@@ -10,6 +10,7 @@ const types_1 = require("@selfcommunity/types");
10
10
  const Icon_1 = tslib_1.__importDefault(require("@mui/material/Icon"));
11
11
  const classnames_1 = tslib_1.__importDefault(require("classnames"));
12
12
  const system_1 = require("@mui/system");
13
+ const react_core_1 = require("@selfcommunity/react-core");
13
14
  const useMediaQuery_1 = tslib_1.__importDefault(require("@mui/material/useMediaQuery"));
14
15
  const PrivateMessageSettingsIconButton_1 = tslib_1.__importDefault(require("../PrivateMessageSettingsIconButton"));
15
16
  const sizeCoverter_1 = require("../../utils/sizeCoverter");
@@ -21,6 +22,7 @@ const constants_1 = require("./constants");
21
22
  const thumbnailCoverter_1 = require("../../utils/thumbnailCoverter");
22
23
  const classes = {
23
24
  root: `${constants_1.PREFIX}-root`,
25
+ username: `${constants_1.PREFIX}-username`,
24
26
  text: `${constants_1.PREFIX}-text`,
25
27
  img: `${constants_1.PREFIX}-img`,
26
28
  document: `${constants_1.PREFIX}-document`,
@@ -72,6 +74,7 @@ const Root = (0, styles_1.styled)(material_1.ListItem, {
72
74
  * @param inProps
73
75
  */
74
76
  function PrivateMessageThreadItem(inProps) {
77
+ var _a;
75
78
  // PROPS
76
79
  const props = (0, system_1.useThemeProps)({
77
80
  props: inProps,
@@ -80,6 +83,8 @@ function PrivateMessageThreadItem(inProps) {
80
83
  const { message = null, className = null, mouseEvents = {}, isHovering = null, showMenuIcon = false, onMenuIconClick = null } = props, rest = tslib_1.__rest(props, ["message", "className", "mouseEvents", "isHovering", "showMenuIcon", "onMenuIconClick"]);
81
84
  // INTL
82
85
  const intl = (0, react_intl_1.useIntl)();
86
+ // CONTEXT
87
+ const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
83
88
  // STATE
84
89
  const theme = (0, material_1.useTheme)();
85
90
  const isMobile = (0, useMediaQuery_1.default)(theme.breakpoints.down('md'));
@@ -167,6 +172,7 @@ function PrivateMessageThreadItem(inProps) {
167
172
  return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, getMouseEvents(mouseEvents.onMouseEnter, mouseEvents.onMouseLeave), rest, { secondaryAction: (isHovering || isMobile) &&
168
173
  showMenuIcon &&
169
174
  message.status !== types_1.SCPrivateMessageStatusType.HIDDEN && react_1.default.createElement(PrivateMessageSettingsIconButton_1.default, { onMenuItemDeleteClick: handleMenuItemClick }) }),
175
+ message.group && ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) !== message.sender.username && (react_1.default.createElement(material_1.Typography, { color: "secondary", variant: "h4", className: classes.username }, message.sender.username)),
170
176
  react_1.default.createElement(react_1.default.Fragment, null,
171
177
  hasFile && message.status !== types_1.SCPrivateMessageStatusType.HIDDEN ? (renderMessageFile(message)) : (react_1.default.createElement(material_1.Box, { className: classes.text },
172
178
  react_1.default.createElement(material_1.Typography, { component: "span", dangerouslySetInnerHTML: { __html: message.message } }))),
@@ -75,6 +75,25 @@ function SearchAutocomplete(inProps) {
75
75
  setOptions([]);
76
76
  onClear && onClear();
77
77
  };
78
+ const getOptionData = (option) => {
79
+ let data = {};
80
+ if (option.type === types_1.SuggestionType.USER) {
81
+ data.name = option[types_1.SuggestionType.USER]['username'];
82
+ data.image = option[types_1.SuggestionType.USER]['avatar'];
83
+ data.variant = 'circular';
84
+ }
85
+ else if (option.type === types_1.SuggestionType.CATEGORY) {
86
+ data.name = option[types_1.SuggestionType.CATEGORY]['name'];
87
+ data.image = option[types_1.SuggestionType.CATEGORY]['image_medium'];
88
+ data.variant = 'square';
89
+ }
90
+ else if (option.type === types_1.SuggestionType.GROUP) {
91
+ data.name = option[types_1.SuggestionType.GROUP]['name'];
92
+ data.image = option[types_1.SuggestionType.GROUP]['image_big'];
93
+ data.variant = 'circular';
94
+ }
95
+ return data;
96
+ };
78
97
  function fetchResults() {
79
98
  setIsLoading(true);
80
99
  api_services_1.SuggestionService.getSearchSuggestion(value)
@@ -98,11 +117,9 @@ function SearchAutocomplete(inProps) {
98
117
  return option;
99
118
  }
100
119
  return (_a = option[option.type]['username']) !== null && _a !== void 0 ? _a : option[option.type]['name'];
101
- }, renderOption: (props, option) => (react_1.default.createElement(material_1.Box, Object.assign({ component: "li" }, props), option.type === types_1.SuggestionType.USER ? (react_1.default.createElement(react_1.default.Fragment, null,
102
- react_1.default.createElement(material_1.Avatar, { alt: option[types_1.SuggestionType.USER]['username'], src: option[types_1.SuggestionType.USER]['avatar'] }),
103
- react_1.default.createElement(material_1.Typography, { ml: 1 }, option[types_1.SuggestionType.USER]['username']))) : (react_1.default.createElement(react_1.default.Fragment, null,
104
- react_1.default.createElement(material_1.Avatar, { alt: option[types_1.SuggestionType.CATEGORY]['name'], src: option[types_1.SuggestionType.CATEGORY]['image_medium'], variant: "square" }),
105
- react_1.default.createElement(material_1.Typography, { ml: 1 }, option[types_1.SuggestionType.CATEGORY]['name']))))), renderInput: (params) => (react_1.default.createElement(material_1.TextField, Object.assign({}, params, { placeholder: `${intl.formatMessage(messages.placeholder, {
120
+ }, renderOption: (props, option) => (react_1.default.createElement(material_1.Box, Object.assign({ component: "li" }, props),
121
+ react_1.default.createElement(material_1.Avatar, { alt: getOptionData(option).name, src: getOptionData(option).image, variant: getOptionData(option).variant }),
122
+ react_1.default.createElement(material_1.Typography, { ml: 1 }, getOptionData(option).name))), renderInput: (params) => (react_1.default.createElement(material_1.TextField, Object.assign({}, params, { placeholder: `${intl.formatMessage(messages.placeholder, {
106
123
  community: scPreferences.preferences[react_core_1.SCPreferences.TEXT_APPLICATION_NAME].value
107
124
  })}`, InputProps: Object.assign(Object.assign({}, params.InputProps), { autoFocus, name: 'search-autocomplete', className: classes.input, startAdornment: react_1.default.createElement(Icon_1.default, { className: classes.icon }, "search"), endAdornment: (react_1.default.createElement(material_1.Fade, { in: value.length > 0 || Boolean(onClear), appear: false },
108
125
  react_1.default.createElement(material_1.IconButton, { className: classes.clear, onClick: handleClear, size: "small" },
@@ -33,6 +33,7 @@ const system_1 = require("@mui/system");
33
33
  const Contribution_1 = tslib_1.__importDefault(require("../Notification/Contribution"));
34
34
  const NotificationItem_1 = tslib_1.__importDefault(require("../../shared/NotificationItem"));
35
35
  const constants_1 = require("./constants");
36
+ const Group_1 = tslib_1.__importDefault(require("../Notification/Group"));
36
37
  const classes = {
37
38
  root: `${constants_1.PREFIX}-root`,
38
39
  notificationsWrap: `${constants_1.PREFIX}-notifications-wrap`,
@@ -254,6 +255,12 @@ function SnippetNotifications(inProps) {
254
255
  else if (type === types_2.SCNotificationTypologyType.CONTRIBUTION) {
255
256
  content = react_1.default.createElement(Contribution_1.default, { notificationObject: n, key: i, template: types_1.SCNotificationObjectTemplateType.SNIPPET });
256
257
  }
258
+ else if (n.type === types_2.SCNotificationTypologyType.USER_ADDED_TO_GROUP ||
259
+ n.type === types_2.SCNotificationTypologyType.USER_INVITED_TO_JOIN_GROUP ||
260
+ n.type === types_2.SCNotificationTypologyType.USER_ACCEPTED_TO_JOIN_GROUP ||
261
+ n.type === types_2.SCNotificationTypologyType.USER_REQUESTED_TO_JOIN_GROUP) {
262
+ return react_1.default.createElement(Group_1.default, { notificationObject: n, key: i, template: types_1.SCNotificationObjectTemplateType.SNIPPET });
263
+ }
257
264
  if (type && handleNotification) {
258
265
  /** Override content */
259
266
  content = handleNotification(type, n, content);
@@ -24,6 +24,7 @@ const Message_1 = tslib_1.__importDefault(require("../BroadcastMessages/Message"
24
24
  const system_1 = require("@mui/system");
25
25
  const Contribution_1 = tslib_1.__importDefault(require("../Notification/Contribution"));
26
26
  const constants_1 = require("./constants");
27
+ const Group_1 = tslib_1.__importDefault(require("../Notification/Group"));
27
28
  const Root = (0, styles_1.styled)(material_1.Box, {
28
29
  name: constants_1.PREFIX,
29
30
  slot: 'Root'
@@ -111,6 +112,12 @@ function UserToastNotifications(inProps) {
111
112
  else if (type === types_1.SCNotificationTypologyType.CONTRIBUTION) {
112
113
  content = react_1.default.createElement(Contribution_1.default, { notificationObject: n.notification_obj, template: types_2.SCNotificationObjectTemplateType.TOAST });
113
114
  }
115
+ else if (type === types_1.SCNotificationTypologyType.USER_ADDED_TO_GROUP ||
116
+ type === types_1.SCNotificationTypologyType.USER_INVITED_TO_JOIN_GROUP ||
117
+ type === types_1.SCNotificationTypologyType.USER_ACCEPTED_TO_JOIN_GROUP ||
118
+ type === types_1.SCNotificationTypologyType.USER_REQUESTED_TO_JOIN_GROUP) {
119
+ content = react_1.default.createElement(Group_1.default, { notificationObject: n.notification_obj, template: types_2.SCNotificationObjectTemplateType.TOAST });
120
+ }
114
121
  }
115
122
  if (n.activity_type && n.activity_type === types_1.SCNotificationTypologyType.NOTIFICATION_BANNER) {
116
123
  /** Notification of type: 'notification_banner' */
@@ -34,6 +34,11 @@ export interface UserProps extends WidgetProps {
34
34
  * Badge content to show as user avatar badge if show reaction is true.
35
35
  */
36
36
  badgeContent?: any;
37
+ /**
38
+ * If true, shows a custom label next to the user username
39
+ * @default false
40
+ */
41
+ isGroupAdmin?: boolean;
37
42
  /**
38
43
  * Prop to add actions
39
44
  * @default null
@@ -43,7 +48,7 @@ export interface UserProps extends WidgetProps {
43
48
  * Props to spread to the button
44
49
  * @default {}
45
50
  */
46
- buttonProps?: ButtonBaseProps;
51
+ buttonProps?: ButtonBaseProps | null;
47
52
  /**
48
53
  * Any other properties
49
54
  */
@@ -23,7 +23,8 @@ const messages = (0, react_intl_1.defineMessages)({
23
23
  const classes = {
24
24
  root: `${constants_1.PREFIX}-root`,
25
25
  avatar: `${constants_1.PREFIX}-avatar`,
26
- staffBadgeLabel: `${constants_1.PREFIX}-staff-badge-label`
26
+ staffBadgeLabel: `${constants_1.PREFIX}-staff-badge-label`,
27
+ groupAdminBadgeLabel: `${constants_1.PREFIX}-group-admin-badge-label`
27
28
  };
28
29
  const Root = (0, styles_1.styled)(BaseItemButton_1.default, {
29
30
  name: constants_1.PREFIX,
@@ -66,7 +67,7 @@ function User(inProps) {
66
67
  props: inProps,
67
68
  name: constants_1.PREFIX
68
69
  });
69
- const { userId = null, user = null, handleIgnoreAction, className = null, followConnectUserButtonProps = {}, showFollowers = false, elevation, badgeContent = null, actions = null, buttonProps = {} } = props, rest = tslib_1.__rest(props, ["userId", "user", "handleIgnoreAction", "className", "followConnectUserButtonProps", "showFollowers", "elevation", "badgeContent", "actions", "buttonProps"]);
70
+ const { userId = null, user = null, handleIgnoreAction, className = null, followConnectUserButtonProps = {}, showFollowers = false, elevation, badgeContent = null, actions = null, isGroupAdmin = false, buttonProps = null } = props, rest = tslib_1.__rest(props, ["userId", "user", "handleIgnoreAction", "className", "followConnectUserButtonProps", "showFollowers", "elevation", "badgeContent", "actions", "isGroupAdmin", "buttonProps"]);
70
71
  // STATE
71
72
  const { scUser, setSCUser } = (0, react_core_1.useSCFetchUser)({ id: userId, user });
72
73
  // CONTEXT
@@ -106,9 +107,9 @@ function User(inProps) {
106
107
  ? { onClick: () => setOpenAlert(true) }
107
108
  : { component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, scUser) }), image: badgeContent ? (react_1.default.createElement(material_1.Badge, { overlap: "circular", anchorOrigin: { vertical: 'bottom', horizontal: 'right' }, badgeContent: badgeContent },
108
109
  react_1.default.createElement(material_1.Avatar, { alt: scUser.username, src: scUser.avatar, className: classes.avatar }))) : (react_1.default.createElement(UserAvatar_1.default, { hide: !hasBadge },
109
- react_1.default.createElement(material_1.Avatar, { alt: scUser.username, src: scUser.avatar, className: classes.avatar }))), primary: hasBadge && preferences ? (react_1.default.createElement(react_1.default.Fragment, null,
110
+ react_1.default.createElement(material_1.Avatar, { alt: scUser.username, src: scUser.avatar, className: classes.avatar }))), primary: (hasBadge && preferences) || isGroupAdmin ? (react_1.default.createElement(react_1.default.Fragment, null,
110
111
  scUser.username,
111
- react_1.default.createElement(material_1.Chip, { component: "span", className: classes.staffBadgeLabel, size: "small", label: preferences[react_core_1.SCPreferences.STAFF_STAFF_BADGE_LABEL] }))) : (scUser.username), secondary: showFollowers ? `${intl.formatMessage(messages.userFollowers, { total: scUser.followers_counter })}` : scUser.description, actions: actions !== null && actions !== void 0 ? actions : renderAuthenticatedActions() })),
112
+ react_1.default.createElement(material_1.Chip, { component: "span", className: isGroupAdmin ? classes.groupAdminBadgeLabel : classes.staffBadgeLabel, size: "small", label: isGroupAdmin ? (react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.user.group.admin", id: "ui.user.group.admin" })) : (preferences[react_core_1.SCPreferences.STAFF_STAFF_BADGE_LABEL]) }))) : (scUser.username), secondary: showFollowers ? `${intl.formatMessage(messages.userFollowers, { total: scUser.followers_counter })}` : scUser.description, actions: actions !== null && actions !== void 0 ? actions : renderAuthenticatedActions() })),
112
113
  openAlert && react_1.default.createElement(UserDeletedSnackBar_1.default, { open: openAlert, handleClose: () => setOpenAlert(false) })));
113
114
  }
114
115
  exports.default = User;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * > API documentation for the Community-JS User Profile Categories Followed Widget Skeleton component. Learn about the available props and the CSS API.
3
+
4
+ #### Import
5
+
6
+ ```jsx
7
+ import {UserSubscribedGroupsWidgetSkeleton} from '@selfcommunity/react-ui';
8
+ ```
9
+
10
+ #### Component Name
11
+
12
+ The name `SCUserCategoriesFollowedWidget-skeleton-root` can be used when providing style overrides in the theme.
13
+
14
+ #### CSS
15
+
16
+ |Rule Name|Global class|Description|
17
+ |---|---|---|
18
+ |root|.SCUserSubscribedGroupsWidget-skeleton-root|Styles applied to the root element.|
19
+ *
20
+ */
21
+ export default function UserSubscribedGroupsWidgetSkeleton(props: any): JSX.Element;