@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
@@ -13,11 +13,13 @@ const SearchDialog_1 = tslib_1.__importDefault(require("../SearchDialog"));
13
13
  const NavigationSettingsIconButton_1 = tslib_1.__importDefault(require("../NavigationSettingsIconButton"));
14
14
  const NavigationMenuIconButton_1 = tslib_1.__importDefault(require("../NavigationMenuIconButton"));
15
15
  const constants_1 = require("./constants");
16
+ const types_1 = require("@selfcommunity/types");
16
17
  const classes = {
17
18
  root: `${constants_1.PREFIX}-root`,
18
19
  logo: `${constants_1.PREFIX}-logo`,
19
20
  search: `${constants_1.PREFIX}-search`,
20
21
  searchDialog: `${constants_1.PREFIX}-search-dialog`,
22
+ notifications: `${constants_1.PREFIX}-notifications`,
21
23
  settings: `${constants_1.PREFIX}-settings`,
22
24
  settingsDialog: `${constants_1.PREFIX}-settings-dialog`,
23
25
  login: `${constants_1.PREFIX}-login`
@@ -52,6 +54,7 @@ const Root = (0, material_1.styled)(material_1.Toolbar, {
52
54
  |logo|.SCNavigationToolbarMobile-logo|Styles applied to the logo element.|
53
55
  |search|.SCNavigationToolbarMobile-search|Styles applied to the search button element|
54
56
  |searchDialog|.SCNavigationToolbarMobile-search-dialog|Styles applied to the search dialog element|
57
+ |notifications|.SCNavigationToolbarMobile-notifications|Styles applied to the notifications button element|
55
58
  |settings|.SCNavigationToolbarMobile-settings|Styles applied to the settings button element|
56
59
  |settingsDialog|.SCNavigationToolbarMobile-settingsDialog|Styles applied to the settings dialog elements|
57
60
  |login|.SCNavigationToolbarMobile-login|Styles applied to the login element.|
@@ -64,14 +67,16 @@ function NavigationToolbarMobile(inProps) {
64
67
  props: inProps,
65
68
  name: constants_1.PREFIX
66
69
  });
67
- const { className = '', disableSearch = false, SearchAutocompleteProps = {}, children = null, startActions = null, endActions = null, NavigationMenuIconButtonComponent = NavigationMenuIconButton_1.default, NavigationSettingsIconButtonComponent = NavigationSettingsIconButton_1.default } = props, rest = tslib_1.__rest(props, ["className", "disableSearch", "SearchAutocompleteProps", "children", "startActions", "endActions", "NavigationMenuIconButtonComponent", "NavigationSettingsIconButtonComponent"]);
70
+ const { className = '', disableSearch = false, preserveDesktopLogo = false, SearchAutocompleteProps = {}, children = null, startActions = null, endActions = null, NavigationMenuIconButtonComponent = NavigationMenuIconButton_1.default, NavigationSettingsIconButtonComponent = NavigationSettingsIconButton_1.default } = props, rest = tslib_1.__rest(props, ["className", "disableSearch", "preserveDesktopLogo", "SearchAutocompleteProps", "children", "startActions", "endActions", "NavigationMenuIconButtonComponent", "NavigationSettingsIconButtonComponent"]);
68
71
  // CONTEXT
69
72
  const scUserContext = (0, react_core_1.useSCUser)();
70
73
  const scRoutingContext = (0, react_core_1.useSCRouting)();
71
74
  // PREFERENCES
72
- const { preferences } = (0, react_core_1.useSCPreferences)();
75
+ const { preferences, features } = (0, react_core_1.useSCPreferences)();
73
76
  // STATE
74
77
  const [searchOpen, setSearchOpen] = (0, react_1.useState)(false);
78
+ // MEMO
79
+ const groupsEnabled = (0, react_1.useMemo)(() => features.includes(types_1.SCFeatureName.GROUPING), [features]);
75
80
  // HANDLERS
76
81
  const handleOpenSearch = (0, react_1.useCallback)(() => {
77
82
  setSearchOpen(true);
@@ -85,8 +90,7 @@ function NavigationToolbarMobile(inProps) {
85
90
  }
86
91
  const _children = children || (react_1.default.createElement(react_1.default.Fragment, null,
87
92
  react_1.default.createElement(NavigationMenuIconButtonComponent, null),
88
- react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.HOME_ROUTE_NAME, {}), className: classes.logo },
89
- react_1.default.createElement("img", { src: preferences[react_core_1.SCPreferences.LOGO_NAVBAR_LOGO_MOBILE].value, alt: "logo" }))));
93
+ react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.HOME_ROUTE_NAME, {}), className: classes.logo }, !preserveDesktopLogo ? (react_1.default.createElement("img", { src: preferences[react_core_1.SCPreferences.LOGO_NAVBAR_LOGO_MOBILE].value, alt: "logo" })) : (react_1.default.createElement("img", { src: preferences[react_core_1.SCPreferences.LOGO_NAVBAR_LOGO].value, alt: "logo" })))));
90
94
  return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(className, classes.root) }, rest),
91
95
  _children,
92
96
  startActions,
@@ -95,6 +99,9 @@ function NavigationToolbarMobile(inProps) {
95
99
  react_1.default.createElement(Icon_1.default, null, "search")),
96
100
  react_1.default.createElement(SearchDialog_1.default, { className: classes.searchDialog, fullScreen: true, open: searchOpen, SearchAutocompleteProps: Object.assign(Object.assign({}, SearchAutocompleteProps), { onClear: handleCloseSearch }) }))),
97
101
  endActions,
102
+ scUserContext.user && groupsEnabled && (react_1.default.createElement(material_1.IconButton, { className: classes.notifications, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_NOTIFICATIONS_ROUTE_NAME, {}) },
103
+ react_1.default.createElement(material_1.Badge, { badgeContent: scUserContext.user.unseen_notification_banners_counter + scUserContext.user.unseen_interactions_counter, color: "secondary" },
104
+ react_1.default.createElement(Icon_1.default, null, "notifications_active")))),
98
105
  scUserContext.user ? (react_1.default.createElement(NavigationSettingsIconButtonComponent, { className: classes.settings })) : (react_1.default.createElement(material_1.Button, { className: classes.login, color: "inherit", component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.SIGNIN_ROUTE_NAME, {}) },
99
106
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.appBar.navigation.login", defaultMessage: "ui.appBar.navigation.login" })))));
100
107
  }
@@ -0,0 +1,15 @@
1
+ import { SCNotificationGroupActivityType } from '@selfcommunity/types';
2
+ import { NotificationItemProps } from '../../../shared/NotificationItem';
3
+ export interface NotificationGroupProps extends Pick<NotificationItemProps, Exclude<keyof NotificationItemProps, 'image' | 'disableTypography' | 'primary' | 'primaryTypographyProps' | 'secondary' | 'secondaryTypographyProps' | 'actions' | 'footer' | 'isNew'>> {
4
+ /**
5
+ * Notification obj
6
+ * @default null
7
+ */
8
+ notificationObject: SCNotificationGroupActivityType;
9
+ }
10
+ /**
11
+ * This component render the content of the notification of type group
12
+ * @constructor
13
+ * @param props
14
+ */
15
+ export default function GroupNotification(props: NotificationGroupProps): JSX.Element;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importStar(require("react"));
5
+ const styles_1 = require("@mui/material/styles");
6
+ const material_1 = require("@mui/material");
7
+ const react_core_1 = require("@selfcommunity/react-core");
8
+ const types_1 = require("@selfcommunity/types");
9
+ const react_intl_1 = require("react-intl");
10
+ const DateTimeAgo_1 = tslib_1.__importDefault(require("../../../shared/DateTimeAgo"));
11
+ const classnames_1 = tslib_1.__importDefault(require("classnames"));
12
+ const types_2 = require("../../../types");
13
+ const NotificationItem_1 = tslib_1.__importDefault(require("../../../shared/NotificationItem"));
14
+ const lab_1 = require("@mui/lab");
15
+ const UserDeletedSnackBar_1 = tslib_1.__importDefault(require("../../../shared/UserDeletedSnackBar"));
16
+ const UserAvatar_1 = tslib_1.__importDefault(require("../../../shared/UserAvatar"));
17
+ const constants_1 = require("../constants");
18
+ const classes = {
19
+ root: `${constants_1.PREFIX}-group-root`,
20
+ avatar: `${constants_1.PREFIX}-avatar`,
21
+ actions: `${constants_1.PREFIX}-actions`,
22
+ acceptButton: `${constants_1.PREFIX}-reply-button`,
23
+ activeAt: `${constants_1.PREFIX}-active-at`,
24
+ username: `${constants_1.PREFIX}-username`
25
+ };
26
+ const Root = (0, styles_1.styled)(NotificationItem_1.default, {
27
+ name: constants_1.PREFIX,
28
+ slot: 'GroupRoot'
29
+ })(() => ({}));
30
+ /**
31
+ * This component render the content of the notification of type group
32
+ * @constructor
33
+ * @param props
34
+ */
35
+ function GroupNotification(props) {
36
+ // PROPS
37
+ const { notificationObject, id = `n_${props.notificationObject['sid']}`, className, template = types_2.SCNotificationObjectTemplateType.DETAIL } = props, rest = tslib_1.__rest(props, ["notificationObject", "id", "className", "template"]);
38
+ // CONTEXT
39
+ const scRoutingContext = (0, react_core_1.useSCRouting)();
40
+ const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
41
+ const manager = scUserContext.managers.groups;
42
+ // STATE
43
+ const [status, setStatus] = (0, react_1.useState)(null);
44
+ const [openAlert, setOpenAlert] = (0, react_1.useState)(false);
45
+ // CONST
46
+ const isSnippetTemplate = template === types_2.SCNotificationObjectTemplateType.SNIPPET;
47
+ const isToastTemplate = template === types_2.SCNotificationObjectTemplateType.TOAST;
48
+ (0, react_1.useEffect)(() => {
49
+ setStatus(manager.subscriptionStatus(notificationObject.group));
50
+ }, [manager.subscriptionStatus, notificationObject.group]);
51
+ // RENDER
52
+ if (isSnippetTemplate || isToastTemplate) {
53
+ return (react_1.default.createElement(Root, Object.assign({ id: id, className: (0, classnames_1.default)(classes.root, className, `${constants_1.PREFIX}-${template}`), template: template, isNew: notificationObject.is_new, disableTypography: true, image: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!notificationObject.user.deleted && {
54
+ to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, notificationObject.user)
55
+ }), { onClick: notificationObject.user.deleted ? () => setOpenAlert(true) : null }),
56
+ react_1.default.createElement(UserAvatar_1.default, { hide: !notificationObject.user.community_badge, smaller: true },
57
+ react_1.default.createElement(material_1.Avatar, { alt: notificationObject.user.username, variant: "circular", src: notificationObject.user.avatar, classes: { root: classes.avatar } }))), primary: react_1.default.createElement(material_1.Box, null,
58
+ react_1.default.createElement(react_core_1.Link, Object.assign({}, (!notificationObject.user.deleted && {
59
+ to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, notificationObject.user)
60
+ }), { onClick: notificationObject.user.deleted ? () => setOpenAlert(true) : null, className: classes.username }), notificationObject.user.username),
61
+ ' ',
62
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: `ui.notification.${notificationObject.type}`, defaultMessage: `ui.notification.${notificationObject.type}`, values: {
63
+ group: notificationObject.group.name,
64
+ link: (...chunks) => react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, notificationObject.group) }, chunks)
65
+ } })), footer: isToastTemplate && (react_1.default.createElement(material_1.Stack, { direction: "row", justifyContent: "space-between", alignItems: "center", spacing: 2 },
66
+ react_1.default.createElement(DateTimeAgo_1.default, { date: notificationObject.active_at }),
67
+ status && status !== types_1.SCGroupSubscriptionStatusType.SUBSCRIBED && (react_1.default.createElement(material_1.Typography, { color: "primary" },
68
+ react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, notificationObject.group) },
69
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSubscribeButton.accept", defaultMessage: "ui.groupSubscribeButton.accept" })))))) }, rest)));
70
+ }
71
+ return (react_1.default.createElement(react_1.default.Fragment, null,
72
+ react_1.default.createElement(Root, Object.assign({ id: id, className: (0, classnames_1.default)(classes.root, className, `${constants_1.PREFIX}-${template}`), template: template, isNew: notificationObject.is_new, disableTypography: true, actions: react_1.default.createElement(material_1.Stack, { direction: "row", justifyContent: "space-between", alignItems: "center", spacing: 2 },
73
+ react_1.default.createElement(DateTimeAgo_1.default, { date: notificationObject.active_at, className: classes.activeAt }),
74
+ status && status !== types_1.SCGroupSubscriptionStatusType.SUBSCRIBED && (react_1.default.createElement(lab_1.LoadingButton, { color: 'primary', variant: "outlined", size: "small", classes: { root: classes.acceptButton }, component: react_core_1.Link, loading: scUserContext.user ? status === null || manager.isLoading(notificationObject.group) : null, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, notificationObject.group) },
75
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSubscribeButton.accept", defaultMessage: "ui.groupSubscribeButton.accept" })))) }, rest)),
76
+ openAlert && react_1.default.createElement(UserDeletedSnackBar_1.default, { open: openAlert, handleClose: () => setOpenAlert(false) })));
77
+ }
78
+ exports.default = GroupNotification;
@@ -0,0 +1,3 @@
1
+ import GroupNotification, { NotificationGroupProps } from './Group';
2
+ export default GroupNotification;
3
+ export { NotificationGroupProps };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const Group_1 = tslib_1.__importDefault(require("./Group"));
5
+ exports.default = Group_1.default;
@@ -35,6 +35,7 @@ const types_1 = require("@selfcommunity/types");
35
35
  const UserDeletedSnackBar_1 = tslib_1.__importDefault(require("../../shared/UserDeletedSnackBar"));
36
36
  const UserAvatar_1 = tslib_1.__importDefault(require("../../shared/UserAvatar"));
37
37
  const constants_1 = require("./constants");
38
+ const Group_1 = tslib_1.__importDefault(require("./Group"));
38
39
  const messages = (0, react_intl_1.defineMessages)({
39
40
  receivePrivateMessage: {
40
41
  id: 'ui.notification.receivePrivateMessage',
@@ -151,7 +152,7 @@ function UserNotification(inProps) {
151
152
  }
152
153
  /**
153
154
  * Handles vote
154
- * @param comment
155
+ * @param index
155
156
  */
156
157
  const handleVote = (index) => {
157
158
  return (contribution) => {
@@ -196,6 +197,29 @@ function UserNotification(inProps) {
196
197
  b: (...chunks) => react_1.default.createElement("strong", null, chunks)
197
198
  })) }));
198
199
  }
200
+ /**
201
+ * Group notifications header
202
+ */
203
+ if (notificationObject.aggregated &&
204
+ (notificationObject.aggregated[0].type === types_1.SCNotificationTypologyType.USER_INVITED_TO_JOIN_GROUP ||
205
+ notificationObject.aggregated[0].type === types_1.SCNotificationTypologyType.USER_ACCEPTED_TO_JOIN_GROUP ||
206
+ notificationObject.aggregated[0].type === types_1.SCNotificationTypologyType.USER_ADDED_TO_GROUP ||
207
+ notificationObject.aggregated[0].type === types_1.SCNotificationTypologyType.USER_REQUESTED_TO_JOIN_GROUP)) {
208
+ let groupNotification = notificationObject.aggregated[0];
209
+ return (react_1.default.createElement(material_1.CardHeader, { className: classes.header, avatar: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!groupNotification.user.deleted && {
210
+ to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, groupNotification.user)
211
+ }), { onClick: groupNotification.user.deleted ? () => setOpenAlert(true) : null }),
212
+ react_1.default.createElement(UserAvatar_1.default, { hide: !groupNotification.user.community_badge, smaller: true },
213
+ react_1.default.createElement(material_1.Avatar, { className: classes.avatar, alt: groupNotification.user.username, variant: "circular", src: groupNotification.user.avatar }))), titleTypographyProps: { className: classes.title, variant: 'subtitle1' }, title: react_1.default.createElement(react_1.default.Fragment, null,
214
+ react_1.default.createElement(react_core_1.Link, Object.assign({}, (!groupNotification.user.deleted && {
215
+ to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, groupNotification.user)
216
+ }), { onClick: groupNotification.user.deleted ? () => setOpenAlert(true) : null, className: classes.username }), groupNotification.user.username),
217
+ ' ',
218
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: `ui.notification.${notificationObject.aggregated[0].type}`, defaultMessage: `ui.notification.${notificationObject.aggregated[0].type}`, values: {
219
+ group: groupNotification.group.name,
220
+ link: (...chunks) => react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, groupNotification.group) }, chunks)
221
+ } })) }));
222
+ }
199
223
  /**
200
224
  * Comment, NestedComment, Follow Contribution header
201
225
  */
@@ -278,6 +302,12 @@ function UserNotification(inProps) {
278
302
  else if (n.type === types_1.SCNotificationTypologyType.CONTRIBUTION) {
279
303
  return react_1.default.createElement(Contribution_1.default, { notificationObject: n, key: i, onVote: handleVote(i) });
280
304
  }
305
+ else if (n.type === types_1.SCNotificationTypologyType.USER_ADDED_TO_GROUP ||
306
+ n.type === types_1.SCNotificationTypologyType.USER_INVITED_TO_JOIN_GROUP ||
307
+ n.type === types_1.SCNotificationTypologyType.USER_ACCEPTED_TO_JOIN_GROUP ||
308
+ n.type === types_1.SCNotificationTypologyType.USER_REQUESTED_TO_JOIN_GROUP) {
309
+ return react_1.default.createElement(Group_1.default, { notificationObject: n, key: i });
310
+ }
281
311
  return null;
282
312
  }
283
313
  /**
@@ -41,6 +41,7 @@ const Root = (0, styles_1.styled)(NotificationItem_1.default, {
41
41
  * @param props
42
42
  */
43
43
  function PrivateMessageNotification(props) {
44
+ var _a, _b, _c, _d, _e;
44
45
  // PROPS
45
46
  const { notificationObject, id = `n_${props.notificationObject['sid']}`, className, template = types_1.SCNotificationObjectTemplateType.DETAIL } = props, rest = tslib_1.__rest(props, ["notificationObject", "id", "className", "template"]);
46
47
  // CONTEXT
@@ -91,7 +92,9 @@ function PrivateMessageNotification(props) {
91
92
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: 'ui.userToastNotifications.privateMessage.sentMessage', defaultMessage: 'ui.userToastNotifications.privateMessage.sentMessage' }),
92
93
  ":",
93
94
  react_1.default.createElement(material_1.Box, { className: classes.messageWrap },
94
- react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender), className: classes.message },
95
+ react_1.default.createElement(react_core_1.Link, { to: ((_a = notificationObject.message) === null || _a === void 0 ? void 0 : _a.group)
96
+ ? scRoutingContext.url(react_core_1.SCRoutes.GROUP_MESSAGES_ROUTE_NAME, notificationObject.message.group)
97
+ : scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender), className: classes.message },
95
98
  react_1.default.createElement(material_1.Typography, { variant: "body2", dangerouslySetInnerHTML: { __html: notificationObject.message.message } }))))),
96
99
  isSnippetTemplate && (react_1.default.createElement(material_1.Box, null,
97
100
  react_1.default.createElement(material_1.Typography, { component: "div", color: "inherit" },
@@ -99,13 +102,17 @@ function PrivateMessageNotification(props) {
99
102
  to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, notificationObject.message.sender)
100
103
  }), { onClick: notificationObject.message.sender.deleted ? () => setOpenAlert(true) : null, className: classes.username }), notificationObject.message.sender.username),
101
104
  ' ',
102
- react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender), className: classes.messageLabel }, intl.formatMessage(messages.receivePrivateMessage, {
105
+ react_1.default.createElement(react_core_1.Link, { to: ((_b = notificationObject.message) === null || _b === void 0 ? void 0 : _b.group)
106
+ ? scRoutingContext.url(react_core_1.SCRoutes.GROUP_MESSAGES_ROUTE_NAME, notificationObject.message.group)
107
+ : scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender), className: classes.messageLabel }, intl.formatMessage(messages.receivePrivateMessage, {
103
108
  total: 1,
104
109
  b: (...chunks) => react_1.default.createElement("strong", null, chunks)
105
110
  })))))), footer: isToastTemplate && (react_1.default.createElement(material_1.Stack, { direction: "row", justifyContent: "space-between", alignItems: "center", spacing: 2 },
106
111
  react_1.default.createElement(DateTimeAgo_1.default, { date: notificationObject.active_at }),
107
112
  react_1.default.createElement(material_1.Typography, { color: "primary" },
108
- react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender) }, scUserContext.user && follower ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.userToastNotifications.replyMessage", defaultMessage: 'ui.userToastNotifications.replyMessage' })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.userToastNotifications.viewMessage", defaultMessage: 'ui.userToastNotifications.viewMessage' })))))) }, rest)));
113
+ react_1.default.createElement(react_core_1.Link, { to: ((_c = notificationObject.message) === null || _c === void 0 ? void 0 : _c.group)
114
+ ? scRoutingContext.url(react_core_1.SCRoutes.GROUP_MESSAGES_ROUTE_NAME, notificationObject.message.group)
115
+ : scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender) }, scUserContext.user && follower ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.userToastNotifications.replyMessage", defaultMessage: 'ui.userToastNotifications.replyMessage' })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.userToastNotifications.viewMessage", defaultMessage: 'ui.userToastNotifications.viewMessage' })))))) }, rest)));
109
116
  }
110
117
  return (react_1.default.createElement(react_1.default.Fragment, null,
111
118
  react_1.default.createElement(Root, Object.assign({ id: id, className: (0, classnames_1.default)(classes.root, className, `${constants_1.PREFIX}-${template}`), template: template, isNew: notificationObject.is_new, disableTypography: true, actions: react_1.default.createElement(material_1.Stack, { direction: "row", justifyContent: "space-between", alignItems: "center", spacing: 2 },
@@ -114,8 +121,12 @@ function PrivateMessageNotification(props) {
114
121
  ? null
115
122
  : scUserContext.user
116
123
  ? follower === null || manager.isLoading(notificationObject.message.sender)
117
- : null, to: scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender) }, scUserContext.user && follower ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.notification.privateMessage.btnReplyLabel", defaultMessage: "ui.notification.privateMessage.btnReplyLabel" })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.notification.privateMessage.btnViewLabel", defaultMessage: "ui.notification.privateMessage.btnViewLabel" })))), primary: react_1.default.createElement(material_1.Box, { className: classes.messageWrap },
118
- react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender), className: classes.message },
124
+ : null, to: ((_d = notificationObject.message) === null || _d === void 0 ? void 0 : _d.group)
125
+ ? scRoutingContext.url(react_core_1.SCRoutes.GROUP_MESSAGES_ROUTE_NAME, notificationObject.message.group)
126
+ : scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender) }, scUserContext.user && follower ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.notification.privateMessage.btnReplyLabel", defaultMessage: "ui.notification.privateMessage.btnReplyLabel" })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.notification.privateMessage.btnViewLabel", defaultMessage: "ui.notification.privateMessage.btnViewLabel" })))), primary: react_1.default.createElement(material_1.Box, { className: classes.messageWrap },
127
+ react_1.default.createElement(react_core_1.Link, { to: ((_e = notificationObject.message) === null || _e === void 0 ? void 0 : _e.group)
128
+ ? scRoutingContext.url(react_core_1.SCRoutes.GROUP_MESSAGES_ROUTE_NAME, notificationObject.message.group)
129
+ : scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, notificationObject.message.sender), className: classes.message },
119
130
  react_1.default.createElement(material_1.Typography, { variant: "body2", dangerouslySetInnerHTML: { __html: notificationObject.message.message } }))) }, rest)),
120
131
  openAlert && react_1.default.createElement(UserDeletedSnackBar_1.default, { open: openAlert, handleClose: () => setOpenAlert(false) })));
121
132
  }
@@ -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
@@ -67,6 +67,7 @@ function PrivateMessageComponent(inProps) {
67
67
  const isMobile = (0, material_1.useMediaQuery)(theme.breakpoints.down('md'));
68
68
  const [layout, setLayout] = (0, react_1.useState)('default');
69
69
  const [obj, setObj] = (0, react_1.useState)(id !== null && id !== void 0 ? id : null);
70
+ const [type, setType] = (0, react_1.useState)(null);
70
71
  const isNew = obj && obj === types_1.SCPrivateMessageStatusType.NEW;
71
72
  const [openNewMessage, setOpenNewMessage] = (0, react_1.useState)(isNew !== null && isNew !== void 0 ? isNew : false);
72
73
  const mobileSnippetsView = (layout === 'default' && !obj) || (layout === 'mobile' && !obj);
@@ -88,10 +89,12 @@ function PrivateMessageComponent(inProps) {
88
89
  /**
89
90
  * Handles thread opening on click
90
91
  * @param item
92
+ * @param type
91
93
  */
92
- const handleThreadOpening = (item) => {
93
- onItemClick && onItemClick(messageReceiver(item, authUserId));
94
- setObj(messageReceiver(item, authUserId));
94
+ const handleThreadOpening = (item, type) => {
95
+ onItemClick && onItemClick(item.group ? item.group.id : messageReceiver(item, authUserId), type);
96
+ setType(type);
97
+ setObj(item.group ? item : messageReceiver(item, authUserId));
95
98
  setOpenNewMessage(false);
96
99
  };
97
100
  /**
@@ -107,7 +110,8 @@ function PrivateMessageComponent(inProps) {
107
110
  const handleOpenNewMessage = () => {
108
111
  setOpenNewMessage(!openNewMessage);
109
112
  setObj(types_1.SCPrivateMessageStatusType.NEW);
110
- onItemClick && onItemClick(types_1.SCPrivateMessageStatusType.NEW);
113
+ setType(types_1.SCPrivateMessageType.NEW);
114
+ onItemClick && onItemClick(types_1.SCPrivateMessageStatusType.NEW, types_1.SCPrivateMessageType.NEW);
111
115
  };
112
116
  /**
113
117
  * Handles new messages open from user profile page or notifications section
@@ -123,13 +127,14 @@ function PrivateMessageComponent(inProps) {
123
127
  id && setLayout('mobile');
124
128
  setOpenNewMessage(false);
125
129
  setObj(null);
130
+ setType(null);
126
131
  onThreadBack && onThreadBack();
127
132
  };
128
133
  /**
129
134
  * Handles state update when a new message is sent
130
135
  */
131
136
  const handleOnNewMessageSent = (msg, isOne) => {
132
- onItemClick && onItemClick(isOne ? messageReceiver(msg, authUserId) : '');
137
+ onItemClick && onItemClick(isOne ? messageReceiver(msg, authUserId) : '', msg.group ? types_1.SCPrivateMessageType.GROUP : types_1.SCPrivateMessageType.USER);
133
138
  setObj(isOne ? messageReceiver(msg, authUserId) : null);
134
139
  setOpenNewMessage(false);
135
140
  };
@@ -149,14 +154,14 @@ function PrivateMessageComponent(inProps) {
149
154
  onSnippetClick: handleThreadOpening,
150
155
  onNewMessageClick: handleOpenNewMessage,
151
156
  onDeleteConfirm: handleDeleteThread
152
- }, userObj: obj, clearSearch: clear, elevation: 0 })));
157
+ }, threadObj: obj, clearSearch: clear, elevation: 0 })));
153
158
  }
154
159
  /**
155
160
  * Renders thread section
156
161
  */
157
162
  function renderThread() {
158
163
  return (react_1.default.createElement(material_1.Grid, { item: true, xs: 12, md: 7, className: (0, classnames_1.default)(classes.threadBox, { [classes.hide]: isMobile && mobileSnippetsView }) },
159
- react_1.default.createElement(PrivateMessageThread_1.default, { userObj: obj, openNewMessage: openNewMessage, onNewMessageClose: handleMessageBack, onNewMessageSent: handleOnNewMessageSent, onSingleMessageOpen: handleSingleMessage, elevation: 0 })));
164
+ react_1.default.createElement(PrivateMessageThread_1.default, { threadObj: obj, type: type, openNewMessage: openNewMessage, onNewMessageClose: handleMessageBack, onNewMessageSent: handleOnNewMessageSent, onSingleMessageOpen: handleSingleMessage, elevation: 0 })));
160
165
  }
161
166
  /**
162
167
  * Renders the component (if not hidden by autoHide prop)
@@ -74,10 +74,12 @@ function PrivateMessageSnippetItem(inProps) {
74
74
  // STATE
75
75
  const hasBadge = () => {
76
76
  var _a;
77
- if ((message === null || message === void 0 ? void 0 : message.receiver.id) !== ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id)) {
78
- return message === null || message === void 0 ? void 0 : message.receiver.community_badge;
77
+ if (message.receiver) {
78
+ if ((message === null || message === void 0 ? void 0 : message.receiver.id) !== ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id)) {
79
+ return message === null || message === void 0 ? void 0 : message.receiver.community_badge;
80
+ }
81
+ return message === null || message === void 0 ? void 0 : message.sender.community_badge;
79
82
  }
80
- return message === null || message === void 0 ? void 0 : message.sender.community_badge;
81
83
  };
82
84
  if (!message) {
83
85
  return react_1.default.createElement(Skeleton_1.default, { elevation: 0 });
@@ -88,10 +90,13 @@ function PrivateMessageSnippetItem(inProps) {
88
90
  return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, rest, { secondaryAction: secondaryAction, disablePadding: true }),
89
91
  react_1.default.createElement(material_1.ListItemButton, { onClick: onItemClick, classes: { root: (0, classnames_1.default)({ [classes.unread]: message.thread_status === types_1.SCPrivateMessageStatusType.NEW }) } },
90
92
  react_1.default.createElement(material_1.ListItemAvatar, null,
91
- react_1.default.createElement(UserAvatar_1.default, { hide: !hasBadge() },
92
- react_1.default.createElement(material_1.Avatar, { alt: ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) === message.receiver.username ? message.sender.username : message.receiver.username, src: ((_b = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _b === void 0 ? void 0 : _b.username) === message.receiver.username ? message.sender.avatar : message.receiver.avatar }))),
93
+ react_1.default.createElement(UserAvatar_1.default, { hide: !hasBadge() }, message.group ? (react_1.default.createElement(material_1.Avatar, { alt: message.group.name, src: message.group.image_big })) : (react_1.default.createElement(material_1.Avatar, { alt: ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) === message.receiver.username ? message.sender.username : message.receiver.username, src: ((_b = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _b === void 0 ? void 0 : _b.username) === message.receiver.username ? message.sender.avatar : message.receiver.avatar })))),
93
94
  react_1.default.createElement(material_1.ListItemText, { primary: react_1.default.createElement(react_1.default.Fragment, null,
94
- react_1.default.createElement(material_1.Typography, { component: "span", className: classes.username }, ((_c = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _c === void 0 ? void 0 : _c.username) === message.receiver.username ? message.sender.username : message.receiver.username),
95
+ react_1.default.createElement(material_1.Typography, { component: "span", className: classes.username }, message.group
96
+ ? message.group.name
97
+ : ((_c = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _c === void 0 ? void 0 : _c.username) === message.receiver.username
98
+ ? message.sender.username
99
+ : message.receiver.username),
95
100
  hasBadge() && preferences && (react_1.default.createElement(material_1.Chip, { component: "span", className: classes.badgeLabel, size: "small", label: preferences[react_core_1.SCPreferences.STAFF_STAFF_BADGE_LABEL] })),
96
101
  react_1.default.createElement(material_1.Typography, { color: "secondary", className: classes.time, component: "span" }, `${intl.formatDate(message.last_message_at, {
97
102
  day: '2-digit',
@@ -20,7 +20,7 @@ export interface PrivateMessageSnippetsProps extends CardProps {
20
20
  *
21
21
  */
22
22
  snippetActions?: {
23
- onSnippetClick?: (msg: any) => void;
23
+ onSnippetClick?: (msg: any, type: any) => void;
24
24
  onNewMessageClick?: () => void;
25
25
  onDeleteConfirm?: (msg: any) => void;
26
26
  };
@@ -29,10 +29,10 @@ export interface PrivateMessageSnippetsProps extends CardProps {
29
29
  */
30
30
  [p: string]: any;
31
31
  /**
32
- * thread user object
32
+ * thread user/ group object
33
33
  * @default null
34
34
  */
35
- userObj?: any;
35
+ threadObj?: any;
36
36
  }
37
37
  /**
38
38
  * > API documentation for the Community-JS PrivateMessageSnippets component. Learn about the available props and the CSS API.
@@ -71,25 +71,30 @@ function PrivateMessageSnippets(inProps) {
71
71
  props: inProps,
72
72
  name: constants_1.PREFIX
73
73
  });
74
- const { className = null, userObj = null, snippetActions, clearSearch } = props, rest = tslib_1.__rest(props, ["className", "userObj", "snippetActions", "clearSearch"]);
74
+ const { className = null, threadObj = null, snippetActions, clearSearch } = props, rest = tslib_1.__rest(props, ["className", "threadObj", "snippetActions", "clearSearch"]);
75
75
  // STATE
76
76
  const theme = (0, material_1.useTheme)();
77
77
  const isMobile = (0, useMediaQuery_1.default)(theme.breakpoints.down('md'));
78
78
  const { data, updateSnippets } = (0, react_core_1.useSCFetchPrivateMessageSnippets)({ cacheStrategy: utils_1.CacheStrategies.CACHE_FIRST });
79
79
  const [search, setSearch] = (0, react_1.useState)('');
80
- const isObj = typeof userObj === 'object';
80
+ const isObj = typeof threadObj === 'object';
81
81
  const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
82
82
  const authUserId = scUserContext.user ? scUserContext.user.id : null;
83
+ const [type, setType] = (0, react_1.useState)(null);
83
84
  // INTL
84
85
  const intl = (0, react_intl_1.useIntl)();
85
86
  // REFS
86
87
  const refreshSubscription = (0, react_1.useRef)(null);
87
88
  // CONST
88
89
  const filteredSnippets = data.snippets.filter((el) => {
90
+ var _a;
89
91
  if (search === '') {
90
92
  return el;
91
93
  }
92
- else if (el.receiver.id === authUserId) {
94
+ else if (el.group) {
95
+ return el.group.slug.includes(search.toLowerCase());
96
+ }
97
+ else if (((_a = el === null || el === void 0 ? void 0 : el.receiver) === null || _a === void 0 ? void 0 : _a.id) === authUserId) {
93
98
  return el.sender.username.includes(search.toLowerCase());
94
99
  }
95
100
  return el.receiver.username.includes(search.toLowerCase());
@@ -101,6 +106,18 @@ function PrivateMessageSnippets(inProps) {
101
106
  }
102
107
  return ((_b = item === null || item === void 0 ? void 0 : item.receiver) === null || _b === void 0 ? void 0 : _b.id) !== loggedUserId ? (_c = item === null || item === void 0 ? void 0 : item.receiver) === null || _c === void 0 ? void 0 : _c.id : (_d = item === null || item === void 0 ? void 0 : item.sender) === null || _d === void 0 ? void 0 : _d.id;
103
108
  };
109
+ const isSelected = (0, react_1.useMemo)(() => {
110
+ return (message) => {
111
+ var _a, _b;
112
+ if (threadObj && type === types_1.SCPrivateMessageType.GROUP) {
113
+ return ((_a = message === null || message === void 0 ? void 0 : message.group) === null || _a === void 0 ? void 0 : _a.id) === (isObj ? (_b = threadObj === null || threadObj === void 0 ? void 0 : threadObj.group) === null || _b === void 0 ? void 0 : _b.id : threadObj);
114
+ }
115
+ else if (threadObj && type === types_1.SCPrivateMessageType.USER) {
116
+ return messageReceiver(message, authUserId) === (isObj ? messageReceiver(threadObj, authUserId) : threadObj);
117
+ }
118
+ return null;
119
+ };
120
+ }, [threadObj, authUserId, type]);
104
121
  //HANDLERS
105
122
  const handleChange = (event) => {
106
123
  setSearch(event.target.value);
@@ -116,7 +133,9 @@ function PrivateMessageSnippets(inProps) {
116
133
  snippetActions && snippetActions.onDeleteConfirm(msg);
117
134
  };
118
135
  function handleOpenThread(msg) {
119
- snippetActions && snippetActions.onSnippetClick(msg);
136
+ const _type = msg.group !== null ? types_1.SCPrivateMessageType.GROUP : types_1.SCPrivateMessageType.USER;
137
+ setType(_type);
138
+ snippetActions && snippetActions.onSnippetClick(msg, _type);
120
139
  handleClear();
121
140
  updateSnippetsParams(msg.id, 'seen');
122
141
  }
@@ -221,7 +240,6 @@ function PrivateMessageSnippets(inProps) {
221
240
  } }),
222
241
  react_1.default.createElement(material_1.List, null, filteredSnippets.map((message) => (react_1.default.createElement(PrivateMessageSnippetItem_1.default, { message: message, key: message.id, onItemClick: () => handleOpenThread(message), secondaryAction: react_1.default.createElement(react_1.default.Fragment, null,
223
242
  message.thread_status === types_1.SCPrivateMessageStatusType.NEW && (react_1.default.createElement(material_1.Icon, { fontSize: "small", color: "secondary" }, "fiber_manual_record")),
224
- !isMobile && (react_1.default.createElement(PrivateMessageSettingsIconButton_1.default, { threadToDelete: messageReceiver(message, authUserId), onItemDeleteConfirm: () => handleDeleteConversation(messageReceiver(message, authUserId)), user: messageReceiver(message, authUserId, true) }))), selected: userObj !== types_1.SCPrivateMessageStatusType.NEW &&
225
- messageReceiver(message, authUserId) === (isObj ? messageReceiver(userObj, authUserId) : userObj) })))))))));
243
+ !isMobile && (react_1.default.createElement(PrivateMessageSettingsIconButton_1.default, { threadToDelete: messageReceiver(message, authUserId), onItemDeleteConfirm: () => handleDeleteConversation(messageReceiver(message, authUserId)), user: messageReceiver(message, authUserId, true) }))), selected: isSelected(message) })))))))));
226
244
  }
227
245
  exports.default = PrivateMessageSnippets;
@@ -1,10 +1,11 @@
1
+ import { SCPrivateMessageType } from '@selfcommunity/types';
1
2
  import { CardProps } from '@mui/material';
2
3
  export interface PrivateMessageThreadProps extends CardProps {
3
4
  /**
4
5
  * Thread object or thread id
5
6
  * default null
6
7
  */
7
- userObj?: any;
8
+ threadObj?: any;
8
9
  /**
9
10
  * Overrides or extends the styles applied to the component.
10
11
  * @default null
@@ -30,6 +31,10 @@ export interface PrivateMessageThreadProps extends CardProps {
30
31
  * @default null
31
32
  */
32
33
  onSingleMessageOpen?: (open: boolean) => void;
34
+ /**
35
+ * The Thread type
36
+ */
37
+ type?: SCPrivateMessageType;
33
38
  /**
34
39
  * Any other properties
35
40
  */