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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/lib/cjs/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  2. package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  3. package/lib/cjs/components/CommentObject/CommentObject.js +18 -0
  4. package/lib/cjs/components/Composer/Attributes/Attributes.d.ts +1 -1
  5. package/lib/cjs/components/Composer/Attributes/Attributes.js +9 -2
  6. package/lib/cjs/components/Composer/Composer.d.ts +2 -1
  7. package/lib/cjs/components/Composer/Composer.js +39 -12
  8. package/lib/cjs/components/Composer/Content/ContentDiscussion/ContentDiscussion.js +7 -3
  9. package/lib/cjs/components/Composer/Content/ContentPost/ContentPost.js +4 -3
  10. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +7 -1
  11. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +46 -12
  12. package/lib/cjs/components/CreateGroupButton/CreateGroupButton.d.ts +2 -2
  13. package/lib/cjs/components/CreateGroupButton/CreateGroupButton.js +5 -6
  14. package/lib/cjs/components/CustomAdv/CustomAdv.d.ts +4 -0
  15. package/lib/cjs/components/{CreateGroup/CreateGroup.d.ts → EditGroupButton/EditGroupButton.d.ts} +11 -16
  16. package/lib/cjs/components/EditGroupButton/EditGroupButton.js +61 -0
  17. package/lib/cjs/components/EditGroupButton/index.d.ts +3 -0
  18. package/lib/cjs/components/EditGroupButton/index.js +5 -0
  19. package/lib/cjs/components/FeedObject/Actions/Follow/Follow.js +18 -0
  20. package/lib/cjs/components/FeedObject/Actions/Share/Share.js +18 -0
  21. package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
  22. package/lib/cjs/components/FeedObject/FeedObject.js +43 -9
  23. package/lib/cjs/components/Group/Group.d.ts +4 -3
  24. package/lib/cjs/components/Group/Group.js +5 -4
  25. package/lib/cjs/components/Group/Skeleton.js +1 -1
  26. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.d.ts +49 -0
  27. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +101 -0
  28. package/lib/cjs/components/GroupAutocomplete/index.d.ts +3 -0
  29. package/lib/cjs/components/GroupAutocomplete/index.js +5 -0
  30. package/lib/cjs/components/GroupForm/GroupForm.d.ts +70 -0
  31. package/lib/cjs/components/GroupForm/GroupForm.js +239 -0
  32. package/lib/cjs/components/GroupForm/constants.d.ts +1 -0
  33. package/lib/cjs/components/{CreateGroup → GroupForm}/constants.js +1 -1
  34. package/lib/cjs/components/GroupForm/index.d.ts +3 -0
  35. package/lib/cjs/components/GroupForm/index.js +5 -0
  36. package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
  37. package/lib/cjs/components/GroupHeader/GroupHeader.js +21 -11
  38. package/lib/cjs/components/GroupHeader/Skeleton.d.ts +2 -4
  39. package/lib/cjs/components/GroupHeader/Skeleton.js +10 -10
  40. package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +12 -8
  41. package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +7 -6
  42. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  43. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +3 -2
  44. package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +36 -16
  45. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  46. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  47. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  48. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +132 -0
  49. package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
  50. package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
  51. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  52. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +24 -9
  53. package/lib/cjs/components/Groups/Groups.d.ts +16 -16
  54. package/lib/cjs/components/Groups/Groups.js +47 -96
  55. package/lib/cjs/components/Groups/Skeleton.d.ts +14 -2
  56. package/lib/cjs/components/Groups/Skeleton.js +12 -5
  57. package/lib/cjs/components/InlineComposerWidget/InlineComposerWidget.d.ts +2 -1
  58. package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  59. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
  60. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
  61. package/lib/cjs/components/Notification/Group/Group.d.ts +15 -0
  62. package/lib/cjs/components/Notification/Group/Group.js +79 -0
  63. package/lib/cjs/components/Notification/Group/index.d.ts +3 -0
  64. package/lib/cjs/components/Notification/Group/index.js +5 -0
  65. package/lib/cjs/components/Notification/Notification.js +32 -1
  66. package/lib/cjs/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  67. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  68. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +10 -7
  69. package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  70. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  71. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +24 -6
  72. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  73. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +45 -20
  74. package/lib/cjs/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  75. package/lib/cjs/components/SnippetNotifications/SnippetNotifications.js +7 -0
  76. package/lib/cjs/components/ToastNotifications/ToastNotifications.js +7 -0
  77. package/lib/cjs/components/VoteButton/VoteButton.js +19 -0
  78. package/lib/cjs/index.d.ts +7 -4
  79. package/lib/cjs/index.js +13 -6
  80. package/lib/esm/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  81. package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  82. package/lib/esm/components/CommentObject/CommentObject.js +20 -2
  83. package/lib/esm/components/Composer/Attributes/Attributes.d.ts +1 -1
  84. package/lib/esm/components/Composer/Attributes/Attributes.js +9 -2
  85. package/lib/esm/components/Composer/Composer.d.ts +2 -1
  86. package/lib/esm/components/Composer/Composer.js +39 -12
  87. package/lib/esm/components/Composer/Content/ContentDiscussion/ContentDiscussion.js +7 -3
  88. package/lib/esm/components/Composer/Content/ContentPost/ContentPost.js +4 -3
  89. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +7 -1
  90. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +45 -12
  91. package/lib/esm/components/CreateGroupButton/CreateGroupButton.d.ts +2 -2
  92. package/lib/esm/components/CreateGroupButton/CreateGroupButton.js +5 -6
  93. package/lib/esm/components/CustomAdv/CustomAdv.d.ts +4 -0
  94. package/lib/esm/components/{CreateGroup/CreateGroup.d.ts → EditGroupButton/EditGroupButton.d.ts} +11 -16
  95. package/lib/esm/components/EditGroupButton/EditGroupButton.js +58 -0
  96. package/lib/esm/components/EditGroupButton/index.d.ts +3 -0
  97. package/lib/esm/components/EditGroupButton/index.js +2 -0
  98. package/lib/esm/components/FeedObject/Actions/Follow/Follow.js +20 -2
  99. package/lib/esm/components/FeedObject/Actions/Share/Share.js +20 -2
  100. package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
  101. package/lib/esm/components/FeedObject/FeedObject.js +45 -11
  102. package/lib/esm/components/Group/Group.d.ts +4 -3
  103. package/lib/esm/components/Group/Group.js +5 -4
  104. package/lib/esm/components/Group/Skeleton.js +1 -1
  105. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.d.ts +49 -0
  106. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +99 -0
  107. package/lib/esm/components/GroupAutocomplete/index.d.ts +3 -0
  108. package/lib/esm/components/GroupAutocomplete/index.js +2 -0
  109. package/lib/esm/components/GroupForm/GroupForm.d.ts +70 -0
  110. package/lib/esm/components/GroupForm/GroupForm.js +236 -0
  111. package/lib/esm/components/GroupForm/constants.d.ts +1 -0
  112. package/lib/esm/components/GroupForm/constants.js +1 -0
  113. package/lib/esm/components/GroupForm/index.d.ts +3 -0
  114. package/lib/esm/components/GroupForm/index.js +2 -0
  115. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
  116. package/lib/esm/components/GroupHeader/GroupHeader.js +21 -11
  117. package/lib/esm/components/GroupHeader/Skeleton.d.ts +2 -4
  118. package/lib/esm/components/GroupHeader/Skeleton.js +10 -10
  119. package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +12 -8
  120. package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +7 -6
  121. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  122. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +4 -3
  123. package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +38 -18
  124. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  125. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  126. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  127. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +129 -0
  128. package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
  129. package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
  130. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  131. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +25 -10
  132. package/lib/esm/components/Groups/Groups.d.ts +16 -16
  133. package/lib/esm/components/Groups/Groups.js +52 -101
  134. package/lib/esm/components/Groups/Skeleton.d.ts +14 -2
  135. package/lib/esm/components/Groups/Skeleton.js +13 -5
  136. package/lib/esm/components/InlineComposerWidget/InlineComposerWidget.d.ts +2 -1
  137. package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  138. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
  139. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
  140. package/lib/esm/components/Notification/Group/Group.d.ts +15 -0
  141. package/lib/esm/components/Notification/Group/Group.js +76 -0
  142. package/lib/esm/components/Notification/Group/index.d.ts +3 -0
  143. package/lib/esm/components/Notification/Group/index.js +2 -0
  144. package/lib/esm/components/Notification/Notification.js +32 -1
  145. package/lib/esm/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  146. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  147. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +11 -8
  148. package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  149. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  150. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
  151. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  152. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +47 -22
  153. package/lib/esm/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  154. package/lib/esm/components/SnippetNotifications/SnippetNotifications.js +7 -0
  155. package/lib/esm/components/ToastNotifications/ToastNotifications.js +7 -0
  156. package/lib/esm/components/VoteButton/VoteButton.js +20 -1
  157. package/lib/esm/index.d.ts +7 -4
  158. package/lib/esm/index.js +8 -5
  159. package/lib/umd/react-ui.js +1 -1
  160. package/package.json +6 -6
  161. package/lib/cjs/components/CreateGroup/CreateGroup.js +0 -187
  162. package/lib/cjs/components/CreateGroup/constants.d.ts +0 -1
  163. package/lib/cjs/components/CreateGroup/index.d.ts +0 -3
  164. package/lib/cjs/components/CreateGroup/index.js +0 -5
  165. package/lib/esm/components/CreateGroup/CreateGroup.js +0 -184
  166. package/lib/esm/components/CreateGroup/constants.d.ts +0 -1
  167. package/lib/esm/components/CreateGroup/constants.js +0 -1
  168. package/lib/esm/components/CreateGroup/index.d.ts +0 -3
  169. package/lib/esm/components/CreateGroup/index.js +0 -2
@@ -39,6 +39,7 @@ const Root = styled(NotificationItem, {
39
39
  * @param props
40
40
  */
41
41
  export default function PrivateMessageNotification(props) {
42
+ var _a, _b, _c, _d, _e;
42
43
  // PROPS
43
44
  const { notificationObject, id = `n_${props.notificationObject['sid']}`, className, template = SCNotificationObjectTemplateType.DETAIL } = props, rest = __rest(props, ["notificationObject", "id", "className", "template"]);
44
45
  // CONTEXT
@@ -89,7 +90,9 @@ export default function PrivateMessageNotification(props) {
89
90
  React.createElement(FormattedMessage, { id: 'ui.userToastNotifications.privateMessage.sentMessage', defaultMessage: 'ui.userToastNotifications.privateMessage.sentMessage' }),
90
91
  ":",
91
92
  React.createElement(Box, { className: classes.messageWrap },
92
- React.createElement(Link, { to: scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender), className: classes.message },
93
+ React.createElement(Link, { to: ((_a = notificationObject.message) === null || _a === void 0 ? void 0 : _a.group)
94
+ ? scRoutingContext.url(SCRoutes.GROUP_MESSAGES_ROUTE_NAME, notificationObject.message.group)
95
+ : scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender), className: classes.message },
93
96
  React.createElement(Typography, { variant: "body2", dangerouslySetInnerHTML: { __html: notificationObject.message.message } }))))),
94
97
  isSnippetTemplate && (React.createElement(Box, null,
95
98
  React.createElement(Typography, { component: "div", color: "inherit" },
@@ -97,13 +100,17 @@ export default function PrivateMessageNotification(props) {
97
100
  to: scRoutingContext.url(SCRoutes.USER_PROFILE_ROUTE_NAME, notificationObject.message.sender)
98
101
  }), { onClick: notificationObject.message.sender.deleted ? () => setOpenAlert(true) : null, className: classes.username }), notificationObject.message.sender.username),
99
102
  ' ',
100
- React.createElement(Link, { to: scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender), className: classes.messageLabel }, intl.formatMessage(messages.receivePrivateMessage, {
103
+ React.createElement(Link, { to: ((_b = notificationObject.message) === null || _b === void 0 ? void 0 : _b.group)
104
+ ? scRoutingContext.url(SCRoutes.GROUP_MESSAGES_ROUTE_NAME, notificationObject.message.group)
105
+ : scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender), className: classes.messageLabel }, intl.formatMessage(messages.receivePrivateMessage, {
101
106
  total: 1,
102
107
  b: (...chunks) => React.createElement("strong", null, chunks)
103
108
  })))))), footer: isToastTemplate && (React.createElement(Stack, { direction: "row", justifyContent: "space-between", alignItems: "center", spacing: 2 },
104
109
  React.createElement(DateTimeAgo, { date: notificationObject.active_at }),
105
110
  React.createElement(Typography, { color: "primary" },
106
- React.createElement(Link, { to: scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender) }, scUserContext.user && follower ? (React.createElement(FormattedMessage, { id: "ui.userToastNotifications.replyMessage", defaultMessage: 'ui.userToastNotifications.replyMessage' })) : (React.createElement(FormattedMessage, { id: "ui.userToastNotifications.viewMessage", defaultMessage: 'ui.userToastNotifications.viewMessage' })))))) }, rest)));
111
+ React.createElement(Link, { to: ((_c = notificationObject.message) === null || _c === void 0 ? void 0 : _c.group)
112
+ ? scRoutingContext.url(SCRoutes.GROUP_MESSAGES_ROUTE_NAME, notificationObject.message.group)
113
+ : scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender) }, scUserContext.user && follower ? (React.createElement(FormattedMessage, { id: "ui.userToastNotifications.replyMessage", defaultMessage: 'ui.userToastNotifications.replyMessage' })) : (React.createElement(FormattedMessage, { id: "ui.userToastNotifications.viewMessage", defaultMessage: 'ui.userToastNotifications.viewMessage' })))))) }, rest)));
107
114
  }
108
115
  return (React.createElement(React.Fragment, null,
109
116
  React.createElement(Root, Object.assign({ id: id, className: classNames(classes.root, className, `${PREFIX}-${template}`), template: template, isNew: notificationObject.is_new, disableTypography: true, actions: React.createElement(Stack, { direction: "row", justifyContent: "space-between", alignItems: "center", spacing: 2 },
@@ -112,8 +119,12 @@ export default function PrivateMessageNotification(props) {
112
119
  ? null
113
120
  : scUserContext.user
114
121
  ? follower === null || manager.isLoading(notificationObject.message.sender)
115
- : null, to: scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender) }, scUserContext.user && follower ? (React.createElement(FormattedMessage, { id: "ui.notification.privateMessage.btnReplyLabel", defaultMessage: "ui.notification.privateMessage.btnReplyLabel" })) : (React.createElement(FormattedMessage, { id: "ui.notification.privateMessage.btnViewLabel", defaultMessage: "ui.notification.privateMessage.btnViewLabel" })))), primary: React.createElement(Box, { className: classes.messageWrap },
116
- React.createElement(Link, { to: scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender), className: classes.message },
122
+ : null, to: ((_d = notificationObject.message) === null || _d === void 0 ? void 0 : _d.group)
123
+ ? scRoutingContext.url(SCRoutes.GROUP_MESSAGES_ROUTE_NAME, notificationObject.message.group)
124
+ : scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender) }, scUserContext.user && follower ? (React.createElement(FormattedMessage, { id: "ui.notification.privateMessage.btnReplyLabel", defaultMessage: "ui.notification.privateMessage.btnReplyLabel" })) : (React.createElement(FormattedMessage, { id: "ui.notification.privateMessage.btnViewLabel", defaultMessage: "ui.notification.privateMessage.btnViewLabel" })))), primary: React.createElement(Box, { className: classes.messageWrap },
125
+ React.createElement(Link, { to: ((_e = notificationObject.message) === null || _e === void 0 ? void 0 : _e.group)
126
+ ? scRoutingContext.url(SCRoutes.GROUP_MESSAGES_ROUTE_NAME, notificationObject.message.group)
127
+ : scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender), className: classes.message },
117
128
  React.createElement(Typography, { variant: "body2", dangerouslySetInnerHTML: { __html: notificationObject.message.message } }))) }, rest)),
118
129
  openAlert && React.createElement(UserDeletedSnackBar, { open: openAlert, handleClose: () => setOpenAlert(false) })));
119
130
  }
@@ -8,7 +8,7 @@ export interface PrivateMessageComponentProps {
8
8
  * Handler on message click
9
9
  * @default null
10
10
  */
11
- onItemClick?: (id: any) => void;
11
+ onItemClick?: (id: any, type: any) => void;
12
12
  /**
13
13
  * Handler on single message open
14
14
  * @default null
@@ -5,7 +5,7 @@ import { Grid, useMediaQuery, useTheme } from '@mui/material';
5
5
  import { useSCPreferences, useSCUser } from '@selfcommunity/react-core';
6
6
  import classNames from 'classnames';
7
7
  import { useThemeProps } from '@mui/system';
8
- import { SCFeatureName, SCPrivateMessageStatusType } from '@selfcommunity/types';
8
+ import { SCFeatureName, SCPrivateMessageStatusType, SCPrivateMessageType } from '@selfcommunity/types';
9
9
  import PrivateMessageThread from '../PrivateMessageThread';
10
10
  import PrivateMessageSnippets from '../PrivateMessageSnippets';
11
11
  import { PREFIX } from './constants';
@@ -65,6 +65,7 @@ export default function PrivateMessageComponent(inProps) {
65
65
  const isMobile = useMediaQuery(theme.breakpoints.down('md'));
66
66
  const [layout, setLayout] = useState('default');
67
67
  const [obj, setObj] = useState(id !== null && id !== void 0 ? id : null);
68
+ const [type, setType] = useState(null);
68
69
  const isNew = obj && obj === SCPrivateMessageStatusType.NEW;
69
70
  const [openNewMessage, setOpenNewMessage] = useState(isNew !== null && isNew !== void 0 ? isNew : false);
70
71
  const mobileSnippetsView = (layout === 'default' && !obj) || (layout === 'mobile' && !obj);
@@ -86,10 +87,12 @@ export default function PrivateMessageComponent(inProps) {
86
87
  /**
87
88
  * Handles thread opening on click
88
89
  * @param item
90
+ * @param type
89
91
  */
90
- const handleThreadOpening = (item) => {
91
- onItemClick && onItemClick(messageReceiver(item, authUserId));
92
- setObj(messageReceiver(item, authUserId));
92
+ const handleThreadOpening = (item, type) => {
93
+ onItemClick && onItemClick(item.group ? item.group.id : messageReceiver(item, authUserId), type);
94
+ setType(type);
95
+ setObj(item.group ? item : messageReceiver(item, authUserId));
93
96
  setOpenNewMessage(false);
94
97
  };
95
98
  /**
@@ -105,7 +108,7 @@ export default function PrivateMessageComponent(inProps) {
105
108
  const handleOpenNewMessage = () => {
106
109
  setOpenNewMessage(!openNewMessage);
107
110
  setObj(SCPrivateMessageStatusType.NEW);
108
- onItemClick && onItemClick(SCPrivateMessageStatusType.NEW);
111
+ onItemClick && onItemClick(SCPrivateMessageStatusType.NEW, SCPrivateMessageType.NEW);
109
112
  };
110
113
  /**
111
114
  * Handles new messages open from user profile page or notifications section
@@ -127,7 +130,7 @@ export default function PrivateMessageComponent(inProps) {
127
130
  * Handles state update when a new message is sent
128
131
  */
129
132
  const handleOnNewMessageSent = (msg, isOne) => {
130
- onItemClick && onItemClick(isOne ? messageReceiver(msg, authUserId) : '');
133
+ onItemClick && onItemClick(isOne ? messageReceiver(msg, authUserId) : '', msg.group ? SCPrivateMessageType.GROUP : SCPrivateMessageType.USER);
131
134
  setObj(isOne ? messageReceiver(msg, authUserId) : null);
132
135
  setOpenNewMessage(false);
133
136
  };
@@ -147,14 +150,14 @@ export default function PrivateMessageComponent(inProps) {
147
150
  onSnippetClick: handleThreadOpening,
148
151
  onNewMessageClick: handleOpenNewMessage,
149
152
  onDeleteConfirm: handleDeleteThread
150
- }, userObj: obj, clearSearch: clear, elevation: 0 })));
153
+ }, threadObj: obj, clearSearch: clear, elevation: 0 })));
151
154
  }
152
155
  /**
153
156
  * Renders thread section
154
157
  */
155
158
  function renderThread() {
156
159
  return (React.createElement(Grid, { item: true, xs: 12, md: 7, className: classNames(classes.threadBox, { [classes.hide]: isMobile && mobileSnippetsView }) },
157
- React.createElement(PrivateMessageThread, { userObj: obj, openNewMessage: openNewMessage, onNewMessageClose: handleMessageBack, onNewMessageSent: handleOnNewMessageSent, onSingleMessageOpen: handleSingleMessage, elevation: 0 })));
160
+ React.createElement(PrivateMessageThread, { threadObj: obj, type: type, openNewMessage: openNewMessage, onNewMessageClose: handleMessageBack, onNewMessageSent: handleOnNewMessageSent, onSingleMessageOpen: handleSingleMessage, elevation: 0 })));
158
161
  }
159
162
  /**
160
163
  * Renders the component (if not hidden by autoHide prop)
@@ -72,10 +72,12 @@ export default function PrivateMessageSnippetItem(inProps) {
72
72
  // STATE
73
73
  const hasBadge = () => {
74
74
  var _a;
75
- if ((message === null || message === void 0 ? void 0 : message.receiver.id) !== ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id)) {
76
- return message === null || message === void 0 ? void 0 : message.receiver.community_badge;
75
+ if (message.receiver) {
76
+ if ((message === null || message === void 0 ? void 0 : message.receiver.id) !== ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id)) {
77
+ return message === null || message === void 0 ? void 0 : message.receiver.community_badge;
78
+ }
79
+ return message === null || message === void 0 ? void 0 : message.sender.community_badge;
77
80
  }
78
- return message === null || message === void 0 ? void 0 : message.sender.community_badge;
79
81
  };
80
82
  if (!message) {
81
83
  return React.createElement(PrivateMessageSnippetItemSkeleton, { elevation: 0 });
@@ -86,10 +88,13 @@ export default function PrivateMessageSnippetItem(inProps) {
86
88
  return (React.createElement(Root, Object.assign({ className: classNames(classes.root, className) }, rest, { secondaryAction: secondaryAction, disablePadding: true }),
87
89
  React.createElement(ListItemButton, { onClick: onItemClick, classes: { root: classNames({ [classes.unread]: message.thread_status === SCPrivateMessageStatusType.NEW }) } },
88
90
  React.createElement(ListItemAvatar, null,
89
- React.createElement(UserAvatar, { hide: !hasBadge() },
90
- React.createElement(Avatar, { alt: ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) === message.receiver.username ? message.sender.username : message.receiver.username, src: ((_b = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _b === void 0 ? void 0 : _b.username) === message.receiver.username ? message.sender.avatar : message.receiver.avatar }))),
91
+ React.createElement(UserAvatar, { hide: !hasBadge() }, message.group ? (React.createElement(Avatar, { alt: message.group.name, src: message.group.image_big })) : (React.createElement(Avatar, { alt: ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) === message.receiver.username ? message.sender.username : message.receiver.username, src: ((_b = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _b === void 0 ? void 0 : _b.username) === message.receiver.username ? message.sender.avatar : message.receiver.avatar })))),
91
92
  React.createElement(ListItemText, { primary: React.createElement(React.Fragment, null,
92
- React.createElement(Typography, { component: "span", className: classes.username }, ((_c = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _c === void 0 ? void 0 : _c.username) === message.receiver.username ? message.sender.username : message.receiver.username),
93
+ React.createElement(Typography, { component: "span", className: classes.username }, message.group
94
+ ? message.group.name
95
+ : ((_c = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _c === void 0 ? void 0 : _c.username) === message.receiver.username
96
+ ? message.sender.username
97
+ : message.receiver.username),
93
98
  hasBadge() && preferences && (React.createElement(Chip, { component: "span", className: classes.badgeLabel, size: "small", label: preferences[SCPreferences.STAFF_STAFF_BADGE_LABEL] })),
94
99
  React.createElement(Typography, { color: "secondary", className: classes.time, component: "span" }, `${intl.formatDate(message.last_message_at, {
95
100
  day: '2-digit',
@@ -20,7 +20,7 @@ export interface PrivateMessageSnippetsProps extends CardProps {
20
20
  *
21
21
  */
22
22
  snippetActions?: {
23
- onSnippetClick?: (msg: any) => void;
23
+ onSnippetClick?: (msg: any, type: any) => void;
24
24
  onNewMessageClick?: () => void;
25
25
  onDeleteConfirm?: (msg: any) => void;
26
26
  };
@@ -29,10 +29,10 @@ export interface PrivateMessageSnippetsProps extends CardProps {
29
29
  */
30
30
  [p: string]: any;
31
31
  /**
32
- * thread user object
32
+ * thread user/ group object
33
33
  * @default null
34
34
  */
35
- userObj?: any;
35
+ threadObj?: any;
36
36
  }
37
37
  /**
38
38
  * > API documentation for the Community-JS PrivateMessageSnippets component. Learn about the available props and the CSS API.
@@ -1,9 +1,9 @@
1
1
  import { __rest } from "tslib";
2
- import React, { useContext, useEffect, useRef, useState } from 'react';
2
+ import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import { styled } from '@mui/material/styles';
4
4
  import { Button, Card, CardContent, Icon, IconButton, List, TextField, useTheme } from '@mui/material';
5
5
  import PubSub from 'pubsub-js';
6
- import { SCNotificationTopicType, SCNotificationTypologyType, SCPrivateMessageStatusType } from '@selfcommunity/types';
6
+ import { SCNotificationTopicType, SCNotificationTypologyType, SCPrivateMessageStatusType, SCPrivateMessageType } from '@selfcommunity/types';
7
7
  import PrivateMessageSnippetsSkeleton from './Skeleton';
8
8
  import PrivateMessageSnippetItem from '../PrivateMessageSnippetItem';
9
9
  import classNames from 'classnames';
@@ -69,25 +69,30 @@ export default function PrivateMessageSnippets(inProps) {
69
69
  props: inProps,
70
70
  name: PREFIX
71
71
  });
72
- const { className = null, userObj = null, snippetActions, clearSearch } = props, rest = __rest(props, ["className", "userObj", "snippetActions", "clearSearch"]);
72
+ const { className = null, threadObj = null, snippetActions, clearSearch } = props, rest = __rest(props, ["className", "threadObj", "snippetActions", "clearSearch"]);
73
73
  // STATE
74
74
  const theme = useTheme();
75
75
  const isMobile = useMediaQuery(theme.breakpoints.down('md'));
76
76
  const { data, updateSnippets } = useSCFetchPrivateMessageSnippets({ cacheStrategy: CacheStrategies.CACHE_FIRST });
77
77
  const [search, setSearch] = useState('');
78
- const isObj = typeof userObj === 'object';
78
+ const isObj = typeof threadObj === 'object';
79
79
  const scUserContext = useContext(SCUserContext);
80
80
  const authUserId = scUserContext.user ? scUserContext.user.id : null;
81
+ const [type, setType] = useState(null);
81
82
  // INTL
82
83
  const intl = useIntl();
83
84
  // REFS
84
85
  const refreshSubscription = useRef(null);
85
86
  // CONST
86
87
  const filteredSnippets = data.snippets.filter((el) => {
88
+ var _a;
87
89
  if (search === '') {
88
90
  return el;
89
91
  }
90
- else if (el.receiver.id === authUserId) {
92
+ else if (el.group) {
93
+ return el.group.slug.includes(search.toLowerCase());
94
+ }
95
+ else if (((_a = el === null || el === void 0 ? void 0 : el.receiver) === null || _a === void 0 ? void 0 : _a.id) === authUserId) {
91
96
  return el.sender.username.includes(search.toLowerCase());
92
97
  }
93
98
  return el.receiver.username.includes(search.toLowerCase());
@@ -99,6 +104,18 @@ export default function PrivateMessageSnippets(inProps) {
99
104
  }
100
105
  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;
101
106
  };
107
+ const isSelected = useMemo(() => {
108
+ return (message) => {
109
+ var _a, _b;
110
+ if (type === SCPrivateMessageType.GROUP) {
111
+ 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);
112
+ }
113
+ else if (type === SCPrivateMessageType.USER) {
114
+ return messageReceiver(message, authUserId) === (isObj ? messageReceiver(threadObj, authUserId) : threadObj);
115
+ }
116
+ return false;
117
+ };
118
+ }, [threadObj, authUserId, type]);
102
119
  //HANDLERS
103
120
  const handleChange = (event) => {
104
121
  setSearch(event.target.value);
@@ -114,7 +131,9 @@ export default function PrivateMessageSnippets(inProps) {
114
131
  snippetActions && snippetActions.onDeleteConfirm(msg);
115
132
  };
116
133
  function handleOpenThread(msg) {
117
- snippetActions && snippetActions.onSnippetClick(msg);
134
+ const _type = msg.group !== null ? SCPrivateMessageType.GROUP : SCPrivateMessageType.USER;
135
+ setType(_type);
136
+ snippetActions && snippetActions.onSnippetClick(msg, _type);
118
137
  handleClear();
119
138
  updateSnippetsParams(msg.id, 'seen');
120
139
  }
@@ -219,6 +238,5 @@ export default function PrivateMessageSnippets(inProps) {
219
238
  } }),
220
239
  React.createElement(List, null, filteredSnippets.map((message) => (React.createElement(PrivateMessageSnippetItem, { message: message, key: message.id, onItemClick: () => handleOpenThread(message), secondaryAction: React.createElement(React.Fragment, null,
221
240
  message.thread_status === SCPrivateMessageStatusType.NEW && (React.createElement(Icon, { fontSize: "small", color: "secondary" }, "fiber_manual_record")),
222
- !isMobile && (React.createElement(PrivateMessageSettingsIconButton, { threadToDelete: messageReceiver(message, authUserId), onItemDeleteConfirm: () => handleDeleteConversation(messageReceiver(message, authUserId)), user: messageReceiver(message, authUserId, true) }))), selected: userObj !== SCPrivateMessageStatusType.NEW &&
223
- messageReceiver(message, authUserId) === (isObj ? messageReceiver(userObj, authUserId) : userObj) })))))))));
241
+ !isMobile && (React.createElement(PrivateMessageSettingsIconButton, { threadToDelete: messageReceiver(message, authUserId), onItemDeleteConfirm: () => handleDeleteConversation(messageReceiver(message, authUserId)), user: messageReceiver(message, authUserId, true) }))), selected: isSelected(message) })))))))));
224
242
  }
@@ -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
  */
@@ -3,11 +3,11 @@ import React, { useCallback, useContext, useEffect, useMemo, useRef, useState }
3
3
  import { styled } from '@mui/material/styles';
4
4
  import { Endpoints, http, PrivateMessageService } from '@selfcommunity/api-services';
5
5
  import { SCUserContext, UserUtils, useSCFetchUser } from '@selfcommunity/react-core';
6
- import { SCNotificationTopicType, SCNotificationTypologyType, SCPrivateMessageStatusType } from '@selfcommunity/types';
6
+ import { SCNotificationTopicType, SCNotificationTypologyType, SCPrivateMessageStatusType, SCPrivateMessageType } from '@selfcommunity/types';
7
7
  import PrivateMessageThreadItem, { PrivateMessageThreadItemSkeleton } from '../PrivateMessageThreadItem';
8
8
  import PubSub from 'pubsub-js';
9
9
  import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
10
- import { Box, Card, CardContent, IconButton, List, ListSubheader, TextField, Typography } from '@mui/material';
10
+ import { Avatar, Box, Card, CardContent, IconButton, List, ListItemAvatar, ListSubheader, TextField, Typography } from '@mui/material';
11
11
  import PrivateMessageEditor from '../PrivateMessageEditor';
12
12
  import Autocomplete from '@mui/material/Autocomplete';
13
13
  import classNames from 'classnames';
@@ -41,6 +41,8 @@ const classes = {
41
41
  newMessageContent: `${PREFIX}-new-message-content`,
42
42
  sender: `${PREFIX}-sender`,
43
43
  receiver: `${PREFIX}-receiver`,
44
+ avatar: `${PREFIX}-avatar`,
45
+ item: `${PREFIX}-item`,
44
46
  autocomplete: `${PREFIX}-autocomplete`,
45
47
  autocompleteDialog: `${PREFIX}-autocomplete-dialog`,
46
48
  editor: `${PREFIX}-editor`
@@ -93,7 +95,7 @@ export default function PrivateMessageThread(inProps) {
93
95
  props: inProps,
94
96
  name: PREFIX
95
97
  });
96
- const { userObj, openNewMessage = false, onNewMessageClose = null, onNewMessageSent = null, onSingleMessageOpen = null, className } = props, rest = __rest(props, ["userObj", "openNewMessage", "onNewMessageClose", "onNewMessageSent", "onSingleMessageOpen", "className"]);
98
+ const { threadObj, openNewMessage = false, onNewMessageClose = null, onNewMessageSent = null, onSingleMessageOpen = null, className, type } = props, rest = __rest(props, ["threadObj", "openNewMessage", "onNewMessageClose", "onNewMessageSent", "onSingleMessageOpen", "className", "type"]);
97
99
  // CONTEXT
98
100
  const scUserContext = useContext(SCUserContext);
99
101
  // STATE
@@ -104,7 +106,7 @@ export default function PrivateMessageThread(inProps) {
104
106
  const [loading, setLoading] = useState(false);
105
107
  const [isHovered, setIsHovered] = useState({});
106
108
  const [followers, setFollowers] = useState([]);
107
- const isNew = userObj && userObj === SCPrivateMessageStatusType.NEW;
109
+ const isNew = threadObj && threadObj === SCPrivateMessageStatusType.NEW;
108
110
  const authUserId = scUserContext.user ? scUserContext.user.id : null;
109
111
  const [singleMessageUser, setSingleMessageUser] = useState(null);
110
112
  const [receiver, setReceiver] = useState(null);
@@ -113,7 +115,7 @@ export default function PrivateMessageThread(inProps) {
113
115
  const [openDeleteMessageDialog, setOpenDeleteMessageDialog] = useState(false);
114
116
  const [recipients, setRecipients] = useState([]);
115
117
  const { enqueueSnackbar, closeSnackbar } = useSnackbar();
116
- const isNumber = typeof userObj === 'number';
118
+ const isNumber = typeof threadObj === 'number';
117
119
  const messageReceiver = (item, loggedUserId) => {
118
120
  var _a, _b, _c;
119
121
  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;
@@ -126,7 +128,7 @@ export default function PrivateMessageThread(inProps) {
126
128
  // HOOKS
127
129
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
128
130
  // @ts-ignore
129
- const { scUser } = useSCFetchUser({ id: userObj, userObj });
131
+ const { scUser } = useSCFetchUser({ id: threadObj, threadObj });
130
132
  const messagesEndRef = useRef(null);
131
133
  const scrollToBottom = () => {
132
134
  var _a;
@@ -254,9 +256,9 @@ export default function PrivateMessageThread(inProps) {
254
256
  * Fetches thread
255
257
  */
256
258
  function fetchThread() {
257
- if (userObj && typeof userObj !== 'string') {
259
+ if (threadObj && typeof threadObj !== 'string' && type !== SCPrivateMessageType.GROUP) {
258
260
  setLoadingMessageObjs(true);
259
- const _userObjId = isNumber ? userObj : messageReceiver(userObj, authUserId);
261
+ const _userObjId = isNumber ? threadObj : messageReceiver(threadObj, authUserId);
260
262
  PrivateMessageService.getAThread({ user: _userObjId, limit: 10 })
261
263
  .then((res) => {
262
264
  setMessageObjs(res.results);
@@ -289,6 +291,19 @@ export default function PrivateMessageThread(inProps) {
289
291
  Logger.error(SCOPE_SC_UI, { error });
290
292
  });
291
293
  }
294
+ else if (type === SCPrivateMessageType.GROUP) {
295
+ PrivateMessageService.getAThread({ group: isNumber ? threadObj : threadObj.group.id, limit: 10 })
296
+ .then((res) => {
297
+ setMessageObjs(res.results);
298
+ setPrevious(res.next && updateAndDeleteURLParameters(res.next, 'before_message', res.results[0].id, 'offset'));
299
+ setLoadingMessageObjs(false);
300
+ })
301
+ .catch((error) => {
302
+ setLoadingMessageObjs(false);
303
+ console.log(error);
304
+ Logger.error(SCOPE_SC_UI, { error });
305
+ });
306
+ }
292
307
  }
293
308
  const isNewerThan60Seconds = (creationTime) => {
294
309
  const date = new Date(creationTime);
@@ -353,11 +368,15 @@ export default function PrivateMessageThread(inProps) {
353
368
  .request({
354
369
  url: Endpoints.SendMessage.url(),
355
370
  method: Endpoints.SendMessage.method,
356
- data: {
357
- recipients: openNewMessage || isNew || singleMessageThread ? ids : [isNumber && userObj ? userObj : messageReceiver(userObj, authUserId)],
358
- message: message,
359
- file_uuid: file && !message ? file : null
360
- }
371
+ data: Object.assign(Object.assign({}, (type === SCPrivateMessageType.GROUP
372
+ ? { group: isNumber ? threadObj : threadObj.group.id }
373
+ : {
374
+ recipients: openNewMessage || isNew || singleMessageThread
375
+ ? ids
376
+ : [isNumber && threadObj ? threadObj : messageReceiver(threadObj, authUserId)]
377
+ })), {
378
+ // recipients: openNewMessage || isNew || singleMessageThread ? ids : [isNumber && threadObj ? threadObj : messageReceiver(threadObj, authUserId)],
379
+ message: message, file_uuid: file && !message ? file : null })
361
380
  })
362
381
  .then((res) => {
363
382
  const isOne = res.data.length <= 1;
@@ -403,13 +422,13 @@ export default function PrivateMessageThread(inProps) {
403
422
  if (!authUserId) {
404
423
  return;
405
424
  }
406
- if (userObj) {
425
+ if (threadObj) {
407
426
  fetchThread();
408
427
  }
409
428
  else {
410
429
  reset();
411
430
  }
412
- }, [userObj, authUserId, scUser]);
431
+ }, [threadObj, authUserId, scUser]);
413
432
  /**
414
433
  * Notification subscriber
415
434
  */
@@ -424,7 +443,7 @@ export default function PrivateMessageThread(inProps) {
424
443
  if (index !== -1) {
425
444
  setMessageObjs((prev) => [...prev, res.notification_obj.message]);
426
445
  }
427
- if (isNumber ? userObj === res.thread_id : userObj.id === res.thread_id) {
446
+ if (isNumber ? threadObj === res.thread_id : threadObj.id === res.thread_id) {
428
447
  scrollToBottom();
429
448
  }
430
449
  };
@@ -451,11 +470,17 @@ export default function PrivateMessageThread(inProps) {
451
470
  React.createElement("ul", null,
452
471
  React.createElement(ListSubheader, null,
453
472
  React.createElement(Typography, { align: "center", className: classes.subHeader }, key)),
454
- formattedMessages[key].map((msg) => (React.createElement(PrivateMessageThreadItem, { className: authUserId === msg.sender.id ? classes.sender : classes.receiver, message: msg, key: msg.id, mouseEvents: {
455
- onMouseEnter: () => handleMouseEnter(msg.id),
456
- onMouseLeave: () => handleMouseLeave(msg.id)
457
- }, isHovering: isHovered[msg.id], showMenuIcon: authUserId === msg.sender.id, onMenuIconClick: () => handleOpenDeleteMessageDialog(msg) }))))))))),
458
- React.createElement(PrivateMessageEditor, { 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) }),
473
+ formattedMessages[key].map((msg) => {
474
+ var _a;
475
+ return (React.createElement(Box, { className: classes.item, key: msg.id },
476
+ msg.group && ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) !== msg.sender.username && (React.createElement(ListItemAvatar, null,
477
+ React.createElement(Avatar, { alt: msg.sender.username, src: msg.sender.avatar, className: classes.avatar }))),
478
+ React.createElement(PrivateMessageThreadItem, { className: authUserId === msg.sender.id ? classes.sender : classes.receiver, message: msg, key: msg.id, mouseEvents: {
479
+ onMouseEnter: () => handleMouseEnter(msg.id),
480
+ onMouseLeave: () => handleMouseLeave(msg.id)
481
+ }, isHovering: isHovered[msg.id], showMenuIcon: authUserId === msg.sender.id, onMenuIconClick: () => handleOpenDeleteMessageDialog(msg) })));
482
+ }))))))),
483
+ React.createElement(PrivateMessageEditor, { className: classes.editor, send: handleSend, autoHide: type === SCPrivateMessageType.USER && !(scUser === null || scUser === void 0 ? void 0 : scUser.can_send_pm_to), autoHideDeletion: type === SCPrivateMessageType.USER && ((receiver === null || receiver === void 0 ? void 0 : receiver.deleted) || (scUser === null || scUser === void 0 ? void 0 : scUser.deleted)), onThreadChangeId: isNumber ? threadObj : type === SCPrivateMessageType.USER ? threadObj.receiver.id : threadObj.group.id, error: error, onErrorRemove: () => setError(false) }),
459
484
  openDeleteMessageDialog && (React.createElement(ConfirmDialog, { open: openDeleteMessageDialog, title: React.createElement(FormattedMessage, { id: "ui.privateMessage.component.delete.message.dialog.msg", defaultMessage: "ui.privateMessage.component.delete.message.dialog.msg" }), btnConfirm: React.createElement(FormattedMessage, { id: "ui.privateMessage.component.delete.message.dialog.confirm", defaultMessage: "ui.privateMessage.component.delete.message.dialog.confirm" }), onConfirm: handleDeleteMessage, onClose: handleCloseDeleteMessageDialog }))));
460
485
  }
461
486
  /**
@@ -483,5 +508,5 @@ export default function PrivateMessageThread(inProps) {
483
508
  /**
484
509
  * Renders the component
485
510
  */
486
- return (React.createElement(Root, Object.assign({}, rest, { className: classNames(classes.root, className) }), userObj !== null && !isNew && !singleMessageThread ? renderThread() : renderNewOrNoMessageBox()));
511
+ return (React.createElement(Root, Object.assign({}, rest, { className: classNames(classes.root, className) }), threadObj !== null && !isNew && !singleMessageThread ? renderThread() : renderNewOrNoMessageBox()));
487
512
  }
@@ -73,6 +73,25 @@ export default function SearchAutocomplete(inProps) {
73
73
  setOptions([]);
74
74
  onClear && onClear();
75
75
  };
76
+ const getOptionData = (option) => {
77
+ let data = {};
78
+ if (option.type === SuggestionType.USER) {
79
+ data.name = option[SuggestionType.USER]['username'];
80
+ data.image = option[SuggestionType.USER]['avatar'];
81
+ data.variant = 'circular';
82
+ }
83
+ else if (option.type === SuggestionType.CATEGORY) {
84
+ data.name = option[SuggestionType.CATEGORY]['name'];
85
+ data.image = option[SuggestionType.CATEGORY]['image_medium'];
86
+ data.variant = 'square';
87
+ }
88
+ else if (option.type === SuggestionType.GROUP) {
89
+ data.name = option[SuggestionType.GROUP]['name'];
90
+ data.image = option[SuggestionType.GROUP]['image_big'];
91
+ data.variant = 'circular';
92
+ }
93
+ return data;
94
+ };
76
95
  function fetchResults() {
77
96
  setIsLoading(true);
78
97
  SuggestionService.getSearchSuggestion(value)
@@ -96,11 +115,9 @@ export default function SearchAutocomplete(inProps) {
96
115
  return option;
97
116
  }
98
117
  return (_a = option[option.type]['username']) !== null && _a !== void 0 ? _a : option[option.type]['name'];
99
- }, renderOption: (props, option) => (React.createElement(Box, Object.assign({ component: "li" }, props), option.type === SuggestionType.USER ? (React.createElement(React.Fragment, null,
100
- React.createElement(Avatar, { alt: option[SuggestionType.USER]['username'], src: option[SuggestionType.USER]['avatar'] }),
101
- React.createElement(Typography, { ml: 1 }, option[SuggestionType.USER]['username']))) : (React.createElement(React.Fragment, null,
102
- React.createElement(Avatar, { alt: option[SuggestionType.CATEGORY]['name'], src: option[SuggestionType.CATEGORY]['image_medium'], variant: "square" }),
103
- React.createElement(Typography, { ml: 1 }, option[SuggestionType.CATEGORY]['name']))))), renderInput: (params) => (React.createElement(TextField, Object.assign({}, params, { placeholder: `${intl.formatMessage(messages.placeholder, {
118
+ }, renderOption: (props, option) => (React.createElement(Box, Object.assign({ component: "li" }, props),
119
+ React.createElement(Avatar, { alt: getOptionData(option).name, src: getOptionData(option).image, variant: getOptionData(option).variant }),
120
+ React.createElement(Typography, { ml: 1 }, getOptionData(option).name))), renderInput: (params) => (React.createElement(TextField, Object.assign({}, params, { placeholder: `${intl.formatMessage(messages.placeholder, {
104
121
  community: scPreferences.preferences[SCPreferences.TEXT_APPLICATION_NAME].value
105
122
  })}`, InputProps: Object.assign(Object.assign({}, params.InputProps), { autoFocus, name: 'search-autocomplete', className: classes.input, startAdornment: React.createElement(Icon, { className: classes.icon }, "search"), endAdornment: (React.createElement(Fade, { in: value.length > 0 || Boolean(onClear), appear: false },
106
123
  React.createElement(IconButton, { className: classes.clear, onClick: handleClear, size: "small" },
@@ -31,6 +31,7 @@ import { useThemeProps } from '@mui/system';
31
31
  import ContributionNotification from '../Notification/Contribution';
32
32
  import NotificationItem from '../../shared/NotificationItem';
33
33
  import { PREFIX } from './constants';
34
+ import GroupNotification from '../Notification/Group';
34
35
  const classes = {
35
36
  root: `${PREFIX}-root`,
36
37
  notificationsWrap: `${PREFIX}-notifications-wrap`,
@@ -252,6 +253,12 @@ export default function SnippetNotifications(inProps) {
252
253
  else if (type === SCNotificationTypologyType.CONTRIBUTION) {
253
254
  content = React.createElement(ContributionNotification, { notificationObject: n, key: i, template: SCNotificationObjectTemplateType.SNIPPET });
254
255
  }
256
+ else if (n.type === SCNotificationTypologyType.USER_ADDED_TO_GROUP ||
257
+ n.type === SCNotificationTypologyType.USER_INVITED_TO_JOIN_GROUP ||
258
+ n.type === SCNotificationTypologyType.USER_ACCEPTED_TO_JOIN_GROUP ||
259
+ n.type === SCNotificationTypologyType.USER_REQUESTED_TO_JOIN_GROUP) {
260
+ return React.createElement(GroupNotification, { notificationObject: n, key: i, template: SCNotificationObjectTemplateType.SNIPPET });
261
+ }
255
262
  if (type && handleNotification) {
256
263
  /** Override content */
257
264
  content = handleNotification(type, n, content);
@@ -21,6 +21,7 @@ import Message from '../BroadcastMessages/Message';
21
21
  import { useThemeProps } from '@mui/system';
22
22
  import ContributionNotification from '../Notification/Contribution';
23
23
  import { PREFIX } from './constants';
24
+ import GroupNotification from '../Notification/Group';
24
25
  const Root = styled(Box, {
25
26
  name: PREFIX,
26
27
  slot: 'Root'
@@ -108,6 +109,12 @@ export default function UserToastNotifications(inProps) {
108
109
  else if (type === SCNotificationTypologyType.CONTRIBUTION) {
109
110
  content = React.createElement(ContributionNotification, { notificationObject: n.notification_obj, template: SCNotificationObjectTemplateType.TOAST });
110
111
  }
112
+ else if (type === SCNotificationTypologyType.USER_ADDED_TO_GROUP ||
113
+ type === SCNotificationTypologyType.USER_INVITED_TO_JOIN_GROUP ||
114
+ type === SCNotificationTypologyType.USER_ACCEPTED_TO_JOIN_GROUP ||
115
+ type === SCNotificationTypologyType.USER_REQUESTED_TO_JOIN_GROUP) {
116
+ content = React.createElement(GroupNotification, { notificationObject: n.notification_obj, template: SCNotificationObjectTemplateType.TOAST });
117
+ }
111
118
  }
112
119
  if (n.activity_type && n.activity_type === SCNotificationTypologyType.NOTIFICATION_BANNER) {
113
120
  /** Notification of type: 'notification_banner' */
@@ -1,8 +1,9 @@
1
1
  import { __rest } from "tslib";
2
- import React, { useMemo, useRef, useState } from 'react';
2
+ import React, { useEffect, useMemo, useRef, useState } from 'react';
3
3
  import { styled } from '@mui/material/styles';
4
4
  import { LoadingButton } from '@mui/lab';
5
5
  import classNames from 'classnames';
6
+ import { SCGroupSubscriptionStatusType } from '@selfcommunity/types';
6
7
  import { useThemeProps } from '@mui/system';
7
8
  import Icon from '@mui/material/Icon';
8
9
  import { IconButton, Paper, Popper, Tooltip, useMediaQuery, useTheme } from '@mui/material';
@@ -52,6 +53,7 @@ const PopperRoot = styled(Popper, {
52
53
  * @param inProps
53
54
  */
54
55
  export default function VoteButton(inProps) {
56
+ var _a;
55
57
  // PROPS
56
58
  const props = useThemeProps({
57
59
  props: inProps,
@@ -60,11 +62,13 @@ export default function VoteButton(inProps) {
60
62
  const { className, contributionId, contributionType, contribution = null, onVote } = props, rest = __rest(props, ["className", "contributionId", "contributionType", "contribution", "onVote"]);
61
63
  // STATE
62
64
  const [anchorEl, setAnchorEl] = useState(null);
65
+ const [status, setStatus] = useState(null);
63
66
  // REF
64
67
  const timeoutRef = useRef(null);
65
68
  // CONTEXT
66
69
  const scContext = useSCContext();
67
70
  const scUserContext = useSCUser();
71
+ const scGroupsManager = scUserContext.managers.groups;
68
72
  const { enqueueSnackbar } = useSnackbar();
69
73
  // HANDLERS
70
74
  const handleMouseEnter = (event) => {
@@ -79,6 +83,15 @@ export default function VoteButton(inProps) {
79
83
  timeoutRef.current && clearTimeout(timeoutRef.current);
80
84
  timeoutRef.current = null;
81
85
  };
86
+ /**
87
+ * If the obj has a group, checks the subscription status for the authenticated user
88
+ */
89
+ useEffect(() => {
90
+ var _a;
91
+ if (((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id) && (contribution === null || contribution === void 0 ? void 0 : contribution.group)) {
92
+ setStatus(scGroupsManager.subscriptionStatus(contribution === null || contribution === void 0 ? void 0 : contribution.group));
93
+ }
94
+ }, [(_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id, scGroupsManager.subscriptionStatus, contribution === null || contribution === void 0 ? void 0 : contribution.group]);
82
95
  /**
83
96
  * Perform vote action
84
97
  * @param reaction
@@ -93,6 +106,12 @@ export default function VoteButton(inProps) {
93
106
  autoHideDuration: 3000
94
107
  });
95
108
  }
109
+ else if ((contribution === null || contribution === void 0 ? void 0 : contribution.group) && status !== SCGroupSubscriptionStatusType.SUBSCRIBED) {
110
+ enqueueSnackbar(React.createElement(FormattedMessage, { id: "ui.common.group.actions.unsubscribed", defaultMessage: "ui.common.group.actions.unsubscribed" }), {
111
+ variant: 'warning',
112
+ autoHideDuration: 3000
113
+ });
114
+ }
96
115
  else {
97
116
  handleVote(reaction);
98
117
  }