@selfcommunity/react-ui 0.7.9-alpha.6 → 0.7.9-alpha.61

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 (160) hide show
  1. package/lib/cjs/components/BottomNavigation/BottomNavigation.js +2 -2
  2. package/lib/cjs/components/CategoryHeader/Skeleton.js +3 -2
  3. package/lib/cjs/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  4. package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  5. package/lib/cjs/components/Composer/Attributes/Attributes.js +3 -3
  6. package/lib/cjs/components/Composer/Composer.js +3 -3
  7. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -1
  8. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +9 -19
  9. package/lib/cjs/components/FeedObject/Contributors/Contributors.js +1 -1
  10. package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
  11. package/lib/cjs/components/FeedObject/FeedObject.js +23 -6
  12. package/lib/cjs/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  13. package/lib/cjs/components/Group/Group.d.ts +8 -0
  14. package/lib/cjs/components/Group/Group.js +40 -5
  15. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
  16. package/lib/cjs/components/GroupForm/GroupForm.js +33 -10
  17. package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
  18. package/lib/cjs/components/GroupHeader/GroupHeader.js +53 -11
  19. package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +40 -7
  20. package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +33 -11
  21. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  22. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.js +221 -0
  23. package/lib/cjs/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  24. package/lib/cjs/components/GroupInvitedWidget/Skeleton.js +38 -0
  25. package/lib/cjs/components/GroupInvitedWidget/constants.d.ts +1 -0
  26. package/lib/cjs/components/GroupInvitedWidget/constants.js +4 -0
  27. package/lib/cjs/components/GroupInvitedWidget/index.d.ts +4 -0
  28. package/lib/cjs/components/GroupInvitedWidget/index.js +8 -0
  29. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  30. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +8 -3
  31. package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +25 -4
  32. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  33. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  34. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  35. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +145 -0
  36. package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
  37. package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
  38. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  39. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +30 -11
  40. package/lib/cjs/components/Groups/Groups.d.ts +19 -16
  41. package/lib/cjs/components/Groups/Groups.js +85 -86
  42. package/lib/cjs/components/Groups/Skeleton.d.ts +4 -0
  43. package/lib/cjs/components/Groups/Skeleton.js +2 -2
  44. package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  45. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.js +1 -1
  46. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +5 -0
  47. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +11 -4
  48. package/lib/cjs/components/Notification/Group/Group.d.ts +15 -0
  49. package/lib/cjs/components/Notification/Group/Group.js +78 -0
  50. package/lib/cjs/components/Notification/Group/index.d.ts +3 -0
  51. package/lib/cjs/components/Notification/Group/index.js +5 -0
  52. package/lib/cjs/components/Notification/Notification.js +31 -1
  53. package/lib/cjs/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  54. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  55. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +12 -7
  56. package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  57. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  58. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +24 -6
  59. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  60. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +45 -20
  61. package/lib/cjs/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +6 -0
  62. package/lib/cjs/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  63. package/lib/cjs/components/SnippetNotifications/SnippetNotifications.js +7 -0
  64. package/lib/cjs/components/ToastNotifications/ToastNotifications.js +7 -0
  65. package/lib/cjs/components/User/User.d.ts +6 -1
  66. package/lib/cjs/components/User/User.js +5 -4
  67. package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
  68. package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.js +46 -0
  69. package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
  70. package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +183 -0
  71. package/lib/cjs/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
  72. package/lib/cjs/components/UserSubscribedGroupsWidget/constants.js +4 -0
  73. package/lib/cjs/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
  74. package/lib/cjs/components/UserSubscribedGroupsWidget/index.js +8 -0
  75. package/lib/cjs/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
  76. package/lib/cjs/constants/PubSub.d.ts +28 -0
  77. package/lib/cjs/constants/PubSub.js +22 -0
  78. package/lib/cjs/index.d.ts +6 -2
  79. package/lib/cjs/index.js +15 -4
  80. package/lib/esm/components/BottomNavigation/BottomNavigation.js +2 -2
  81. package/lib/esm/components/CategoryHeader/Skeleton.js +3 -2
  82. package/lib/esm/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  83. package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  84. package/lib/esm/components/Composer/Attributes/Attributes.js +3 -3
  85. package/lib/esm/components/Composer/Composer.js +3 -3
  86. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -1
  87. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +9 -19
  88. package/lib/esm/components/FeedObject/Contributors/Contributors.js +1 -1
  89. package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
  90. package/lib/esm/components/FeedObject/FeedObject.js +24 -7
  91. package/lib/esm/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  92. package/lib/esm/components/Group/Group.d.ts +8 -0
  93. package/lib/esm/components/Group/Group.js +44 -9
  94. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
  95. package/lib/esm/components/GroupForm/GroupForm.js +33 -10
  96. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
  97. package/lib/esm/components/GroupHeader/GroupHeader.js +55 -13
  98. package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +40 -7
  99. package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +33 -11
  100. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  101. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.js +218 -0
  102. package/lib/esm/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  103. package/lib/esm/components/GroupInvitedWidget/Skeleton.js +34 -0
  104. package/lib/esm/components/GroupInvitedWidget/constants.d.ts +1 -0
  105. package/lib/esm/components/GroupInvitedWidget/constants.js +1 -0
  106. package/lib/esm/components/GroupInvitedWidget/index.d.ts +4 -0
  107. package/lib/esm/components/GroupInvitedWidget/index.js +4 -0
  108. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  109. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +9 -4
  110. package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +26 -5
  111. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  112. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  113. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  114. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +142 -0
  115. package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
  116. package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
  117. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  118. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +30 -11
  119. package/lib/esm/components/Groups/Groups.d.ts +19 -16
  120. package/lib/esm/components/Groups/Groups.js +90 -91
  121. package/lib/esm/components/Groups/Skeleton.d.ts +4 -0
  122. package/lib/esm/components/Groups/Skeleton.js +2 -2
  123. package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  124. package/lib/esm/components/NavigationToolbar/NavigationToolbar.js +1 -1
  125. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +5 -0
  126. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +13 -6
  127. package/lib/esm/components/Notification/Group/Group.d.ts +15 -0
  128. package/lib/esm/components/Notification/Group/Group.js +75 -0
  129. package/lib/esm/components/Notification/Group/index.d.ts +3 -0
  130. package/lib/esm/components/Notification/Group/index.js +2 -0
  131. package/lib/esm/components/Notification/Notification.js +31 -1
  132. package/lib/esm/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  133. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  134. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +13 -8
  135. package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  136. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  137. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
  138. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  139. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +47 -22
  140. package/lib/esm/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +7 -1
  141. package/lib/esm/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  142. package/lib/esm/components/SnippetNotifications/SnippetNotifications.js +7 -0
  143. package/lib/esm/components/ToastNotifications/ToastNotifications.js +7 -0
  144. package/lib/esm/components/User/User.d.ts +6 -1
  145. package/lib/esm/components/User/User.js +5 -4
  146. package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
  147. package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.js +42 -0
  148. package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
  149. package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +180 -0
  150. package/lib/esm/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
  151. package/lib/esm/components/UserSubscribedGroupsWidget/constants.js +1 -0
  152. package/lib/esm/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
  153. package/lib/esm/components/UserSubscribedGroupsWidget/index.js +4 -0
  154. package/lib/esm/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
  155. package/lib/esm/constants/PubSub.d.ts +28 -0
  156. package/lib/esm/constants/PubSub.js +19 -0
  157. package/lib/esm/index.d.ts +6 -2
  158. package/lib/esm/index.js +8 -4
  159. package/lib/umd/react-ui.js +1 -1
  160. package/package.json +6 -6
@@ -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.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
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;
@@ -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;