@selfcommunity/react-ui 0.7.9-alpha.3 → 0.7.9-alpha.31

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 (169) hide show
  1. package/lib/cjs/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  2. package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  3. package/lib/cjs/components/CommentObject/CommentObject.js +18 -0
  4. package/lib/cjs/components/Composer/Attributes/Attributes.d.ts +1 -1
  5. package/lib/cjs/components/Composer/Attributes/Attributes.js +9 -2
  6. package/lib/cjs/components/Composer/Composer.d.ts +2 -1
  7. package/lib/cjs/components/Composer/Composer.js +39 -12
  8. package/lib/cjs/components/Composer/Content/ContentDiscussion/ContentDiscussion.js +7 -3
  9. package/lib/cjs/components/Composer/Content/ContentPost/ContentPost.js +4 -3
  10. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +7 -1
  11. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +46 -12
  12. package/lib/cjs/components/CreateGroupButton/CreateGroupButton.d.ts +2 -2
  13. package/lib/cjs/components/CreateGroupButton/CreateGroupButton.js +5 -6
  14. package/lib/cjs/components/CustomAdv/CustomAdv.d.ts +4 -0
  15. package/lib/cjs/components/{CreateGroup/CreateGroup.d.ts → EditGroupButton/EditGroupButton.d.ts} +11 -16
  16. package/lib/cjs/components/EditGroupButton/EditGroupButton.js +61 -0
  17. package/lib/cjs/components/EditGroupButton/index.d.ts +3 -0
  18. package/lib/cjs/components/EditGroupButton/index.js +5 -0
  19. package/lib/cjs/components/FeedObject/Actions/Follow/Follow.js +18 -0
  20. package/lib/cjs/components/FeedObject/Actions/Share/Share.js +18 -0
  21. package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
  22. package/lib/cjs/components/FeedObject/FeedObject.js +43 -9
  23. package/lib/cjs/components/Group/Group.d.ts +4 -3
  24. package/lib/cjs/components/Group/Group.js +5 -4
  25. package/lib/cjs/components/Group/Skeleton.js +1 -1
  26. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.d.ts +49 -0
  27. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +101 -0
  28. package/lib/cjs/components/GroupAutocomplete/index.d.ts +3 -0
  29. package/lib/cjs/components/GroupAutocomplete/index.js +5 -0
  30. package/lib/cjs/components/GroupForm/GroupForm.d.ts +70 -0
  31. package/lib/cjs/components/GroupForm/GroupForm.js +239 -0
  32. package/lib/cjs/components/GroupForm/constants.d.ts +1 -0
  33. package/lib/cjs/components/{CreateGroup → GroupForm}/constants.js +1 -1
  34. package/lib/cjs/components/GroupForm/index.d.ts +3 -0
  35. package/lib/cjs/components/GroupForm/index.js +5 -0
  36. package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
  37. package/lib/cjs/components/GroupHeader/GroupHeader.js +21 -11
  38. package/lib/cjs/components/GroupHeader/Skeleton.d.ts +2 -4
  39. package/lib/cjs/components/GroupHeader/Skeleton.js +10 -10
  40. package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +12 -8
  41. package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +7 -6
  42. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  43. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +3 -2
  44. package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +36 -16
  45. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  46. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  47. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  48. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +132 -0
  49. package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
  50. package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
  51. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  52. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +24 -9
  53. package/lib/cjs/components/Groups/Groups.d.ts +16 -16
  54. package/lib/cjs/components/Groups/Groups.js +47 -96
  55. package/lib/cjs/components/Groups/Skeleton.d.ts +14 -2
  56. package/lib/cjs/components/Groups/Skeleton.js +12 -5
  57. package/lib/cjs/components/InlineComposerWidget/InlineComposerWidget.d.ts +2 -1
  58. package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  59. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
  60. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
  61. package/lib/cjs/components/Notification/Group/Group.d.ts +15 -0
  62. package/lib/cjs/components/Notification/Group/Group.js +79 -0
  63. package/lib/cjs/components/Notification/Group/index.d.ts +3 -0
  64. package/lib/cjs/components/Notification/Group/index.js +5 -0
  65. package/lib/cjs/components/Notification/Notification.js +32 -1
  66. package/lib/cjs/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  67. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  68. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +10 -7
  69. package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  70. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  71. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +24 -6
  72. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  73. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +45 -20
  74. package/lib/cjs/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  75. package/lib/cjs/components/SnippetNotifications/SnippetNotifications.js +7 -0
  76. package/lib/cjs/components/ToastNotifications/ToastNotifications.js +7 -0
  77. package/lib/cjs/components/VoteButton/VoteButton.js +19 -0
  78. package/lib/cjs/index.d.ts +7 -4
  79. package/lib/cjs/index.js +13 -6
  80. package/lib/esm/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  81. package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  82. package/lib/esm/components/CommentObject/CommentObject.js +20 -2
  83. package/lib/esm/components/Composer/Attributes/Attributes.d.ts +1 -1
  84. package/lib/esm/components/Composer/Attributes/Attributes.js +9 -2
  85. package/lib/esm/components/Composer/Composer.d.ts +2 -1
  86. package/lib/esm/components/Composer/Composer.js +39 -12
  87. package/lib/esm/components/Composer/Content/ContentDiscussion/ContentDiscussion.js +7 -3
  88. package/lib/esm/components/Composer/Content/ContentPost/ContentPost.js +4 -3
  89. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +7 -1
  90. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +45 -12
  91. package/lib/esm/components/CreateGroupButton/CreateGroupButton.d.ts +2 -2
  92. package/lib/esm/components/CreateGroupButton/CreateGroupButton.js +5 -6
  93. package/lib/esm/components/CustomAdv/CustomAdv.d.ts +4 -0
  94. package/lib/esm/components/{CreateGroup/CreateGroup.d.ts → EditGroupButton/EditGroupButton.d.ts} +11 -16
  95. package/lib/esm/components/EditGroupButton/EditGroupButton.js +58 -0
  96. package/lib/esm/components/EditGroupButton/index.d.ts +3 -0
  97. package/lib/esm/components/EditGroupButton/index.js +2 -0
  98. package/lib/esm/components/FeedObject/Actions/Follow/Follow.js +20 -2
  99. package/lib/esm/components/FeedObject/Actions/Share/Share.js +20 -2
  100. package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
  101. package/lib/esm/components/FeedObject/FeedObject.js +45 -11
  102. package/lib/esm/components/Group/Group.d.ts +4 -3
  103. package/lib/esm/components/Group/Group.js +5 -4
  104. package/lib/esm/components/Group/Skeleton.js +1 -1
  105. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.d.ts +49 -0
  106. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +99 -0
  107. package/lib/esm/components/GroupAutocomplete/index.d.ts +3 -0
  108. package/lib/esm/components/GroupAutocomplete/index.js +2 -0
  109. package/lib/esm/components/GroupForm/GroupForm.d.ts +70 -0
  110. package/lib/esm/components/GroupForm/GroupForm.js +236 -0
  111. package/lib/esm/components/GroupForm/constants.d.ts +1 -0
  112. package/lib/esm/components/GroupForm/constants.js +1 -0
  113. package/lib/esm/components/GroupForm/index.d.ts +3 -0
  114. package/lib/esm/components/GroupForm/index.js +2 -0
  115. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
  116. package/lib/esm/components/GroupHeader/GroupHeader.js +21 -11
  117. package/lib/esm/components/GroupHeader/Skeleton.d.ts +2 -4
  118. package/lib/esm/components/GroupHeader/Skeleton.js +10 -10
  119. package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +12 -8
  120. package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +7 -6
  121. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  122. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +4 -3
  123. package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +38 -18
  124. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  125. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  126. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  127. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +129 -0
  128. package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
  129. package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
  130. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  131. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +25 -10
  132. package/lib/esm/components/Groups/Groups.d.ts +16 -16
  133. package/lib/esm/components/Groups/Groups.js +52 -101
  134. package/lib/esm/components/Groups/Skeleton.d.ts +14 -2
  135. package/lib/esm/components/Groups/Skeleton.js +13 -5
  136. package/lib/esm/components/InlineComposerWidget/InlineComposerWidget.d.ts +2 -1
  137. package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  138. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
  139. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
  140. package/lib/esm/components/Notification/Group/Group.d.ts +15 -0
  141. package/lib/esm/components/Notification/Group/Group.js +76 -0
  142. package/lib/esm/components/Notification/Group/index.d.ts +3 -0
  143. package/lib/esm/components/Notification/Group/index.js +2 -0
  144. package/lib/esm/components/Notification/Notification.js +32 -1
  145. package/lib/esm/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  146. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  147. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +11 -8
  148. package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  149. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  150. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
  151. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  152. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +47 -22
  153. package/lib/esm/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  154. package/lib/esm/components/SnippetNotifications/SnippetNotifications.js +7 -0
  155. package/lib/esm/components/ToastNotifications/ToastNotifications.js +7 -0
  156. package/lib/esm/components/VoteButton/VoteButton.js +20 -1
  157. package/lib/esm/index.d.ts +7 -4
  158. package/lib/esm/index.js +8 -5
  159. package/lib/umd/react-ui.js +1 -1
  160. package/package.json +6 -6
  161. package/lib/cjs/components/CreateGroup/CreateGroup.js +0 -187
  162. package/lib/cjs/components/CreateGroup/constants.d.ts +0 -1
  163. package/lib/cjs/components/CreateGroup/index.d.ts +0 -3
  164. package/lib/cjs/components/CreateGroup/index.js +0 -5
  165. package/lib/esm/components/CreateGroup/CreateGroup.js +0 -184
  166. package/lib/esm/components/CreateGroup/constants.d.ts +0 -1
  167. package/lib/esm/components/CreateGroup/constants.js +0 -1
  168. package/lib/esm/components/CreateGroup/index.d.ts +0 -3
  169. package/lib/esm/components/CreateGroup/index.js +0 -2
@@ -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)(null);
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);
@@ -88,10 +89,12 @@ function PrivateMessageComponent(inProps) {
88
89
  /**
89
90
  * Handles thread opening on click
90
91
  * @param item
92
+ * @param type
91
93
  */
92
- const handleThreadOpening = (item) => {
93
- onItemClick && onItemClick(messageReceiver(item, authUserId));
94
- setObj(messageReceiver(item, authUserId));
94
+ const handleThreadOpening = (item, type) => {
95
+ onItemClick && onItemClick(item.group ? item.group.id : messageReceiver(item, authUserId), type);
96
+ setType(type);
97
+ setObj(item.group ? item : messageReceiver(item, authUserId));
95
98
  setOpenNewMessage(false);
96
99
  };
97
100
  /**
@@ -107,7 +110,7 @@ function PrivateMessageComponent(inProps) {
107
110
  const handleOpenNewMessage = () => {
108
111
  setOpenNewMessage(!openNewMessage);
109
112
  setObj(types_1.SCPrivateMessageStatusType.NEW);
110
- onItemClick && onItemClick(types_1.SCPrivateMessageStatusType.NEW);
113
+ onItemClick && onItemClick(types_1.SCPrivateMessageStatusType.NEW, types_1.SCPrivateMessageType.NEW);
111
114
  };
112
115
  /**
113
116
  * Handles new messages open from user profile page or notifications section
@@ -129,7 +132,7 @@ function PrivateMessageComponent(inProps) {
129
132
  * Handles state update when a new message is sent
130
133
  */
131
134
  const handleOnNewMessageSent = (msg, isOne) => {
132
- onItemClick && onItemClick(isOne ? messageReceiver(msg, authUserId) : '');
135
+ onItemClick && onItemClick(isOne ? messageReceiver(msg, authUserId) : '', msg.group ? types_1.SCPrivateMessageType.GROUP : types_1.SCPrivateMessageType.USER);
133
136
  setObj(isOne ? messageReceiver(msg, authUserId) : null);
134
137
  setOpenNewMessage(false);
135
138
  };
@@ -149,14 +152,14 @@ function PrivateMessageComponent(inProps) {
149
152
  onSnippetClick: handleThreadOpening,
150
153
  onNewMessageClick: handleOpenNewMessage,
151
154
  onDeleteConfirm: handleDeleteThread
152
- }, userObj: obj, clearSearch: clear, elevation: 0 })));
155
+ }, threadObj: obj, clearSearch: clear, elevation: 0 })));
153
156
  }
154
157
  /**
155
158
  * Renders thread section
156
159
  */
157
160
  function renderThread() {
158
161
  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 })));
162
+ react_1.default.createElement(PrivateMessageThread_1.default, { threadObj: obj, type: type, openNewMessage: openNewMessage, onNewMessageClose: handleMessageBack, onNewMessageSent: handleOnNewMessageSent, onSingleMessageOpen: handleSingleMessage, elevation: 0 })));
160
163
  }
161
164
  /**
162
165
  * Renders the component (if not hidden by autoHide prop)
@@ -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',
@@ -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,10 @@ 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
36
  }
37
37
  /**
38
38
  * > 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, snippetActions, clearSearch } = props, rest = tslib_1.__rest(props, ["className", "threadObj", "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)(null);
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 (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 (type === types_1.SCPrivateMessageType.USER) {
116
+ return messageReceiver(message, authUserId) === (isObj ? messageReceiver(threadObj, authUserId) : threadObj);
117
+ }
118
+ return false;
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 _type = msg.group !== null ? types_1.SCPrivateMessageType.GROUP : types_1.SCPrivateMessageType.USER;
137
+ setType(_type);
138
+ snippetActions && snippetActions.onSnippetClick(msg, _type);
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,19 @@ 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
+ })
303
+ .catch((error) => {
304
+ setLoadingMessageObjs(false);
305
+ console.log(error);
306
+ utils_1.Logger.error(Errors_1.SCOPE_SC_UI, { error });
307
+ });
308
+ }
294
309
  }
295
310
  const isNewerThan60Seconds = (creationTime) => {
296
311
  const date = new Date(creationTime);
@@ -355,11 +370,15 @@ function PrivateMessageThread(inProps) {
355
370
  .request({
356
371
  url: api_services_1.Endpoints.SendMessage.url(),
357
372
  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
- }
373
+ data: Object.assign(Object.assign({}, (type === types_1.SCPrivateMessageType.GROUP
374
+ ? { group: isNumber ? threadObj : threadObj.group.id }
375
+ : {
376
+ recipients: openNewMessage || isNew || singleMessageThread
377
+ ? ids
378
+ : [isNumber && threadObj ? threadObj : messageReceiver(threadObj, authUserId)]
379
+ })), {
380
+ // recipients: openNewMessage || isNew || singleMessageThread ? ids : [isNumber && threadObj ? threadObj : messageReceiver(threadObj, authUserId)],
381
+ message: message, file_uuid: file && !message ? file : null })
363
382
  })
364
383
  .then((res) => {
365
384
  const isOne = res.data.length <= 1;
@@ -405,13 +424,13 @@ function PrivateMessageThread(inProps) {
405
424
  if (!authUserId) {
406
425
  return;
407
426
  }
408
- if (userObj) {
427
+ if (threadObj) {
409
428
  fetchThread();
410
429
  }
411
430
  else {
412
431
  reset();
413
432
  }
414
- }, [userObj, authUserId, scUser]);
433
+ }, [threadObj, authUserId, scUser]);
415
434
  /**
416
435
  * Notification subscriber
417
436
  */
@@ -426,7 +445,7 @@ function PrivateMessageThread(inProps) {
426
445
  if (index !== -1) {
427
446
  setMessageObjs((prev) => [...prev, res.notification_obj.message]);
428
447
  }
429
- if (isNumber ? userObj === res.thread_id : userObj.id === res.thread_id) {
448
+ if (isNumber ? threadObj === res.thread_id : threadObj.id === res.thread_id) {
430
449
  scrollToBottom();
431
450
  }
432
451
  };
@@ -453,11 +472,17 @@ function PrivateMessageThread(inProps) {
453
472
  react_1.default.createElement("ul", null,
454
473
  react_1.default.createElement(material_1.ListSubheader, null,
455
474
  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) }),
475
+ formattedMessages[key].map((msg) => {
476
+ var _a;
477
+ return (react_1.default.createElement(material_1.Box, { className: classes.item, key: msg.id },
478
+ 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,
479
+ react_1.default.createElement(material_1.Avatar, { alt: msg.sender.username, src: msg.sender.avatar, className: classes.avatar }))),
480
+ react_1.default.createElement(PrivateMessageThreadItem_1.default, { className: authUserId === msg.sender.id ? classes.sender : classes.receiver, message: msg, key: msg.id, mouseEvents: {
481
+ onMouseEnter: () => handleMouseEnter(msg.id),
482
+ onMouseLeave: () => handleMouseLeave(msg.id)
483
+ }, isHovering: isHovered[msg.id], showMenuIcon: authUserId === msg.sender.id, onMenuIconClick: () => handleOpenDeleteMessageDialog(msg) })));
484
+ }))))))),
485
+ react_1.default.createElement(PrivateMessageEditor_1.default, { className: classes.editor, send: handleSend, autoHide: type === types_1.SCPrivateMessageType.USER && !(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
486
  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
487
  }
463
488
  /**
@@ -485,6 +510,6 @@ function PrivateMessageThread(inProps) {
485
510
  /**
486
511
  * Renders the component
487
512
  */
488
- return (react_1.default.createElement(Root, Object.assign({}, rest, { className: (0, classnames_1.default)(classes.root, className) }), userObj !== null && !isNew && !singleMessageThread ? renderThread() : renderNewOrNoMessageBox()));
513
+ return (react_1.default.createElement(Root, Object.assign({}, rest, { className: (0, classnames_1.default)(classes.root, className) }), threadObj !== null && !isNew && !singleMessageThread ? renderThread() : renderNewOrNoMessageBox()));
489
514
  }
490
515
  exports.default = PrivateMessageThread;
@@ -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' */
@@ -5,6 +5,7 @@ const react_1 = tslib_1.__importStar(require("react"));
5
5
  const styles_1 = require("@mui/material/styles");
6
6
  const lab_1 = require("@mui/lab");
7
7
  const classnames_1 = tslib_1.__importDefault(require("classnames"));
8
+ const types_1 = require("@selfcommunity/types");
8
9
  const system_1 = require("@mui/system");
9
10
  const Icon_1 = tslib_1.__importDefault(require("@mui/material/Icon"));
10
11
  const material_1 = require("@mui/material");
@@ -54,6 +55,7 @@ const PopperRoot = (0, styles_1.styled)(material_1.Popper, {
54
55
  * @param inProps
55
56
  */
56
57
  function VoteButton(inProps) {
58
+ var _a;
57
59
  // PROPS
58
60
  const props = (0, system_1.useThemeProps)({
59
61
  props: inProps,
@@ -62,11 +64,13 @@ function VoteButton(inProps) {
62
64
  const { className, contributionId, contributionType, contribution = null, onVote } = props, rest = tslib_1.__rest(props, ["className", "contributionId", "contributionType", "contribution", "onVote"]);
63
65
  // STATE
64
66
  const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
67
+ const [status, setStatus] = (0, react_1.useState)(null);
65
68
  // REF
66
69
  const timeoutRef = (0, react_1.useRef)(null);
67
70
  // CONTEXT
68
71
  const scContext = (0, react_core_1.useSCContext)();
69
72
  const scUserContext = (0, react_core_1.useSCUser)();
73
+ const scGroupsManager = scUserContext.managers.groups;
70
74
  const { enqueueSnackbar } = (0, notistack_1.useSnackbar)();
71
75
  // HANDLERS
72
76
  const handleMouseEnter = (event) => {
@@ -81,6 +85,15 @@ function VoteButton(inProps) {
81
85
  timeoutRef.current && clearTimeout(timeoutRef.current);
82
86
  timeoutRef.current = null;
83
87
  };
88
+ /**
89
+ * If the obj has a group, checks the subscription status for the authenticated user
90
+ */
91
+ (0, react_1.useEffect)(() => {
92
+ var _a;
93
+ if (((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id) && (contribution === null || contribution === void 0 ? void 0 : contribution.group)) {
94
+ setStatus(scGroupsManager.subscriptionStatus(contribution === null || contribution === void 0 ? void 0 : contribution.group));
95
+ }
96
+ }, [(_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id, scGroupsManager.subscriptionStatus, contribution === null || contribution === void 0 ? void 0 : contribution.group]);
84
97
  /**
85
98
  * Perform vote action
86
99
  * @param reaction
@@ -95,6 +108,12 @@ function VoteButton(inProps) {
95
108
  autoHideDuration: 3000
96
109
  });
97
110
  }
111
+ else if ((contribution === null || contribution === void 0 ? void 0 : contribution.group) && status !== types_1.SCGroupSubscriptionStatusType.SUBSCRIBED) {
112
+ enqueueSnackbar(react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.common.group.actions.unsubscribed", defaultMessage: "ui.common.group.actions.unsubscribed" }), {
113
+ variant: 'warning',
114
+ autoHideDuration: 3000
115
+ });
116
+ }
98
117
  else {
99
118
  handleVote(reaction);
100
119
  }
@@ -80,6 +80,7 @@ import BaseItem, { BaseItemProps } from './shared/BaseItem';
80
80
  import BaseDialog, { BaseDialogProps } from './shared/BaseDialog';
81
81
  import MediaChunkUploader, { MediaChunkUploaderProps } from './shared/MediaChunkUploader';
82
82
  import { File, EditMediaProps, Link, Share } from './shared/Media';
83
+ import HiddenPlaceholder from './shared/HiddenPlaceholder';
83
84
  import UrlTextField from './shared/UrlTextField';
84
85
  import UsernameTextField from './shared/UsernameTextField';
85
86
  import EmailTextField from './shared/EmailTextField';
@@ -108,15 +109,17 @@ import ChangeGroupCover, { ChangeGroupCoverProps } from './components/ChangeGrou
108
109
  import ChangeGroupPicture, { ChangeGroupPictureProps } from './components/ChangeGroupPicture';
109
110
  import GroupHeader, { GroupHeaderProps, GroupHeaderSkeleton } from './components/GroupHeader';
110
111
  import GroupMembersButton, { GroupMembersButtonProps } from './components/GroupMembersButton';
111
- import CreateGroupButton from './components/CreateGroupButton';
112
- import CreateButton, { CreateGroupButtonProps } from './components/CreateGroupButton';
112
+ import CreateGroupButton, { CreateGroupButtonProps } from './components/CreateGroupButton';
113
+ import EditGroupButton, { EditGroupButtonProps } from './components/EditGroupButton';
113
114
  import GroupInviteButton, { GroupInviteButtonProps } from './components/GroupInviteButton';
114
115
  import GroupInfoWidget, { GroupInfoWidgetProps, GroupInfoWidgetSkeleton } from './components/GroupInfoWidget';
115
- import Group, { GroupProps } from './components/Group';
116
+ import Group, { GroupProps, GroupSkeleton } from './components/Group';
116
117
  import GroupSubscribeButton, { GroupSubscribeButtonProps } from './components/GroupSubscribeButton';
117
118
  import GroupMembersWidget, { GroupMembersWidgetProps, GroupMembersWidgetSkeleton } from './components/GroupMembersWidget';
118
119
  import GroupRequestsWidget, { GroupRequestsWidgetProps, GroupRequestsWidgetSkeleton } from './components/GroupRequestsWidget';
119
120
  import Groups, { GroupsProps, GroupsSkeleton } from './components/Groups';
121
+ import GroupForm, { GroupFormProps } from './components/GroupForm';
122
+ import GroupSettingsIconButton, { GroupSettingsIconButtonProps } from './components/GroupSettingsIconButton';
120
123
  /**
121
124
  * Constants
122
125
  */
@@ -141,4 +144,4 @@ import FeedObjectMediaPreview, { FeedObjectMediaPreviewProps } from './component
141
144
  /**
142
145
  * List all exports
143
146
  */
144
- export { AccountDataPortability, AccountDataPortabilityProps, AccountDataPortabilityButton, AccountDataPortabilityButtonProps, AccountDelete, AccountDeleteProps, AccountDeleteButton, AccountDeleteButtonProps, AccountRecover, AccountRecoverProps, AccountReset, AccountResetProps, AccountVerify, AccountVerifyProps, AccountChangeMailValidation, AccountChangeMailValidationProps, NavigationSettingsIconButton, NavigationSettingsIconButtonProps, NavigationSettingsItem, NavigationToolbarMobile, NavigationToolbarMobileProps, NavigationToolbarMobileSkeleton, NavigationToolbar, NavigationToolbarProps, NavigationToolbarSkeleton, NavigationMenuIconButton, NavigationMenuContent, NavigationMenuIconButtonProps, BottomNavigation, BottomNavigationProps, BroadcastMessages, BroadcastMessagesProps, BroadcastMessagesSkeleton, Category, CategoryProps, CategorySkeleton, CategoryAutocomplete, CategoryAutocompleteProps, CategoryFollowersButton, CategoryFollowersButtonProps, CategoryHeader, CategoryHeaderProps, CategoryHeaderSkeleton, Categories, CategoriesProps, CategoriesSkeleton, CategoriesSkeletonProps, UserFollowedCategoriesWidget, UserFollowedCategoriesWidgetProps, UserFollowedCategoriesWidgetSkeleton, CategoriesPopularWidget, CategoriesPopularWidgetSkeleton, CategoriesSuggestionWidget, CategoriesSuggestionWidgetProps, CategoriesSuggestionWidgetSkeleton, ChangeCover, ChangePicture, ChangePictureProps, ChangeCoverProps, Composer, ComposerProps, ComposerIconButton, ComposerIconButtonProps, Editor, EditorProps, EditorSkeleton, FriendshipUserButton, FriendshipButtonProps, Feed, FeedRef, FeedProps, FeedSidebarProps, FeedSkeleton, CategoryFollowButton, CategoryFollowButtonProps, FollowUserButton, FollowUserButtonProps, ConnectionUserButton, FeedObject, FeedObjectProps, FeedObjectSkeleton, FeedObjectMediaPreview, FeedObjectMediaPreviewProps, FeedUpdatesWidget, FeedUpdatesWidgetProps, FeedUpdatesWidgetSkeleton, GenericSkeleton, AvatarGroupSkeleton, CommentObject, CommentsObject, CommentsObjectProps, CommentObjectProps, CommentsObjectSkeleton, CommentObjectSkeleton, CommentObjectReply, CommentObjectReplyProps, CommentsFeedObject, CommentsFeedObjectProps, CommentsFeedObjectSkeleton, ReplyComment, InlineComposerWidget, InlineComposerWidgetProps, InlineComposerWidgetSkeleton, Notification, NotificationProps, NotificationSkeleton, UserSuggestionWidget, UserSuggestionWidgetProps, UserSuggestionWidgetSkeleton, PlatformWidget, PlatformWidgetProps, PlatformWidgetSkeleton, LocationAutocomplete, LocationAutocompleteProps, LoyaltyProgramWidget, LoyaltyProgramWidgetProps, LoyaltyProgramWidgetSkeleton, CategoryTrendingFeedWidget, CategoryTrendingFeedWidgetProps, CategoryTrendingFeedWidgetSkeleton, CategoryTrendingUsersWidget, CategoryTrendingUsersWidgetProps, CategoryTrendingPeopleWidgetSkeleton, RelatedFeedObjectsWidget, RelatedFeedObjectWidgetProps, RelatedFeedObjectsWidgetSkeleton, UserActionIconButton, UserActionIconButtonProps, UserCounters, UserCountersProps, UserProfileHeader, UserProfileHeaderProps, UserProfileHeaderSkeleton, UserInfoDialog, UserInfoDialogProps, UserInfo, UserInfoProps, UserInfoSkeleton, UserProfileBlocked, UserProfileBlockedProps, SCUserProfileFields, SCUserProfileSettings, UserProfileEdit, UserProfileEditProps, UserProfileEditSkeleton, UserProfileEditSectionPublicInfo, UserProfileEditSectionPublicInfoProps, UserProfileEditSectionSettings, UserProfileEditSectionSettingsProps, UserProfileEditSectionAccount, UserProfileEditSectionAccountProps, UserFollowedUsersWidget, UserFollowedUsersWidgetProps, UserFollowedUsersWidgetSkeleton, UserFollowersWidget, UserFollowersWidgetProps, UserFollowersWidgetSkeleton, UserConnectionsWidget, UserConnectionsWidgetProps, UserConnectionsWidgetSkeleton, UserConnectionsRequestsWidget, UserConnectionsRequestsWidgetProps, UserConnectionsRequestsWidgetSkeleton, UserConnectionsRequestsSentWidget, UserConnectionsRequestsSentWidgetProps, UserConnectionsRequestsSentWidgetSkeleton, UserSocialAssociation, UserSocialAssociationProps, SCUserSocialAssociations, CustomAdv, CustomAdvProps, CustomAdvSkeleton, User, UserProps, UserSkeleton, PrivateMessageThread, PrivateMessageThreadProps, PrivateMessageThreadSkeleton, PrivateMessageThreadItem, PrivateMessageThreadItemProps, PrivateMessageThreadItemSkeleton, PrivateMessageSnippetItem, PrivateMessageSnippetItemProps, PrivateMessageSnippetItemSkeleton, PrivateMessageEditor, PrivateMessageEditorProps, PrivateMessageEditorSkeleton, PrivateMessageSnippets, PrivateMessageSnippetsProps, PrivateMessageSnippetsSkeleton, PrivateMessageComponent, PrivateMessageComponentProps, PrivateMessageComponentSkeleton, PrivateMessageSettingsIconButton, PrivateMessageSettingsIconButtonProps, ToastNotifications, ToastNotificationsProps, ToastNotificationsSkeleton, SnippetNotifications, SnippetNotificationsProps, SnippetNotificationsSkeleton, SearchAutocomplete, SearchAutocompleteProps, SearchDialog, SearchDialogProps, Widget, WidgetProps, SCFeedWidgetType, SCFeedObjectTemplateType, SCCommentsOrderBy, SCFeedObjectActivitiesType, SCMediaObjectType, SCMediaChunkType, SCNotificationObjectTemplateType, SCBroadcastMessageTemplateType, ChangeGroupCover, ChangeGroupCoverProps, ChangeGroupPicture, ChangeGroupPictureProps, GroupHeader, GroupHeaderProps, GroupHeaderSkeleton, GroupMembersButton, GroupMembersButtonProps, CreateGroupButton, CreateButton, CreateGroupButtonProps, GroupInviteButton, GroupInviteButtonProps, GroupInfoWidget, GroupInfoWidgetProps, GroupInfoWidgetSkeleton, Group, GroupProps, GroupSubscribeButton, GroupSubscribeButtonProps, GroupMembersWidget, GroupMembersWidgetProps, GroupMembersWidgetSkeleton, GroupRequestsWidget, GroupRequestsWidgetProps, GroupRequestsWidgetSkeleton, Groups, GroupsProps, GroupsSkeleton, UrlTextField, UsernameTextField, EmailTextField, PasswordTextField, PhoneTextField, MetadataField, InfiniteScroll, StickyBox, useStickyBox, StickyBoxProps, StickyBoxComponent, UseStickyBoxProps, TagChip, TagChipProps, UserDeletedSnackBar, UserDeletedSnackBarProps, UserAvatar, UserAvatarProps, Lightbox, CentralProgress, ConfirmDialog, LanguageSwitcher, MediaChunkUploader, MediaChunkUploaderProps, File, Link, Share, EditMediaProps, MEDIA_TYPE_EMBED, FACEBOOK_SHARE, TWITTER_SHARE, LINKEDIN_SHARE, DEFAULT_PRELOAD_OFFSET_VIEWPORT, MIN_PRELOAD_OFFSET_VIEWPORT, MAX_PRELOAD_OFFSET_VIEWPORT, ConsentSolution, ConsentSolutionProps, ConsentSolutionSkeleton, ConsentSolutionButton, ConsentSolutionButtonProps, LEGAL_POLICIES, DEFAULT_FIELDS, DEFAULT_PAGINATION_QUERY_PARAM_NAME, DEFAULT_PAGINATION_OFFSET, DEFAULT_PAGINATION_LIMIT, DEFAULT_WIDGETS_NUMBER, PollSuggestionWidget, PollSuggestionWidgetProps, Incubator, IncubatorSubscribeButton, IncubatorSubscribeButtonProps, IncubatorProps, IncubatorListWidget, IncubatorListWidgetProps, IncubatorDetail, IncubatorDetailProps, IncubatorSuggestionWidget, IncubatorSuggestionWidgetProps, ContributionUtils, bytesToSize, getUnseenNotification, getUnseenNotificationCounter, MessageUploaderUtils, getRelativeTime, Footer, FooterProps, FooterSkeleton, BaseItem, BaseItemProps, BaseDialog, BaseDialogProps };
147
+ export { AccountDataPortability, AccountDataPortabilityProps, AccountDataPortabilityButton, AccountDataPortabilityButtonProps, AccountDelete, AccountDeleteProps, AccountDeleteButton, AccountDeleteButtonProps, AccountRecover, AccountRecoverProps, AccountReset, AccountResetProps, AccountVerify, AccountVerifyProps, AccountChangeMailValidation, AccountChangeMailValidationProps, NavigationSettingsIconButton, NavigationSettingsIconButtonProps, NavigationSettingsItem, NavigationToolbarMobile, NavigationToolbarMobileProps, NavigationToolbarMobileSkeleton, NavigationToolbar, NavigationToolbarProps, NavigationToolbarSkeleton, NavigationMenuIconButton, NavigationMenuContent, NavigationMenuIconButtonProps, BottomNavigation, BottomNavigationProps, BroadcastMessages, BroadcastMessagesProps, BroadcastMessagesSkeleton, Category, CategoryProps, CategorySkeleton, CategoryAutocomplete, CategoryAutocompleteProps, CategoryFollowersButton, CategoryFollowersButtonProps, CategoryHeader, CategoryHeaderProps, CategoryHeaderSkeleton, Categories, CategoriesProps, CategoriesSkeleton, CategoriesSkeletonProps, UserFollowedCategoriesWidget, UserFollowedCategoriesWidgetProps, UserFollowedCategoriesWidgetSkeleton, CategoriesPopularWidget, CategoriesPopularWidgetSkeleton, CategoriesSuggestionWidget, CategoriesSuggestionWidgetProps, CategoriesSuggestionWidgetSkeleton, ChangeCover, ChangePicture, ChangePictureProps, ChangeCoverProps, Composer, ComposerProps, ComposerIconButton, ComposerIconButtonProps, Editor, EditorProps, EditorSkeleton, FriendshipUserButton, FriendshipButtonProps, Feed, FeedRef, FeedProps, FeedSidebarProps, FeedSkeleton, CategoryFollowButton, CategoryFollowButtonProps, FollowUserButton, FollowUserButtonProps, ConnectionUserButton, FeedObject, FeedObjectProps, FeedObjectSkeleton, FeedObjectMediaPreview, FeedObjectMediaPreviewProps, FeedUpdatesWidget, FeedUpdatesWidgetProps, FeedUpdatesWidgetSkeleton, GenericSkeleton, AvatarGroupSkeleton, CommentObject, CommentsObject, CommentsObjectProps, CommentObjectProps, CommentsObjectSkeleton, CommentObjectSkeleton, CommentObjectReply, CommentObjectReplyProps, CommentsFeedObject, CommentsFeedObjectProps, CommentsFeedObjectSkeleton, ReplyComment, InlineComposerWidget, InlineComposerWidgetProps, InlineComposerWidgetSkeleton, Notification, NotificationProps, NotificationSkeleton, UserSuggestionWidget, UserSuggestionWidgetProps, UserSuggestionWidgetSkeleton, PlatformWidget, PlatformWidgetProps, PlatformWidgetSkeleton, LocationAutocomplete, LocationAutocompleteProps, LoyaltyProgramWidget, LoyaltyProgramWidgetProps, LoyaltyProgramWidgetSkeleton, CategoryTrendingFeedWidget, CategoryTrendingFeedWidgetProps, CategoryTrendingFeedWidgetSkeleton, CategoryTrendingUsersWidget, CategoryTrendingUsersWidgetProps, CategoryTrendingPeopleWidgetSkeleton, RelatedFeedObjectsWidget, RelatedFeedObjectWidgetProps, RelatedFeedObjectsWidgetSkeleton, UserActionIconButton, UserActionIconButtonProps, UserCounters, UserCountersProps, UserProfileHeader, UserProfileHeaderProps, UserProfileHeaderSkeleton, UserInfoDialog, UserInfoDialogProps, UserInfo, UserInfoProps, UserInfoSkeleton, UserProfileBlocked, UserProfileBlockedProps, SCUserProfileFields, SCUserProfileSettings, UserProfileEdit, UserProfileEditProps, UserProfileEditSkeleton, UserProfileEditSectionPublicInfo, UserProfileEditSectionPublicInfoProps, UserProfileEditSectionSettings, UserProfileEditSectionSettingsProps, UserProfileEditSectionAccount, UserProfileEditSectionAccountProps, UserFollowedUsersWidget, UserFollowedUsersWidgetProps, UserFollowedUsersWidgetSkeleton, UserFollowersWidget, UserFollowersWidgetProps, UserFollowersWidgetSkeleton, UserConnectionsWidget, UserConnectionsWidgetProps, UserConnectionsWidgetSkeleton, UserConnectionsRequestsWidget, UserConnectionsRequestsWidgetProps, UserConnectionsRequestsWidgetSkeleton, UserConnectionsRequestsSentWidget, UserConnectionsRequestsSentWidgetProps, UserConnectionsRequestsSentWidgetSkeleton, UserSocialAssociation, UserSocialAssociationProps, SCUserSocialAssociations, CustomAdv, CustomAdvProps, CustomAdvSkeleton, User, UserProps, UserSkeleton, PrivateMessageThread, PrivateMessageThreadProps, PrivateMessageThreadSkeleton, PrivateMessageThreadItem, PrivateMessageThreadItemProps, PrivateMessageThreadItemSkeleton, PrivateMessageSnippetItem, PrivateMessageSnippetItemProps, PrivateMessageSnippetItemSkeleton, PrivateMessageEditor, PrivateMessageEditorProps, PrivateMessageEditorSkeleton, PrivateMessageSnippets, PrivateMessageSnippetsProps, PrivateMessageSnippetsSkeleton, PrivateMessageComponent, PrivateMessageComponentProps, PrivateMessageComponentSkeleton, PrivateMessageSettingsIconButton, PrivateMessageSettingsIconButtonProps, ToastNotifications, ToastNotificationsProps, ToastNotificationsSkeleton, SnippetNotifications, SnippetNotificationsProps, SnippetNotificationsSkeleton, SearchAutocomplete, SearchAutocompleteProps, SearchDialog, SearchDialogProps, Widget, WidgetProps, SCFeedWidgetType, SCFeedObjectTemplateType, SCCommentsOrderBy, SCFeedObjectActivitiesType, SCMediaObjectType, SCMediaChunkType, SCNotificationObjectTemplateType, SCBroadcastMessageTemplateType, ChangeGroupCover, ChangeGroupCoverProps, ChangeGroupPicture, ChangeGroupPictureProps, GroupHeader, GroupHeaderProps, GroupHeaderSkeleton, GroupMembersButton, GroupMembersButtonProps, CreateGroupButton, CreateGroupButtonProps, EditGroupButton, EditGroupButtonProps, GroupInviteButton, GroupInviteButtonProps, GroupInfoWidget, GroupInfoWidgetProps, GroupInfoWidgetSkeleton, Group, GroupProps, GroupSkeleton, GroupSubscribeButton, GroupSubscribeButtonProps, GroupMembersWidget, GroupMembersWidgetProps, GroupMembersWidgetSkeleton, GroupRequestsWidget, GroupRequestsWidgetProps, GroupRequestsWidgetSkeleton, Groups, GroupsProps, GroupsSkeleton, GroupForm, GroupFormProps, HiddenPlaceholder, UrlTextField, UsernameTextField, EmailTextField, PasswordTextField, PhoneTextField, MetadataField, InfiniteScroll, StickyBox, useStickyBox, StickyBoxProps, StickyBoxComponent, UseStickyBoxProps, TagChip, TagChipProps, UserDeletedSnackBar, UserDeletedSnackBarProps, UserAvatar, UserAvatarProps, Lightbox, CentralProgress, ConfirmDialog, LanguageSwitcher, MediaChunkUploader, MediaChunkUploaderProps, File, Link, Share, EditMediaProps, MEDIA_TYPE_EMBED, FACEBOOK_SHARE, TWITTER_SHARE, LINKEDIN_SHARE, DEFAULT_PRELOAD_OFFSET_VIEWPORT, MIN_PRELOAD_OFFSET_VIEWPORT, MAX_PRELOAD_OFFSET_VIEWPORT, ConsentSolution, ConsentSolutionProps, ConsentSolutionSkeleton, ConsentSolutionButton, ConsentSolutionButtonProps, LEGAL_POLICIES, DEFAULT_FIELDS, DEFAULT_PAGINATION_QUERY_PARAM_NAME, DEFAULT_PAGINATION_OFFSET, DEFAULT_PAGINATION_LIMIT, DEFAULT_WIDGETS_NUMBER, PollSuggestionWidget, PollSuggestionWidgetProps, Incubator, IncubatorSubscribeButton, IncubatorSubscribeButtonProps, IncubatorProps, IncubatorListWidget, IncubatorListWidgetProps, IncubatorDetail, IncubatorDetailProps, IncubatorSuggestionWidget, IncubatorSuggestionWidgetProps, ContributionUtils, bytesToSize, getUnseenNotification, getUnseenNotificationCounter, MessageUploaderUtils, getRelativeTime, Footer, FooterProps, FooterSkeleton, BaseItem, BaseItemProps, BaseDialog, BaseDialogProps, GroupSettingsIconButton, GroupSettingsIconButtonProps };