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

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 (185) 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 +8 -0
  22. package/lib/cjs/components/Group/Group.js +17 -5
  23. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
  24. package/lib/cjs/components/GroupForm/GroupForm.js +64 -13
  25. package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
  26. package/lib/cjs/components/GroupHeader/GroupHeader.js +53 -11
  27. package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +63 -9
  28. package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +31 -9
  29. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  30. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.js +221 -0
  31. package/lib/cjs/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  32. package/lib/cjs/components/GroupInvitedWidget/Skeleton.js +38 -0
  33. package/lib/cjs/components/GroupInvitedWidget/constants.d.ts +1 -0
  34. package/lib/cjs/components/GroupInvitedWidget/constants.js +4 -0
  35. package/lib/cjs/components/GroupInvitedWidget/index.d.ts +4 -0
  36. package/lib/cjs/components/GroupInvitedWidget/index.js +8 -0
  37. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  38. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +8 -3
  39. package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +25 -4
  40. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  41. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  42. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  43. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +151 -0
  44. package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
  45. package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
  46. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  47. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +30 -11
  48. package/lib/cjs/components/Groups/Groups.d.ts +15 -8
  49. package/lib/cjs/components/Groups/Groups.js +86 -32
  50. package/lib/cjs/components/Groups/Skeleton.d.ts +4 -0
  51. package/lib/cjs/components/Groups/Skeleton.js +2 -2
  52. package/lib/cjs/components/InlineComposerWidget/InlineComposerWidget.js +7 -0
  53. package/lib/cjs/components/NavigationSettingsIconButton/NavigationSettingsIconButton.js +4 -4
  54. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.js +9 -2
  55. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +1 -0
  56. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +9 -1
  57. package/lib/cjs/components/Notification/Group/Group.d.ts +15 -0
  58. package/lib/cjs/components/Notification/Group/Group.js +78 -0
  59. package/lib/cjs/components/Notification/Group/index.d.ts +3 -0
  60. package/lib/cjs/components/Notification/Group/index.js +5 -0
  61. package/lib/cjs/components/Notification/Notification.js +31 -1
  62. package/lib/cjs/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  63. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +7 -1
  64. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +16 -8
  65. package/lib/cjs/components/PrivateMessageSettingsIconButton/PrivateMessageSettingsIconButton.js +1 -1
  66. package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  67. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +9 -4
  68. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +24 -6
  69. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  70. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +46 -20
  71. package/lib/cjs/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +6 -0
  72. package/lib/cjs/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  73. package/lib/cjs/components/SnippetNotifications/SnippetNotifications.js +7 -0
  74. package/lib/cjs/components/ToastNotifications/ToastNotifications.js +7 -0
  75. package/lib/cjs/components/User/User.d.ts +6 -1
  76. package/lib/cjs/components/User/User.js +5 -4
  77. package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
  78. package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.js +46 -0
  79. package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
  80. package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +183 -0
  81. package/lib/cjs/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
  82. package/lib/cjs/components/UserSubscribedGroupsWidget/constants.js +4 -0
  83. package/lib/cjs/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
  84. package/lib/cjs/components/UserSubscribedGroupsWidget/index.js +8 -0
  85. package/lib/cjs/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
  86. package/lib/cjs/constants/PubSub.d.ts +28 -0
  87. package/lib/cjs/constants/PubSub.js +22 -0
  88. package/lib/cjs/index.d.ts +6 -3
  89. package/lib/cjs/index.js +13 -4
  90. package/lib/cjs/types/index.d.ts +2 -1
  91. package/lib/esm/components/AccountRecover/AccountRecover.js +6 -1
  92. package/lib/esm/components/BottomNavigation/BottomNavigation.js +5 -4
  93. package/lib/esm/components/CategoryHeader/Skeleton.js +3 -2
  94. package/lib/esm/components/ChangeGroupCover/ChangeGroupCover.js +6 -6
  95. package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +19 -16
  96. package/lib/esm/components/Composer/Attributes/Attributes.js +3 -3
  97. package/lib/esm/components/Composer/Composer.js +3 -3
  98. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -1
  99. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +9 -19
  100. package/lib/esm/components/Editor/Editor.js +2 -0
  101. package/lib/esm/components/Editor/nodes/ImageNode.js +6 -0
  102. package/lib/esm/components/Editor/plugins/ImagePlugin.js +4 -0
  103. package/lib/esm/components/Editor/plugins/ToolbarPlugin.js +19 -5
  104. package/lib/esm/components/FeedObject/Actions/Share/Share.js +19 -17
  105. package/lib/esm/components/FeedObject/Contributors/Contributors.js +1 -1
  106. package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
  107. package/lib/esm/components/FeedObject/FeedObject.js +28 -9
  108. package/lib/esm/components/FeedObject/Poll/Poll.js +20 -20
  109. package/lib/esm/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  110. package/lib/esm/components/Footer/Footer.js +2 -2
  111. package/lib/esm/components/Group/Group.d.ts +8 -0
  112. package/lib/esm/components/Group/Group.js +21 -9
  113. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
  114. package/lib/esm/components/GroupForm/GroupForm.js +64 -13
  115. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
  116. package/lib/esm/components/GroupHeader/GroupHeader.js +55 -13
  117. package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +63 -9
  118. package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +31 -9
  119. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  120. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.js +218 -0
  121. package/lib/esm/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  122. package/lib/esm/components/GroupInvitedWidget/Skeleton.js +34 -0
  123. package/lib/esm/components/GroupInvitedWidget/constants.d.ts +1 -0
  124. package/lib/esm/components/GroupInvitedWidget/constants.js +1 -0
  125. package/lib/esm/components/GroupInvitedWidget/index.d.ts +4 -0
  126. package/lib/esm/components/GroupInvitedWidget/index.js +4 -0
  127. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  128. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +9 -4
  129. package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +26 -5
  130. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  131. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  132. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  133. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +148 -0
  134. package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
  135. package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
  136. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  137. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +30 -11
  138. package/lib/esm/components/Groups/Groups.d.ts +15 -8
  139. package/lib/esm/components/Groups/Groups.js +91 -37
  140. package/lib/esm/components/Groups/Skeleton.d.ts +4 -0
  141. package/lib/esm/components/Groups/Skeleton.js +2 -2
  142. package/lib/esm/components/InlineComposerWidget/InlineComposerWidget.js +9 -2
  143. package/lib/esm/components/NavigationSettingsIconButton/NavigationSettingsIconButton.js +4 -4
  144. package/lib/esm/components/NavigationToolbar/NavigationToolbar.js +10 -3
  145. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +1 -0
  146. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +11 -3
  147. package/lib/esm/components/Notification/Group/Group.d.ts +15 -0
  148. package/lib/esm/components/Notification/Group/Group.js +75 -0
  149. package/lib/esm/components/Notification/Group/index.d.ts +3 -0
  150. package/lib/esm/components/Notification/Group/index.js +2 -0
  151. package/lib/esm/components/Notification/Notification.js +31 -1
  152. package/lib/esm/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  153. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +7 -1
  154. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +17 -9
  155. package/lib/esm/components/PrivateMessageSettingsIconButton/PrivateMessageSettingsIconButton.js +1 -1
  156. package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  157. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +9 -4
  158. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
  159. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  160. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +48 -22
  161. package/lib/esm/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +7 -1
  162. package/lib/esm/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  163. package/lib/esm/components/SnippetNotifications/SnippetNotifications.js +7 -0
  164. package/lib/esm/components/ToastNotifications/ToastNotifications.js +7 -0
  165. package/lib/esm/components/User/User.d.ts +6 -1
  166. package/lib/esm/components/User/User.js +5 -4
  167. package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
  168. package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.js +42 -0
  169. package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
  170. package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +180 -0
  171. package/lib/esm/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
  172. package/lib/esm/components/UserSubscribedGroupsWidget/constants.js +1 -0
  173. package/lib/esm/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
  174. package/lib/esm/components/UserSubscribedGroupsWidget/index.js +4 -0
  175. package/lib/esm/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
  176. package/lib/esm/constants/PubSub.d.ts +28 -0
  177. package/lib/esm/constants/PubSub.js +19 -0
  178. package/lib/esm/index.d.ts +6 -3
  179. package/lib/esm/index.js +6 -3
  180. package/lib/esm/types/index.d.ts +2 -1
  181. package/lib/umd/311.js +2 -0
  182. package/lib/umd/react-ui.js +1 -1
  183. package/package.json +9 -9
  184. package/lib/umd/871.js +0 -2
  185. /package/lib/umd/{871.js.LICENSE.txt → 311.js.LICENSE.txt} +0 -0
@@ -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;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importDefault(require("react"));
5
+ const Widget_1 = tslib_1.__importDefault(require("../Widget"));
6
+ const styles_1 = require("@mui/material/styles");
7
+ const material_1 = require("@mui/material");
8
+ const List_1 = tslib_1.__importDefault(require("@mui/material/List"));
9
+ const Skeleton_1 = tslib_1.__importDefault(require("../Group/Skeleton"));
10
+ const PREFIX = 'SCUserSubscribedGroupsWidgetSkeleton';
11
+ const classes = {
12
+ root: `${PREFIX}-skeleton-root`,
13
+ list: `${PREFIX}-list`
14
+ };
15
+ const Root = (0, styles_1.styled)(Widget_1.default, {
16
+ name: PREFIX,
17
+ slot: 'SkeletonRoot'
18
+ })(() => ({}));
19
+ /**
20
+ * > API documentation for the Community-JS User Profile Categories Followed Widget Skeleton component. Learn about the available props and the CSS API.
21
+
22
+ #### Import
23
+
24
+ ```jsx
25
+ import {UserSubscribedGroupsWidgetSkeleton} from '@selfcommunity/react-ui';
26
+ ```
27
+
28
+ #### Component Name
29
+
30
+ The name `SCUserCategoriesFollowedWidget-skeleton-root` can be used when providing style overrides in the theme.
31
+
32
+ #### CSS
33
+
34
+ |Rule Name|Global class|Description|
35
+ |---|---|---|
36
+ |root|.SCUserSubscribedGroupsWidget-skeleton-root|Styles applied to the root element.|
37
+ *
38
+ */
39
+ function UserSubscribedGroupsWidgetSkeleton(props) {
40
+ return (react_1.default.createElement(Root, Object.assign({ className: classes.root }, props),
41
+ react_1.default.createElement(material_1.CardContent, null,
42
+ react_1.default.createElement(List_1.default, { className: classes.list }, [...Array(3)].map((category, index) => (react_1.default.createElement(material_1.ListItem, { key: index },
43
+ react_1.default.createElement(Skeleton_1.default, { elevation: 0 })))))),
44
+ ");"));
45
+ }
46
+ exports.default = UserSubscribedGroupsWidgetSkeleton;
@@ -0,0 +1,68 @@
1
+ import { CacheStrategies } from '@selfcommunity/utils';
2
+ import { BaseDialogProps } from '../../shared/BaseDialog';
3
+ import { WidgetProps } from '../Widget';
4
+ import { VirtualScrollerItemProps } from '../../types/virtualScroller';
5
+ import { GroupProps } from '../Group';
6
+ export interface UserSubscribedGroupsWidgetProps extends VirtualScrollerItemProps, WidgetProps {
7
+ /**
8
+ * The user id
9
+ * @default null
10
+ */
11
+ userId: number;
12
+ /**
13
+ * Hides this component
14
+ * @default false
15
+ */
16
+ autoHide?: boolean;
17
+ /**
18
+ * Limit the number of groups to show
19
+ * @default false
20
+ */
21
+ limit?: number;
22
+ /**
23
+ * Props to spread to single group object
24
+ * @default empty object
25
+ */
26
+ GroupProps?: GroupProps;
27
+ /**
28
+ * Caching strategies
29
+ * @default CacheStrategies.CACHE_FIRST
30
+ */
31
+ cacheStrategy?: CacheStrategies;
32
+ /**
33
+ * Props to spread to subscribed groups dialog
34
+ * @default {}
35
+ */
36
+ DialogProps?: BaseDialogProps;
37
+ /**
38
+ * Other props
39
+ */
40
+ [p: string]: any;
41
+ }
42
+ /**
43
+ * > API documentation for the Community-JS User Profile Groups Subscribed Widget component. Learn about the available props and the CSS API.
44
+ *
45
+ *
46
+ * This component renders the list of the groups that the given user follows.
47
+ * Take a look at our <strong>demo</strong> component [here](/docs/sdk/community-js/react-ui/Components/UserSubscribedGroups)
48
+
49
+ #### Import
50
+ ```jsx
51
+ import {UserSubscribedGroupsWidget} from '@selfcommunity/react-ui';
52
+ ```
53
+ #### Component Name
54
+ The name `SCUserSubscribedGroupsWidget` can be used when providing style overrides in the theme.
55
+
56
+ #### CSS
57
+
58
+ |Rule Name|Global class|Description|
59
+ |---|---|---|
60
+ |root|.SCUserSubscribedGroupsWidget-root|Styles applied to the root element.|
61
+ |title|.SCUserSubscribedGroupsWidget-title|Styles applied to the title element.|
62
+ |noResults|.SCUserSubscribedGroupsWidget-no-results|Styles applied to no results section.|
63
+ |showMore|.SCUserSubscribedGroupsWidget-show-more|Styles applied to show more button element.|
64
+ |dialogRoot|.SCUserSubscribedGroupsWidget-dialog-root|Styles applied to the root dialog element.|
65
+ |endMessage|.SCUserSubscribedGroupsWidget-end-message|Styles applied to the end message element.|
66
+ * @param inProps
67
+ */
68
+ export default function UserSubscribedGroupsWidget(inProps: UserSubscribedGroupsWidgetProps): JSX.Element;