@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
@@ -1,31 +1,31 @@
1
+ import { SCGroupType } from '@selfcommunity/types';
1
2
  import { EndpointType } from '@selfcommunity/api-services';
2
- import { CacheStrategies } from '@selfcommunity/utils';
3
3
  import { GroupProps } from '../Group';
4
4
  export interface GroupsProps {
5
5
  /**
6
- * Endpoint to call
6
+ * Overrides or extends the styles applied to the component.
7
+ * @default null
7
8
  */
8
- endpoint: EndpointType;
9
+ className?: string;
9
10
  /**
10
- * Hides this component
11
- * @default false
11
+ * Endpoint to call
12
12
  */
13
- autoHide?: boolean;
13
+ endpoint: EndpointType;
14
14
  /**
15
- * Limit the number of users to show
16
- * @default false
15
+ * Props to spread to single group object
16
+ * @default {variant: 'outlined', ButtonBaseProps: {disableRipple: 'true'}}
17
17
  */
18
- limit?: number;
18
+ GroupComponentProps?: GroupProps;
19
19
  /**
20
- * Caching strategies
21
- * @default CacheStrategies.CACHE_FIRST
20
+ * Prefetch groups. Useful for SSR.
21
+ * Use this to init the component with groups
22
+ * @default null
22
23
  */
23
- cacheStrategy?: CacheStrategies;
24
- /**
25
- * Props to spread to single user object
26
- * @default empty object
24
+ prefetchedGroups?: SCGroupType[];
25
+ /** If true, it means that the endpoint fetches all groups available
26
+ * @default null
27
27
  */
28
- GroupProps?: GroupProps;
28
+ general?: boolean;
29
29
  /**
30
30
  * Other props
31
31
  */
@@ -3,12 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importStar(require("react"));
5
5
  const styles_1 = require("@mui/material/styles");
6
- const List_1 = tslib_1.__importDefault(require("@mui/material/List"));
7
6
  const material_1 = require("@mui/material");
8
7
  const api_services_1 = require("@selfcommunity/api-services");
9
8
  const utils_1 = require("@selfcommunity/utils");
10
9
  const react_core_1 = require("@selfcommunity/react-core");
11
- const widget_1 = require("../../utils/widget");
12
10
  const Skeleton_1 = tslib_1.__importDefault(require("./Skeleton"));
13
11
  const react_intl_1 = require("react-intl");
14
12
  const classnames_1 = tslib_1.__importDefault(require("classnames"));
@@ -19,6 +17,7 @@ const constants_1 = require("./constants");
19
17
  const Group_1 = tslib_1.__importDefault(require("../Group"));
20
18
  const classes = {
21
19
  root: `${constants_1.PREFIX}-root`,
20
+ groups: `${constants_1.PREFIX}-groups`,
22
21
  item: `${constants_1.PREFIX}-item`,
23
22
  noResults: `${constants_1.PREFIX}-no-results`,
24
23
  showMore: `${constants_1.PREFIX}-show-more`,
@@ -65,120 +64,72 @@ function Groups(inProps) {
65
64
  props: inProps,
66
65
  name: constants_1.PREFIX
67
66
  });
68
- const { endpoint, autoHide = false, limit = 5, className, cacheStrategy = utils_1.CacheStrategies.NETWORK_ONLY, onHeightChange, onStateChange, GroupProps = {} } = props, rest = tslib_1.__rest(props, ["endpoint", "autoHide", "limit", "className", "cacheStrategy", "onHeightChange", "onStateChange", "GroupProps"]);
67
+ const { endpoint, className, GroupComponentProps = { variant: 'outlined', ButtonBaseProps: { disableRipple: true, component: material_1.Box } }, prefetchedGroups = [], general } = props, rest = tslib_1.__rest(props, ["endpoint", "className", "GroupComponentProps", "prefetchedGroups", "general"]);
69
68
  // STATE
70
- const [state, dispatch] = (0, react_1.useReducer)(widget_1.dataWidgetReducer, {
71
- isLoadingNext: false,
72
- next: null,
73
- cacheKey: react_core_1.SCCache.getWidgetStateCacheKey(react_core_1.SCCache.GROUPS_LIST_TOOLS_STATE_CACHE_PREFIX_KEY),
74
- cacheStrategy,
75
- visibleItems: limit
76
- }, widget_1.stateWidgetInitializer);
69
+ const [groups, setGroups] = (0, react_1.useState)([]);
70
+ const [loading, setLoading] = (0, react_1.useState)(true);
77
71
  // CONTEXT
78
72
  const scUserContext = (0, react_core_1.useSCUser)();
79
73
  const scPreferencesContext = (0, react_core_1.useSCPreferences)();
80
74
  // MEMO
81
75
  const contentAvailability = (0, react_1.useMemo)(() => react_core_1.SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY in scPreferencesContext.preferences &&
82
76
  scPreferencesContext.preferences[react_core_1.SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY].value, [scPreferencesContext.preferences]);
83
- // HOOKS
84
- // const theme = useTheme<SCThemeType>();
85
- // const isMobile = useMediaQuery(theme.breakpoints.down('md'));
77
+ // CONST
78
+ const authUserId = scUserContext.user ? scUserContext.user.id : null;
79
+ // REFS
80
+ const isMountedRef = (0, react_core_1.useIsComponentMountedRef)();
86
81
  /**
87
- * Initialize component
88
- * Fetch data only if the component is not initialized, and it is not loading data
82
+ * Fetches groups list
83
+ */
84
+ const fetchGroups = (next = endpoint.url({})) => tslib_1.__awaiter(this, void 0, void 0, function* () {
85
+ const response = yield api_services_1.http.request({
86
+ url: next,
87
+ method: endpoint.method
88
+ });
89
+ const data = response.data;
90
+ return data.next ? data.results.concat(yield fetchGroups(data.next)) : data.results;
91
+ });
92
+ /**
93
+ * On mount, fetches groups list
89
94
  */
90
- const _initComponent = (0, react_1.useMemo)(() => () => {
91
- if (!state.initialized && !state.isLoadingNext) {
92
- dispatch({ type: widget_1.actionWidgetTypes.LOADING_NEXT });
93
- api_services_1.http
94
- .request({
95
- url: endpoint.url({ limit }),
96
- method: endpoint.method
97
- })
98
- .then((payload) => {
99
- dispatch({ type: widget_1.actionWidgetTypes.LOAD_NEXT_SUCCESS, payload: Object.assign(Object.assign({}, payload.data), { initialized: true }) });
100
- })
101
- .catch((error) => {
102
- dispatch({ type: widget_1.actionWidgetTypes.LOAD_NEXT_FAILURE, payload: { errorLoadNext: error } });
103
- utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
104
- });
105
- }
106
- }, [state.isLoadingNext, state.initialized, endpoint, limit, dispatch]);
107
- // EFFECTS
108
95
  (0, react_1.useEffect)(() => {
109
- var _a;
110
- let _t;
111
- if ((contentAvailability || (!contentAvailability && ((_a = scUserContext.user) === null || _a === void 0 ? void 0 : _a.id))) && scUserContext.user !== undefined) {
112
- _t = setTimeout(_initComponent);
113
- return () => {
114
- _t && clearTimeout(_t);
115
- };
96
+ if (!contentAvailability && !authUserId) {
97
+ return;
116
98
  }
117
- }, [scUserContext.user, contentAvailability]);
118
- (0, react_1.useEffect)(() => {
119
- if (state.next && state.results.length === limit && state.initialized) {
120
- dispatch({ type: widget_1.actionWidgetTypes.LOADING_NEXT });
121
- api_services_1.http
122
- .request({
123
- url: endpoint.url({ offset: limit, limit: 10 }),
124
- method: endpoint.method
125
- })
126
- .then((payload) => {
127
- dispatch({ type: widget_1.actionWidgetTypes.LOAD_NEXT_SUCCESS, payload: payload.data });
99
+ else if (prefetchedGroups.length) {
100
+ setGroups(prefetchedGroups);
101
+ setLoading(false);
102
+ }
103
+ else {
104
+ fetchGroups()
105
+ .then((data) => {
106
+ if (isMountedRef.current) {
107
+ setGroups(data);
108
+ setLoading(false);
109
+ }
128
110
  })
129
111
  .catch((error) => {
130
- dispatch({ type: widget_1.actionWidgetTypes.LOAD_NEXT_FAILURE, payload: { errorLoadNext: error } });
131
112
  utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
132
113
  });
133
114
  }
134
- }, [state.next, state.results.length, state.initialized, limit]);
135
- /**
136
- * Virtual feed update
137
- */
138
- (0, react_1.useEffect)(() => {
139
- onHeightChange && onHeightChange();
140
- }, [state.results]);
141
- (0, react_1.useEffect)(() => {
142
- if (!endpoint || (!contentAvailability && !scUserContext.user)) {
143
- return;
115
+ }, [contentAvailability, authUserId, prefetchedGroups.length]);
116
+ const handleSubscribe = (group) => {
117
+ if (!general) {
118
+ const newGroups = [...groups];
119
+ const _updated = newGroups.filter((g) => g.id !== group.id);
120
+ setGroups(_updated);
144
121
  }
145
- else if (cacheStrategy === utils_1.CacheStrategies.NETWORK_ONLY) {
146
- onStateChange && onStateChange({ cacheStrategy: utils_1.CacheStrategies.CACHE_FIRST });
147
- }
148
- }, [scUserContext.user, endpoint, contentAvailability]);
149
- (0, react_1.useEffect)(() => {
150
- if (!endpoint || !scUserContext.user || !state.initialized) {
151
- return;
152
- }
153
- }, []);
154
- // HANDLERS
155
- // const handleNext = useMemo(
156
- // () => (): void => {
157
- // dispatch({type: actionWidgetTypes.LOADING_NEXT});
158
- // http
159
- // .request({
160
- // url: state.next,
161
- // method: endpoint
162
- // })
163
- // .then((res: AxiosResponse<any>) => {
164
- // dispatch({type: actionWidgetTypes.LOAD_NEXT_SUCCESS, payload: res.data});
165
- // });
166
- // },
167
- // [dispatch, state.next, state.isLoadingNext, state.initialized]
168
- // );
122
+ };
169
123
  // RENDER
170
- if ((autoHide && !state.count && state.initialized) || (!contentAvailability && !scUserContext.user) || !endpoint) {
124
+ if (!contentAvailability && !scUserContext.user) {
171
125
  return react_1.default.createElement(HiddenPlaceholder_1.default, null);
172
126
  }
173
- if (!state.initialized) {
174
- return react_1.default.createElement(Skeleton_1.default, null);
175
- }
176
- const content = (react_1.default.createElement(react_1.default.Fragment, null, !state.count ? (react_1.default.createElement(material_1.Typography, { className: classes.noResults, variant: "body2" },
177
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupRequestsWidget.subtitle.noResults", defaultMessage: "" }))) : (react_1.default.createElement(react_1.default.Fragment, null,
178
- react_1.default.createElement(List_1.default, null, state.results.slice(0, state.visibleItems).map((group) => (react_1.default.createElement(material_1.ListItem, { key: group.id, className: classes.item },
179
- react_1.default.createElement(Group_1.default, Object.assign({ elevation: 1, actions: react_1.default.createElement(react_1.default.Fragment, null), group: group, groupId: group.id, buttonProps: { onClick: () => console.log(group) } }, GroupProps)))))),
180
- state.count > state.visibleItems && (react_1.default.createElement(material_1.Button, { className: classes.showMore, onClick: () => console.log('load more') },
181
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupRequestsWidget.button.showMore", defaultMessage: "ui.groupRequestsWidget.button.showMore" })))))));
127
+ const content = (react_1.default.createElement(react_1.default.Fragment, null, loading ? (react_1.default.createElement(Skeleton_1.default, null)) : (react_1.default.createElement(material_1.Grid, { container: true, spacing: { xs: 3 }, className: classes.groups }, !groups.length ? (react_1.default.createElement(material_1.Box, { className: classes.noResults },
128
+ react_1.default.createElement(material_1.Typography, { variant: "h4" },
129
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groups.noGroups.title", defaultMessage: "ui.groups.noGroups.title" })),
130
+ react_1.default.createElement(material_1.Typography, { variant: "body1" },
131
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groups.noGroups.subtitle", defaultMessage: "ui.groups.noGroups.subtitle" })))) : (react_1.default.createElement(react_1.default.Fragment, null, groups.map((group) => (react_1.default.createElement(material_1.Grid, { item: true, xs: 12, sm: 8, md: 6, key: group.id, className: classes.item },
132
+ react_1.default.createElement(Group_1.default, Object.assign({ group: group, groupId: group.id, groupSubscribeButtonProps: { onSubscribe: handleSubscribe } }, GroupComponentProps)))))))))));
182
133
  return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, rest), content));
183
134
  }
184
135
  exports.default = Groups;
@@ -1,4 +1,15 @@
1
- import { WidgetProps } from '../Widget';
1
+ export interface GroupsSkeletonProps {
2
+ /**
3
+ * Overrides or extends the styles applied to the component.
4
+ * @default null
5
+ */
6
+ className?: string;
7
+ /**
8
+ * Overrides or extends the styles applied to the component.
9
+ * @default null
10
+ */
11
+ GroupSkeletonProps?: any;
12
+ }
2
13
  /**
3
14
  * > API documentation for the Community-JS Groups Skeleton component. Learn about the available props and the CSS API.
4
15
 
@@ -17,6 +28,7 @@ import { WidgetProps } from '../Widget';
17
28
  |Rule Name|Global class|Description|
18
29
  |---|---|---|
19
30
  |root|.SCGroups-skeleton-root|Styles applied to the root element.|
31
+ |groups|.SCGroups-skeleton-groups|Styles applied to the group elements.|
20
32
  *
21
33
  */
22
- export default function GroupsSkeleton(props: WidgetProps): JSX.Element;
34
+ export default function GroupsSkeleton(inProps: GroupsSkeletonProps): JSX.Element;
@@ -2,13 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const react_1 = tslib_1.__importDefault(require("react"));
5
- const CategoryTrendingUsersWidget_1 = require("../CategoryTrendingUsersWidget");
6
5
  const styles_1 = require("@mui/material/styles");
7
6
  const constants_1 = require("./constants");
7
+ const material_1 = require("@mui/material");
8
+ const classnames_1 = tslib_1.__importDefault(require("classnames"));
9
+ const Group_1 = require("../Group");
8
10
  const classes = {
9
- root: `${constants_1.PREFIX}-skeleton-root`
11
+ root: `${constants_1.PREFIX}-skeleton-root`,
12
+ groups: `${constants_1.PREFIX}-groups`
10
13
  };
11
- const Root = (0, styles_1.styled)(CategoryTrendingUsersWidget_1.CategoryTrendingPeopleWidgetSkeleton, {
14
+ const Root = (0, styles_1.styled)(material_1.Box, {
12
15
  name: constants_1.PREFIX,
13
16
  slot: 'SkeletonRoot'
14
17
  })(() => ({}));
@@ -30,9 +33,13 @@ const Root = (0, styles_1.styled)(CategoryTrendingUsersWidget_1.CategoryTrending
30
33
  |Rule Name|Global class|Description|
31
34
  |---|---|---|
32
35
  |root|.SCGroups-skeleton-root|Styles applied to the root element.|
36
+ |groups|.SCGroups-skeleton-groups|Styles applied to the group elements.|
33
37
  *
34
38
  */
35
- function GroupsSkeleton(props) {
36
- return react_1.default.createElement(Root, Object.assign({ className: classes.root }, props));
39
+ function GroupsSkeleton(inProps) {
40
+ const { className, GroupSkeletonProps = {} } = inProps, rest = tslib_1.__rest(inProps, ["className", "GroupSkeletonProps"]);
41
+ return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, rest),
42
+ react_1.default.createElement(material_1.Grid, { container: true, spacing: { xs: 3 }, className: classes.groups }, [...Array(15)].map((category, index) => (react_1.default.createElement(material_1.Grid, { item: true, xs: 12, sm: 8, md: 6, key: index },
43
+ react_1.default.createElement(Group_1.GroupSkeleton, Object.assign({ elevation: 0, variant: 'outlined' }, GroupSkeletonProps))))))));
37
44
  }
38
45
  exports.default = GroupsSkeleton;
@@ -1,4 +1,4 @@
1
- import { SCCategoryType, SCMediaType, SCPollType, SCTagType } from '@selfcommunity/types';
1
+ import { SCCategoryType, SCGroupType, SCMediaType, SCPollType, SCTagType } from '@selfcommunity/types';
2
2
  import { SCMediaObjectType } from '../../types/media';
3
3
  import { WidgetProps } from '../Widget';
4
4
  export interface InlineComposerWidgetProps extends Omit<WidgetProps, 'defaultValue'> {
@@ -15,6 +15,7 @@ export interface InlineComposerWidgetProps extends Omit<WidgetProps, 'defaultVal
15
15
  title?: string;
16
16
  text?: string;
17
17
  categories?: SCCategoryType[];
18
+ group?: SCGroupType;
18
19
  audience?: string;
19
20
  addressing?: SCTagType[];
20
21
  medias?: SCMediaType[];
@@ -62,7 +62,7 @@ function NavigationMenuIconButton(inProps) {
62
62
  props: inProps,
63
63
  name: PREFIX
64
64
  });
65
- const { className = null, DrawerProps = { anchor: 'left' }, drawerContent = react_1.default.createElement(DefaultDrawerContent_1.default, null), drawerHeaderContent = react_1.default.createElement(DefaultHeaderContent_1.default, null), ScrollContainerProps = {} } = props, rest = tslib_1.__rest(props, ["className", "DrawerProps", "drawerContent", "drawerHeaderContent", "ScrollContainerProps"]);
65
+ const { className = null, DrawerProps = { anchor: 'left' }, drawerHeaderContent = react_1.default.createElement(DefaultHeaderContent_1.default, null), drawerContent = react_1.default.createElement(DefaultDrawerContent_1.default, null), ScrollContainerProps = {} } = props, rest = tslib_1.__rest(props, ["className", "DrawerProps", "drawerHeaderContent", "drawerContent", "ScrollContainerProps"]);
66
66
  // STATE
67
67
  const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
68
68
  // CONTEXT
@@ -8,6 +8,10 @@ export interface NavigationToolbarMobileProps extends ToolbarProps {
8
8
  * Disable search action if possible
9
9
  */
10
10
  disableSearch?: boolean;
11
+ /**
12
+ * Preserve the same as the desktop version
13
+ */
14
+ preserveDesktopLogo?: boolean;
11
15
  /**
12
16
  * Props spread to SearchAutocomplete component
13
17
  */
@@ -64,7 +64,7 @@ function NavigationToolbarMobile(inProps) {
64
64
  props: inProps,
65
65
  name: constants_1.PREFIX
66
66
  });
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"]);
67
+ 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
68
  // CONTEXT
69
69
  const scUserContext = (0, react_core_1.useSCUser)();
70
70
  const scRoutingContext = (0, react_core_1.useSCRouting)();
@@ -85,8 +85,7 @@ function NavigationToolbarMobile(inProps) {
85
85
  }
86
86
  const _children = children || (react_1.default.createElement(react_1.default.Fragment, null,
87
87
  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" }))));
88
+ 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
89
  return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(className, classes.root) }, rest),
91
90
  _children,
92
91
  startActions,
@@ -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,79 @@
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
+ replyButton: `${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
+ notificationObject.type !== types_1.SCNotificationTypologyType.USER_ADDED_TO_GROUP && (react_1.default.createElement(react_1.default.Fragment, null,
59
+ react_1.default.createElement(react_core_1.Link, Object.assign({}, (!notificationObject.user.deleted && {
60
+ to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, notificationObject.user)
61
+ }), { onClick: notificationObject.user.deleted ? () => setOpenAlert(true) : null, className: classes.username }), notificationObject.user.username),
62
+ ' ')),
63
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: `ui.notification.${notificationObject.type}`, defaultMessage: `ui.notification.${notificationObject.type}`, values: {
64
+ group: notificationObject.group.name,
65
+ link: (...chunks) => react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, notificationObject.group) }, chunks)
66
+ } })), footer: isToastTemplate && (react_1.default.createElement(material_1.Stack, { direction: "row", justifyContent: "space-between", alignItems: "center", spacing: 2 },
67
+ react_1.default.createElement(DateTimeAgo_1.default, { date: notificationObject.active_at }),
68
+ status && status !== types_1.SCGroupSubscriptionStatusType.SUBSCRIBED && (react_1.default.createElement(material_1.Typography, { color: "primary" },
69
+ react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, notificationObject.group) },
70
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSubscribeButton.accept", defaultMessage: "ui.groupSubscribeButton.accept" })))))) }, rest)));
71
+ }
72
+ return (react_1.default.createElement(react_1.default.Fragment, null,
73
+ 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 },
74
+ react_1.default.createElement(DateTimeAgo_1.default, { date: notificationObject.active_at, className: classes.activeAt }),
75
+ status && status !== types_1.SCGroupSubscriptionStatusType.SUBSCRIBED && (react_1.default.createElement(lab_1.LoadingButton, { color: 'primary', variant: "outlined", size: "small", classes: { root: classes.replyButton }, 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) },
76
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSubscribeButton.accept", defaultMessage: "ui.groupSubscribeButton.accept" })))) }, rest)),
77
+ openAlert && react_1.default.createElement(UserDeletedSnackBar_1.default, { open: openAlert, handleClose: () => setOpenAlert(false) })));
78
+ }
79
+ 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,30 @@ 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
+ notificationObject.aggregated[0].type !== types_1.SCNotificationTypologyType.USER_ADDED_TO_GROUP && (react_1.default.createElement(react_1.default.Fragment, null,
215
+ react_1.default.createElement(react_core_1.Link, Object.assign({}, (!groupNotification.user.deleted && {
216
+ to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, groupNotification.user)
217
+ }), { onClick: groupNotification.user.deleted ? () => setOpenAlert(true) : null, className: classes.username }), groupNotification.user.username),
218
+ ' ')),
219
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: `ui.notification.${notificationObject.aggregated[0].type}`, defaultMessage: `ui.notification.${notificationObject.aggregated[0].type}`, values: {
220
+ group: groupNotification.group.name,
221
+ link: (...chunks) => react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, groupNotification.group) }, chunks)
222
+ } })) }));
223
+ }
199
224
  /**
200
225
  * Comment, NestedComment, Follow Contribution header
201
226
  */
@@ -278,6 +303,12 @@ function UserNotification(inProps) {
278
303
  else if (n.type === types_1.SCNotificationTypologyType.CONTRIBUTION) {
279
304
  return react_1.default.createElement(Contribution_1.default, { notificationObject: n, key: i, onVote: handleVote(i) });
280
305
  }
306
+ else if (n.type === types_1.SCNotificationTypologyType.USER_ADDED_TO_GROUP ||
307
+ n.type === types_1.SCNotificationTypologyType.USER_INVITED_TO_JOIN_GROUP ||
308
+ n.type === types_1.SCNotificationTypologyType.USER_ACCEPTED_TO_JOIN_GROUP ||
309
+ n.type === types_1.SCNotificationTypologyType.USER_REQUESTED_TO_JOIN_GROUP) {
310
+ return react_1.default.createElement(Group_1.default, { notificationObject: n, key: i });
311
+ }
281
312
  return null;
282
313
  }
283
314
  /**
@@ -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