@selfcommunity/react-ui 0.7.9-alpha.5 → 0.7.9-alpha.51

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 (144) hide show
  1. package/lib/cjs/components/CategoryHeader/Skeleton.js +3 -2
  2. package/lib/cjs/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  3. package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  4. package/lib/cjs/components/Composer/Attributes/Attributes.js +3 -3
  5. package/lib/cjs/components/Composer/Composer.js +3 -5
  6. package/lib/cjs/components/Composer/Content/ContentPost/ContentPost.js +4 -3
  7. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +2 -3
  8. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +8 -9
  9. package/lib/cjs/components/EditGroupButton/EditGroupButton.js +4 -0
  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 +3 -0
  14. package/lib/cjs/components/Group/Group.js +16 -4
  15. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
  16. package/lib/cjs/components/GroupForm/GroupForm.js +31 -9
  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/GroupHeader/Skeleton.d.ts +2 -4
  20. package/lib/cjs/components/GroupHeader/Skeleton.js +10 -10
  21. package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +40 -7
  22. package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +33 -46
  23. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  24. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.js +221 -0
  25. package/lib/cjs/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  26. package/lib/cjs/components/GroupInvitedWidget/Skeleton.js +38 -0
  27. package/lib/cjs/components/GroupInvitedWidget/constants.d.ts +1 -0
  28. package/lib/cjs/components/GroupInvitedWidget/constants.js +4 -0
  29. package/lib/cjs/components/GroupInvitedWidget/index.d.ts +4 -0
  30. package/lib/cjs/components/GroupInvitedWidget/index.js +8 -0
  31. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  32. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +7 -2
  33. package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +25 -4
  34. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  35. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  36. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  37. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +145 -0
  38. package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
  39. package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
  40. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  41. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +31 -10
  42. package/lib/cjs/components/Groups/Groups.d.ts +19 -16
  43. package/lib/cjs/components/Groups/Groups.js +89 -85
  44. package/lib/cjs/components/Groups/Skeleton.d.ts +4 -0
  45. package/lib/cjs/components/Groups/Skeleton.js +2 -2
  46. package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  47. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
  48. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
  49. package/lib/cjs/components/Notification/Group/Group.d.ts +15 -0
  50. package/lib/cjs/components/Notification/Group/Group.js +78 -0
  51. package/lib/cjs/components/Notification/Group/index.d.ts +3 -0
  52. package/lib/cjs/components/Notification/Group/index.js +5 -0
  53. package/lib/cjs/components/Notification/Notification.js +31 -1
  54. package/lib/cjs/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  55. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  56. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +12 -7
  57. package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  58. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  59. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +24 -6
  60. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  61. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +45 -20
  62. package/lib/cjs/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +6 -0
  63. package/lib/cjs/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  64. package/lib/cjs/components/SnippetNotifications/SnippetNotifications.js +7 -0
  65. package/lib/cjs/components/ToastNotifications/ToastNotifications.js +7 -0
  66. package/lib/cjs/components/User/User.d.ts +6 -1
  67. package/lib/cjs/components/User/User.js +5 -4
  68. package/lib/cjs/constants/PubSub.d.ts +28 -0
  69. package/lib/cjs/constants/PubSub.js +22 -0
  70. package/lib/cjs/index.d.ts +5 -2
  71. package/lib/cjs/index.js +12 -4
  72. package/lib/esm/components/CategoryHeader/Skeleton.js +3 -2
  73. package/lib/esm/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  74. package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  75. package/lib/esm/components/Composer/Attributes/Attributes.js +3 -3
  76. package/lib/esm/components/Composer/Composer.js +3 -5
  77. package/lib/esm/components/Composer/Content/ContentPost/ContentPost.js +4 -3
  78. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +2 -3
  79. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +8 -9
  80. package/lib/esm/components/EditGroupButton/EditGroupButton.js +5 -1
  81. package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
  82. package/lib/esm/components/FeedObject/FeedObject.js +24 -7
  83. package/lib/esm/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  84. package/lib/esm/components/Group/Group.d.ts +3 -0
  85. package/lib/esm/components/Group/Group.js +18 -6
  86. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
  87. package/lib/esm/components/GroupForm/GroupForm.js +31 -9
  88. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
  89. package/lib/esm/components/GroupHeader/GroupHeader.js +55 -13
  90. package/lib/esm/components/GroupHeader/Skeleton.d.ts +2 -4
  91. package/lib/esm/components/GroupHeader/Skeleton.js +10 -10
  92. package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +40 -7
  93. package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +33 -46
  94. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  95. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.js +218 -0
  96. package/lib/esm/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  97. package/lib/esm/components/GroupInvitedWidget/Skeleton.js +34 -0
  98. package/lib/esm/components/GroupInvitedWidget/constants.d.ts +1 -0
  99. package/lib/esm/components/GroupInvitedWidget/constants.js +1 -0
  100. package/lib/esm/components/GroupInvitedWidget/index.d.ts +4 -0
  101. package/lib/esm/components/GroupInvitedWidget/index.js +4 -0
  102. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  103. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +8 -3
  104. package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +26 -5
  105. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  106. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  107. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  108. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +142 -0
  109. package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
  110. package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
  111. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  112. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +32 -11
  113. package/lib/esm/components/Groups/Groups.d.ts +19 -16
  114. package/lib/esm/components/Groups/Groups.js +94 -90
  115. package/lib/esm/components/Groups/Skeleton.d.ts +4 -0
  116. package/lib/esm/components/Groups/Skeleton.js +2 -2
  117. package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  118. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
  119. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
  120. package/lib/esm/components/Notification/Group/Group.d.ts +15 -0
  121. package/lib/esm/components/Notification/Group/Group.js +75 -0
  122. package/lib/esm/components/Notification/Group/index.d.ts +3 -0
  123. package/lib/esm/components/Notification/Group/index.js +2 -0
  124. package/lib/esm/components/Notification/Notification.js +31 -1
  125. package/lib/esm/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  126. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  127. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +13 -8
  128. package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  129. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  130. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
  131. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  132. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +47 -22
  133. package/lib/esm/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +7 -1
  134. package/lib/esm/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  135. package/lib/esm/components/SnippetNotifications/SnippetNotifications.js +7 -0
  136. package/lib/esm/components/ToastNotifications/ToastNotifications.js +7 -0
  137. package/lib/esm/components/User/User.d.ts +6 -1
  138. package/lib/esm/components/User/User.js +5 -4
  139. package/lib/esm/constants/PubSub.d.ts +28 -0
  140. package/lib/esm/constants/PubSub.js +19 -0
  141. package/lib/esm/index.d.ts +5 -2
  142. package/lib/esm/index.js +7 -4
  143. package/lib/umd/react-ui.js +1 -1
  144. package/package.json +6 -6
@@ -15,10 +15,12 @@ const ChangeGroupPicture_1 = tslib_1.__importDefault(require("../ChangeGroupPict
15
15
  const ChangeGroupCover_1 = tslib_1.__importDefault(require("../ChangeGroupCover"));
16
16
  const Group_1 = require("../../constants/Group");
17
17
  const GroupInviteButton_1 = tslib_1.__importDefault(require("../GroupInviteButton"));
18
+ const pubsub_js_1 = tslib_1.__importDefault(require("pubsub-js"));
18
19
  const types_1 = require("@selfcommunity/types");
19
20
  const Errors_1 = require("../../constants/Errors");
20
21
  const api_services_1 = require("@selfcommunity/api-services");
21
22
  const utils_1 = require("@selfcommunity/utils");
23
+ const PubSub_1 = require("../../constants/PubSub");
22
24
  const messages = (0, react_intl_1.defineMessages)({
23
25
  name: {
24
26
  id: 'ui.groupForm.name.placeholder',
@@ -142,6 +144,22 @@ function GroupForm(inProps) {
142
144
  setError(error);
143
145
  }
144
146
  }
147
+ /**
148
+ * Notify when a group info changed
149
+ * @param data
150
+ */
151
+ function notifyChanges(data) {
152
+ if (data) {
153
+ if (group) {
154
+ // Edit group
155
+ pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.EDIT}`, data);
156
+ }
157
+ else {
158
+ // Create group
159
+ pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.CREATE}`, data);
160
+ }
161
+ }
162
+ }
145
163
  const handleSubmit = () => {
146
164
  setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: true })));
147
165
  const formData = new FormData();
@@ -155,8 +173,10 @@ function GroupForm(inProps) {
155
173
  if (field.emotionalImageOriginalFile) {
156
174
  formData.append('emotional_image_original', field.emotionalImageOriginalFile);
157
175
  }
158
- for (const key in field.invitedUsers) {
159
- formData.append(key, field.invitedUsers[key]);
176
+ if (!group) {
177
+ for (const key in field.invitedUsers) {
178
+ formData.append(key, field.invitedUsers[key]);
179
+ }
160
180
  }
161
181
  let groupService;
162
182
  if (group) {
@@ -168,6 +188,7 @@ function GroupForm(inProps) {
168
188
  groupService
169
189
  .then((data) => {
170
190
  onSuccess && onSuccess(data);
191
+ notifyChanges(data);
171
192
  onClose && onClose();
172
193
  setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: false })));
173
194
  })
@@ -215,25 +236,26 @@ function GroupForm(inProps) {
215
236
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isPublic }) },
216
237
  react_1.default.createElement(material_1.Icon, null, "private"),
217
238
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private", defaultMessage: "ui.groupForm.privacy.private" })),
218
- react_1.default.createElement(material_1.Switch, { className: classes.switch, checked: field.isPublic, onClick: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['isPublic']: !field.isPublic }))) }),
239
+ react_1.default.createElement(material_1.Switch, { className: classes.switch, checked: field.isPublic, onChange: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['isPublic']: !field.isPublic }))), disabled: group && group.privacy === types_1.SCGroupPrivacyType.PRIVATE }),
219
240
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: field.isPublic }) },
220
241
  react_1.default.createElement(material_1.Icon, null, "public"),
221
242
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.public", defaultMessage: "ui.groupForm.privacy.public" }))),
222
- react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.privacySectionInfo }, field.isPublic ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.public.info", defaultMessage: "ui.groupForm.privacy.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private.info", defaultMessage: "ui.groupForm.private.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })))),
223
- react_1.default.createElement(material_1.Box, { className: classes.visibilitySection }, !field.isPublic && (react_1.default.createElement(react_1.default.Fragment, null,
243
+ react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.privacySectionInfo }, field.isPublic ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.public.info", defaultMessage: "ui.groupForm.privacy.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })) : (react_1.default.createElement(react_1.default.Fragment, null, group && group.privacy === types_1.SCGroupPrivacyType.PRIVATE ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private.info.edit", defaultMessage: "ui.groupForm.private.public.info.edit", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private.info", defaultMessage: "ui.groupForm.private.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })))))),
244
+ react_1.default.createElement(material_1.Box, { className: classes.visibilitySection }, ((!field.isPublic && !group) || (group && !field.isPublic)) && (react_1.default.createElement(react_1.default.Fragment, null,
224
245
  react_1.default.createElement(material_1.Typography, { variant: "h4" },
225
246
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.title", defaultMessage: "ui.groupForm.visibility.title", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })),
226
247
  react_1.default.createElement(material_1.Stack, { direction: "row", spacing: 1, alignItems: "center" },
227
248
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isVisible }) },
228
249
  react_1.default.createElement(material_1.Icon, null, "visibility_off"),
229
250
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.hidden", defaultMessage: "ui.groupForm.visibility.hidden" })),
230
- react_1.default.createElement(material_1.Switch, { className: classes.switch, checked: field.isVisible, onClick: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['isVisible']: !field.isVisible }))) }),
251
+ react_1.default.createElement(material_1.Switch, { className: classes.switch, checked: field.isVisible, onChange: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['isVisible']: !field.isVisible }))) }),
231
252
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: field.isVisible }) },
232
253
  react_1.default.createElement(material_1.Icon, null, "visibility"),
233
254
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.visible", defaultMessage: "ui.groupForm.visibility.visible" }))),
234
255
  react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.visibilitySectionInfo }, !field.isVisible ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.hidden.info", defaultMessage: "ui.groupForm.visibility.hidden.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.visible.info", defaultMessage: "ui.groupForm.visibility.visible.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } }))))))),
235
- react_1.default.createElement(material_1.Divider, null),
236
- react_1.default.createElement(material_1.Box, { className: classes.inviteSection },
237
- react_1.default.createElement(GroupInviteButton_1.default, { handleInvitations: handleInviteSection })))));
256
+ !group && (react_1.default.createElement(react_1.default.Fragment, null,
257
+ react_1.default.createElement(material_1.Divider, null),
258
+ react_1.default.createElement(material_1.Box, { className: classes.inviteSection },
259
+ react_1.default.createElement(GroupInviteButton_1.default, { handleInvitations: handleInviteSection })))))));
238
260
  }
239
261
  exports.default = GroupForm;
@@ -1,8 +1,8 @@
1
- import React from 'react';
2
1
  import { SCGroupType } from '@selfcommunity/types';
3
2
  import { ChangeGroupCoverProps } from '../ChangeGroupCover';
4
3
  import { ChangeGroupPictureProps } from '../ChangeGroupPicture';
5
4
  import { GroupMembersButtonProps } from '../GroupMembersButton';
5
+ import { GroupSubscribeButtonProps } from '../GroupSubscribeButton';
6
6
  export interface GroupHeaderProps {
7
7
  /**
8
8
  * Id of group object
@@ -35,14 +35,15 @@ export interface GroupHeaderProps {
35
35
  */
36
36
  ChangeCoverProps?: ChangeGroupCoverProps;
37
37
  /**
38
- * Props to spread to the group memebers button
38
+ * Props to spread group button followed
39
39
  * @default {}
40
40
  */
41
- GroupMembersButtonProps?: GroupMembersButtonProps;
41
+ GroupSubscribeButtonProps?: GroupSubscribeButtonProps;
42
42
  /**
43
- *
43
+ * Props to spread to the group memebers button
44
+ * @default {}
44
45
  */
45
- actions?: React.ReactNode;
46
+ GroupMembersButtonProps?: GroupMembersButtonProps;
46
47
  /**
47
48
  * Any other properties
48
49
  */
@@ -16,6 +16,10 @@ const Bullet_1 = tslib_1.__importDefault(require("../../shared/Bullet"));
16
16
  const ChangeGroupPicture_1 = tslib_1.__importDefault(require("../ChangeGroupPicture"));
17
17
  const GroupMembersButton_1 = tslib_1.__importDefault(require("../GroupMembersButton"));
18
18
  const EditGroupButton_1 = tslib_1.__importDefault(require("../EditGroupButton"));
19
+ const GroupSubscribeButton_1 = tslib_1.__importDefault(require("../GroupSubscribeButton"));
20
+ const GroupInviteButton_1 = tslib_1.__importDefault(require("../GroupInviteButton"));
21
+ const PubSub_1 = require("../../constants/PubSub");
22
+ const pubsub_js_1 = tslib_1.__importDefault(require("pubsub-js"));
19
23
  const classes = {
20
24
  root: `${constants_1.PREFIX}-root`,
21
25
  cover: `${constants_1.PREFIX}-cover`,
@@ -72,22 +76,24 @@ function GroupHeader(inProps) {
72
76
  props: inProps,
73
77
  name: constants_1.PREFIX
74
78
  });
75
- const { id = null, className = null, group, groupId = null, ChangePictureProps = {}, ChangeCoverProps = {}, GroupMembersButtonProps = {}, actions } = props, rest = tslib_1.__rest(props, ["id", "className", "group", "groupId", "ChangePictureProps", "ChangeCoverProps", "GroupMembersButtonProps", "actions"]);
79
+ const { id = null, className = null, group, groupId = null, ChangePictureProps = {}, ChangeCoverProps = {}, GroupSubscribeButtonProps = {}, GroupMembersButtonProps = {} } = props, rest = tslib_1.__rest(props, ["id", "className", "group", "groupId", "ChangePictureProps", "ChangeCoverProps", "GroupSubscribeButtonProps", "GroupMembersButtonProps"]);
76
80
  // PREFERENCES
77
81
  const scPreferences = (0, react_core_1.useSCPreferences)();
78
82
  // CONTEXT
79
83
  const scUserContext = (0, react_core_1.useSCUser)();
80
84
  // HOOKS
81
85
  const { scGroup, setSCGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
86
+ // REFS
87
+ const updatesSubscription = (0, react_1.useRef)(null);
82
88
  // CONST
83
- const canEdit = (0, react_1.useMemo)(() => { var _a; return scUserContext.user && ((_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id) === scUserContext.user.id; }, [scUserContext.user, (_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id]);
89
+ const isGroupAdmin = (0, react_1.useMemo)(() => { var _a; return scUserContext.user && ((_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id) === scUserContext.user.id; }, [scUserContext.user, (_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id]);
84
90
  /**
85
91
  * Handles Change Avatar
86
92
  * @param avatar
87
93
  */
88
94
  function handleChangeAvatar(avatar) {
89
- if (canEdit) {
90
- setSCGroup(Object.assign({}, scGroup, { image_bigger: avatar }));
95
+ if (isGroupAdmin) {
96
+ setSCGroup(Object.assign({}, scGroup, { image_big: avatar }));
91
97
  }
92
98
  }
93
99
  /**
@@ -95,10 +101,44 @@ function GroupHeader(inProps) {
95
101
  * @param cover
96
102
  */
97
103
  function handleChangeCover(cover) {
98
- if (canEdit) {
104
+ if (isGroupAdmin) {
99
105
  setSCGroup(Object.assign({}, scGroup, { emotional_image: cover }));
100
106
  }
101
107
  }
108
+ /**
109
+ * Handles callback subscribe/unsubscribe group
110
+ */
111
+ const handleSubscribe = (group, status) => {
112
+ setSCGroup(Object.assign(Object.assign({}, group), { subscribers_counter: group.subscribers_counter + (status ? 1 : -1) }));
113
+ };
114
+ /**
115
+ * Subscriber for pubsub callback
116
+ */
117
+ const onChangeGroupMembersHandler = (0, react_1.useCallback)((msg, data) => {
118
+ var _a;
119
+ if (data && ((_a = data === null || data === void 0 ? void 0 : data.group) === null || _a === void 0 ? void 0 : _a.id) === (scGroup === null || scGroup === void 0 ? void 0 : scGroup.id)) {
120
+ let _group = Object.assign({}, scGroup);
121
+ if (msg === `${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.ADD_MEMBER}`) {
122
+ _group.subscribers_counter = _group.subscribers_counter + 1;
123
+ }
124
+ else if (msg === `${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.REMOVE_MEMBER}`) {
125
+ _group.subscribers_counter = Math.max(_group.subscribers_counter - 1, 0);
126
+ }
127
+ console.log(_group);
128
+ setSCGroup(_group);
129
+ }
130
+ }, [scGroup, setSCGroup]);
131
+ /**
132
+ * On mount, subscribe to receive groups updates (only edit)
133
+ */
134
+ (0, react_1.useEffect)(() => {
135
+ if (scGroup) {
136
+ updatesSubscription.current = pubsub_js_1.default.subscribe(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.MEMBERS}`, onChangeGroupMembersHandler);
137
+ }
138
+ return () => {
139
+ updatesSubscription.current && pubsub_js_1.default.unsubscribe(updatesSubscription.current);
140
+ };
141
+ }, [scGroup]);
102
142
  // RENDER
103
143
  if (!scGroup) {
104
144
  return react_1.default.createElement(Skeleton_1.default, null);
@@ -110,13 +150,13 @@ function GroupHeader(inProps) {
110
150
  react_1.default.createElement(material_1.Paper, { style: _backgroundCover, classes: { root: classes.cover } },
111
151
  react_1.default.createElement(material_1.Box, { className: classes.avatar },
112
152
  react_1.default.createElement(material_1.Avatar, null,
113
- react_1.default.createElement("img", { alt: "group", src: scGroup.image_bigger ? scGroup.image_bigger : '' }))),
114
- canEdit && (react_1.default.createElement(react_1.default.Fragment, null,
153
+ react_1.default.createElement("img", { alt: "group", src: scGroup.image_big ? scGroup.image_big : '' }))),
154
+ isGroupAdmin && (react_1.default.createElement(react_1.default.Fragment, null,
115
155
  react_1.default.createElement(ChangeGroupPicture_1.default, Object.assign({ groupId: scGroup.id, onChange: handleChangeAvatar, className: classes.changePicture }, ChangePictureProps)),
116
156
  react_1.default.createElement("div", { className: classes.changeCover },
117
157
  react_1.default.createElement(ChangeGroupCover_1.default, Object.assign({ groupId: scGroup.id, onChange: handleChangeCover }, ChangeCoverProps)))))),
118
158
  react_1.default.createElement(material_1.Box, { className: classes.info },
119
- canEdit && react_1.default.createElement(EditGroupButton_1.default, { group: scGroup, groupId: scGroup.id, onEditSuccess: (data) => setSCGroup(data) }),
159
+ isGroupAdmin && react_1.default.createElement(EditGroupButton_1.default, { group: scGroup, groupId: scGroup.id, onEditSuccess: (data) => setSCGroup(data) }),
120
160
  react_1.default.createElement(material_1.Typography, { variant: "h5", className: classes.name }, scGroup.name),
121
161
  react_1.default.createElement(material_1.Box, { className: classes.visibility },
122
162
  scGroup.privacy === types_1.SCGroupPrivacyType.PUBLIC ? (react_1.default.createElement(material_1.Typography, { className: classes.visibilityItem },
@@ -130,10 +170,12 @@ function GroupHeader(inProps) {
130
170
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupHeader.visibility.visible", defaultMessage: "ui.groupHeader.visibility.visible" }))) : (react_1.default.createElement(material_1.Typography, { className: classes.visibilityItem },
131
171
  react_1.default.createElement(material_1.Icon, null, "visibility_off"),
132
172
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupHeader.visibility.hidden", defaultMessage: "ui.groupHeader.visibility.hidden" })))),
133
- react_1.default.createElement(material_1.Box, { className: classes.members },
173
+ react_1.default.createElement(react_1.default.Fragment, null, ((scGroup && scGroup.privacy === types_1.SCGroupPrivacyType.PUBLIC) ||
174
+ scGroup.subscription_status === types_1.SCGroupSubscriptionStatusType.SUBSCRIBED ||
175
+ isGroupAdmin) && (react_1.default.createElement(material_1.Box, { className: classes.members },
134
176
  react_1.default.createElement(material_1.Typography, { className: classes.membersCounter, component: "div" },
135
177
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupHeader.members", defaultMessage: "ui.groupHeader.members", values: { total: scGroup.subscribers_counter } })),
136
- react_1.default.createElement(GroupMembersButton_1.default, Object.assign({ groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, group: scGroup }, GroupMembersButtonProps))),
137
- actions && actions)));
178
+ react_1.default.createElement(GroupMembersButton_1.default, Object.assign({ key: scGroup.subscribers_counter, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, group: scGroup, autoHide: !isGroupAdmin }, GroupMembersButtonProps))))),
179
+ isGroupAdmin ? (react_1.default.createElement(GroupInviteButton_1.default, { group: scGroup, groupId: scGroup.id })) : (react_1.default.createElement(GroupSubscribeButton_1.default, Object.assign({ group: scGroup, onSubscribe: handleSubscribe }, GroupSubscribeButtonProps))))));
138
180
  }
139
181
  exports.default = GroupHeader;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * > API documentation for the Community-JS Group Headerr Skeleton component. Learn about the available props and the CSS API.
2
+ * > API documentation for the Community-JS Group Header Skeleton component. Learn about the available props and the CSS API.
3
3
 
4
4
  #### Import
5
5
 
@@ -18,9 +18,7 @@
18
18
  |root|.SCGroupHeader-skeleton-root|Styles applied to the root element.|
19
19
  |avatar|.SCGroupHeader-avatar|Styles applied to the avatar element.|
20
20
  |cover|.SCGroupHeader-cover|Styles applied to the cover element.|
21
- |actions|.SCGroupHeader-actions|Styles applied to the actions section.|
22
- |section|.SCGroupHeader-section|Styles applied to the info section.|
23
- |username|.SCGroupHeader-username|Styles applied to the username element.|
21
+ |info|.SCGroupHeader-info|Styles applied to the info info.|
24
22
  *
25
23
  */
26
24
  declare function GroupHeaderSkeleton(): JSX.Element;
@@ -10,16 +10,14 @@ const classes = {
10
10
  root: `${constants_1.PREFIX}-skeleton-root`,
11
11
  cover: `${constants_1.PREFIX}-cover`,
12
12
  avatar: `${constants_1.PREFIX}-avatar`,
13
- actions: `${constants_1.PREFIX}-actions`,
14
- section: `${constants_1.PREFIX}-section`,
15
- username: `${constants_1.PREFIX}-username`
13
+ info: `${constants_1.PREFIX}-info`
16
14
  };
17
15
  const Root = (0, styles_1.styled)(material_1.Box, {
18
16
  name: constants_1.PREFIX,
19
17
  slot: 'SkeletonRoot'
20
18
  })(() => ({}));
21
19
  /**
22
- * > API documentation for the Community-JS Group Headerr Skeleton component. Learn about the available props and the CSS API.
20
+ * > API documentation for the Community-JS Group Header Skeleton component. Learn about the available props and the CSS API.
23
21
 
24
22
  #### Import
25
23
 
@@ -38,9 +36,7 @@ const Root = (0, styles_1.styled)(material_1.Box, {
38
36
  |root|.SCGroupHeader-skeleton-root|Styles applied to the root element.|
39
37
  |avatar|.SCGroupHeader-avatar|Styles applied to the avatar element.|
40
38
  |cover|.SCGroupHeader-cover|Styles applied to the cover element.|
41
- |actions|.SCGroupHeader-actions|Styles applied to the actions section.|
42
- |section|.SCGroupHeader-section|Styles applied to the info section.|
43
- |username|.SCGroupHeader-username|Styles applied to the username element.|
39
+ |info|.SCGroupHeader-info|Styles applied to the info info.|
44
40
  *
45
41
  */
46
42
  function GroupHeaderSkeleton() {
@@ -49,8 +45,12 @@ function GroupHeaderSkeleton() {
49
45
  react_1.default.createElement(Skeleton_1.default, { className: classes.cover, animation: "wave", variant: "rectangular" }),
50
46
  react_1.default.createElement(material_1.Box, { className: classes.avatar },
51
47
  react_1.default.createElement(Skeleton_1.default, { animation: "wave", variant: "circular", width: theme.selfcommunity.group.avatar.sizeLarge, height: theme.selfcommunity.group.avatar.sizeLarge })),
52
- react_1.default.createElement(material_1.Box, { className: classes.section },
53
- react_1.default.createElement(material_1.Typography, { variant: "h5", className: classes.username },
54
- react_1.default.createElement(Skeleton_1.default, { animation: "wave", sx: { height: 30, width: 100 } })))));
48
+ react_1.default.createElement(material_1.Box, { className: classes.info },
49
+ react_1.default.createElement(material_1.Typography, { variant: "h5" },
50
+ react_1.default.createElement(Skeleton_1.default, { animation: "wave", sx: { height: 30, width: 200 } })),
51
+ react_1.default.createElement(material_1.Typography, null,
52
+ react_1.default.createElement(Skeleton_1.default, { animation: "wave", sx: { height: 20, width: 150 } })),
53
+ react_1.default.createElement(material_1.Typography, null,
54
+ react_1.default.createElement(Skeleton_1.default, { animation: "wave", sx: { height: 20, width: 100 } })))));
55
55
  }
56
56
  exports.default = GroupHeaderSkeleton;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
- const react_1 = tslib_1.__importDefault(require("react"));
4
+ const react_1 = tslib_1.__importStar(require("react"));
5
5
  const styles_1 = require("@mui/material/styles");
6
6
  const material_1 = require("@mui/material");
7
7
  const classnames_1 = tslib_1.__importDefault(require("classnames"));
@@ -10,7 +10,10 @@ const system_1 = require("@mui/system");
10
10
  const constants_1 = require("./constants");
11
11
  const react_intl_1 = require("react-intl");
12
12
  const types_1 = require("@selfcommunity/types");
13
+ const pubsub_js_1 = tslib_1.__importDefault(require("pubsub-js"));
13
14
  const react_core_1 = require("@selfcommunity/react-core");
15
+ const Skeleton_1 = tslib_1.__importDefault(require("./Skeleton"));
16
+ const PubSub_1 = require("../../constants/PubSub");
14
17
  const classes = {
15
18
  root: `${constants_1.PREFIX}-root`,
16
19
  title: `${constants_1.PREFIX}-title`,
@@ -19,6 +22,7 @@ const classes = {
19
22
  privacyTitle: `${constants_1.PREFIX}-privacy-title`,
20
23
  visibility: `${constants_1.PREFIX}-visibility`,
21
24
  visibilityTitle: `${constants_1.PREFIX}-visibility-title`,
25
+ admin: `${constants_1.PREFIX}-admin`,
22
26
  date: `${constants_1.PREFIX}-date`
23
27
  };
24
28
  const Root = (0, styles_1.styled)(Widget_1.default, {
@@ -61,9 +65,36 @@ function GroupInfoWidget(inProps) {
61
65
  });
62
66
  const { className, group, groupId, onHeightChange, onStateChange } = props, rest = tslib_1.__rest(props, ["className", "group", "groupId", "onHeightChange", "onStateChange"]);
63
67
  // HOOKS
64
- const { scGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
68
+ const { scGroup, setSCGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
65
69
  // INTL
66
70
  const intl = (0, react_intl_1.useIntl)();
71
+ // REFS
72
+ const updatesSubscription = (0, react_1.useRef)(null);
73
+ /**
74
+ * Subscriber for pubsub callback
75
+ */
76
+ const onChangeGroupHandler = (0, react_1.useCallback)((_msg, data) => {
77
+ if (data && scGroup.id === data.id) {
78
+ setSCGroup(data);
79
+ }
80
+ }, [scGroup, setSCGroup]);
81
+ /**
82
+ * On mount, subscribe to receive groups updates (only edit)
83
+ */
84
+ (0, react_1.useEffect)(() => {
85
+ if (scGroup) {
86
+ updatesSubscription.current = pubsub_js_1.default.subscribe(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.EDIT}`, onChangeGroupHandler);
87
+ }
88
+ return () => {
89
+ updatesSubscription.current && pubsub_js_1.default.unsubscribe(updatesSubscription.current);
90
+ };
91
+ }, [scGroup]);
92
+ /**
93
+ * Loading group
94
+ */
95
+ if (!scGroup) {
96
+ return react_1.default.createElement(Skeleton_1.default, null);
97
+ }
67
98
  /**
68
99
  * Renders root object
69
100
  */
@@ -75,14 +106,14 @@ function GroupInfoWidget(inProps) {
75
106
  react_1.default.createElement(material_1.Typography, { component: "div", className: classes.privacy }, scGroup.privacy === types_1.SCGroupPrivacyType.PUBLIC ? (react_1.default.createElement(react_1.default.Fragment, null,
76
107
  react_1.default.createElement(material_1.Typography, { className: classes.privacyTitle },
77
108
  react_1.default.createElement(material_1.Icon, null, "public"),
78
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.public", defaultMessage: "ui.groupForm.privacy.public" })),
109
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.privacy.public", defaultMessage: "ui.groupInfoWidget.privacy.public" })),
79
110
  react_1.default.createElement(material_1.Typography, { variant: "body2" },
80
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.public.info", defaultMessage: "ui.groupForm.privacy.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })))) : (react_1.default.createElement(react_1.default.Fragment, null,
111
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.privacy.public.info", defaultMessage: "ui.groupInfoWidget.privacy.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })))) : (react_1.default.createElement(react_1.default.Fragment, null,
81
112
  react_1.default.createElement(material_1.Typography, { className: classes.privacyTitle },
82
113
  react_1.default.createElement(material_1.Icon, null, "private"),
83
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private", defaultMessage: "ui.groupForm.privacy.private" })),
114
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.privacy.private", defaultMessage: "ui.groupInfoWidget.privacy.private" })),
84
115
  react_1.default.createElement(material_1.Typography, { variant: "body2" },
85
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private.info", defaultMessage: "ui.groupForm.private.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } }))))),
116
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.privacy.private.info", defaultMessage: "ui.groupInfoWidget.private.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } }))))),
86
117
  scGroup.privacy === types_1.SCGroupPrivacyType.PRIVATE && (react_1.default.createElement(material_1.Typography, { component: "div", className: classes.visibility }, scGroup.visible ? (react_1.default.createElement(react_1.default.Fragment, null,
87
118
  react_1.default.createElement(material_1.Typography, { className: classes.visibilityTitle },
88
119
  react_1.default.createElement(material_1.Icon, null, "visibility"),
@@ -95,6 +126,8 @@ function GroupInfoWidget(inProps) {
95
126
  react_1.default.createElement(material_1.Typography, { variant: "body2" },
96
127
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.hidden.info", defaultMessage: "ui.groupForm.visibility.hidden.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })))))),
97
128
  react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.date },
98
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.date", defaultMessage: "ui.groupInfoWidget.date", values: { date: intl.formatDate(scGroup.created_at, { day: 'numeric', year: 'numeric', month: 'long' }) } })))));
129
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.date", defaultMessage: "ui.groupInfoWidget.date", values: { date: intl.formatDate(scGroup.created_at, { day: 'numeric', year: 'numeric', month: 'long' }) } })),
130
+ react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.admin },
131
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.admin", defaultMessage: "ui.groupInfoWidget.admin", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks), admin: scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by.username } })))));
99
132
  }
100
133
  exports.default = GroupInfoWidget;
@@ -15,6 +15,8 @@ const Autocomplete_1 = tslib_1.__importDefault(require("@mui/material/Autocomple
15
15
  const User_1 = tslib_1.__importDefault(require("../User"));
16
16
  const Errors_1 = require("../../constants/Errors");
17
17
  const utils_1 = require("@selfcommunity/utils");
18
+ const PubSub_1 = require("../../constants/PubSub");
19
+ const pubsub_js_1 = tslib_1.__importDefault(require("pubsub-js"));
18
20
  const messages = (0, react_intl_1.defineMessages)({
19
21
  placeholder: {
20
22
  id: 'ui.groupInviteButton.searchBar.placeholder',
@@ -86,16 +88,25 @@ function GroupInviteButton(inProps) {
86
88
  const [open, setOpen] = (0, react_1.useState)(false);
87
89
  const [isSending, setIsSending] = (0, react_1.useState)(false);
88
90
  const [value, setValue] = (0, react_1.useState)('');
89
- const [suggested, setSuggested] = (0, react_1.useState)([]);
90
91
  const [list, setList] = (0, react_1.useState)([]);
91
92
  const [loading, setLoading] = (0, react_1.useState)(false);
92
93
  const [invited, setInvited] = (0, react_1.useState)([]);
94
+ /**
95
+ * Notify UI when a member is invited to a group
96
+ * @param group
97
+ * @param usersInvited
98
+ */
99
+ function notifyChanges(group, usersInvited) {
100
+ if (group && usersInvited) {
101
+ pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.INVITE_MEMBER}`, usersInvited);
102
+ }
103
+ }
93
104
  function convertToInvitedUsersObject(data) {
94
- const invited_users = {};
105
+ const invite_users = {};
95
106
  data.forEach((user, index) => {
96
- invited_users[`invited_users[${index}]`] = user.id;
107
+ invite_users[`invite_users[${index}]`] = user.id;
97
108
  });
98
- return invited_users;
109
+ return invite_users;
99
110
  }
100
111
  /**
101
112
  * Memoized users invited ids
@@ -110,27 +121,22 @@ function GroupInviteButton(inProps) {
110
121
  }, [invited]);
111
122
  // HOOKS
112
123
  const { scGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
113
- const canEdit = (0, react_1.useMemo)(() => { var _a; return scUserContext.user && ((_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id) === scUserContext.user.id; }, [scUserContext.user, (_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id]);
124
+ const isGroupAdmin = (0, react_1.useMemo)(() => { var _a; return scUserContext.user && ((_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id) === scUserContext.user.id; }, [scUserContext.user, (_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id]);
114
125
  // INTL
115
126
  const intl = (0, react_intl_1.useIntl)();
116
127
  function fetchResults() {
117
128
  setLoading(true);
118
- api_services_1.GroupService.getGroupSuggestedUsers(scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value)
119
- .then((data) => {
120
- setLoading(false);
121
- setSuggested(data.results);
122
- })
123
- .catch((error) => {
124
- setLoading(false);
125
- utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
126
- });
127
- }
128
- function fetchGeneralResults() {
129
- setLoading(true);
130
- api_services_1.GroupService.getGroupsSuggestedUsers(value)
129
+ let service;
130
+ if (scGroup) {
131
+ service = api_services_1.GroupService.getGroupSuggestedUsers(scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value);
132
+ }
133
+ else {
134
+ service = api_services_1.GroupService.getGroupsSuggestedUsers(value);
135
+ }
136
+ service
131
137
  .then((data) => {
132
138
  setLoading(false);
133
- setSuggested(data.results);
139
+ setList(data.results);
134
140
  })
135
141
  .catch((error) => {
136
142
  setLoading(false);
@@ -138,28 +144,8 @@ function GroupInviteButton(inProps) {
138
144
  });
139
145
  }
140
146
  (0, react_1.useEffect)(() => {
141
- if (scGroup === null || scGroup === void 0 ? void 0 : scGroup.id) {
142
- api_services_1.GroupService.getGroupSuggestedUsers(scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value).then((data) => {
143
- setLoading(false);
144
- setList(data.results);
145
- });
146
- }
147
- else {
148
- api_services_1.GroupService.getGroupsSuggestedUsers(value).then((data) => {
149
- setLoading(false);
150
- setList(data.results);
151
- });
152
- }
153
- }, [scGroup === null || scGroup === void 0 ? void 0 : scGroup.id]);
154
- /**
155
- * If a value is entered in new message field, it fetches user suggested
156
- */
157
- (0, react_1.useEffect)(() => {
158
- if (value && !handleInvitations) {
159
- fetchResults();
160
- }
161
- fetchGeneralResults();
162
- }, [value, handleInvitations]);
147
+ fetchResults();
148
+ }, [scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value]);
163
149
  /**
164
150
  * Handles dialog close
165
151
  */
@@ -182,6 +168,7 @@ function GroupInviteButton(inProps) {
182
168
  setIsSending(false);
183
169
  setOpen(false);
184
170
  setInvited([]);
171
+ notifyChanges(scGroup, invited);
185
172
  })
186
173
  .catch((error) => {
187
174
  setOpen(false);
@@ -195,7 +182,7 @@ function GroupInviteButton(inProps) {
195
182
  switch (reason) {
196
183
  case 'input':
197
184
  setValue(value);
198
- !value && setSuggested([]);
185
+ !value && setList([]);
199
186
  break;
200
187
  case 'reset':
201
188
  setValue(value);
@@ -226,9 +213,9 @@ function GroupInviteButton(inProps) {
226
213
  setList((prev) => [...prev, option]);
227
214
  };
228
215
  /**
229
- * If there's no authUserId, component is hidden.
216
+ * If in group edit mode and logged-in user is not also the group manager, the component is hidden.
230
217
  // */
231
- if (!canEdit) {
218
+ if (group && !isGroupAdmin) {
232
219
  return null;
233
220
  }
234
221
  /**
@@ -242,10 +229,10 @@ function GroupInviteButton(inProps) {
242
229
  react_1.default.createElement(material_1.Icon, { fontSize: "medium" }, "arrow_back")),
243
230
  react_1.default.createElement(material_1.Typography, { className: classes.dialogTitle },
244
231
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInviteButton.dialog.title", defaultMessage: "ui.groupInviteButton.dialog.title" })),
245
- react_1.default.createElement(lab_1.LoadingButton, { size: "small", color: "secondary", variant: "contained", onClick: handleSendInvitations, loading: isSending },
232
+ react_1.default.createElement(lab_1.LoadingButton, { size: "small", color: "secondary", variant: "contained", onClick: handleSendInvitations, loading: isSending, disabled: !invited.length },
246
233
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInviteButton.dialog.button.end", defaultMessage: "ui.groupInviteButton.dialog.button.end" }))) },
247
234
  react_1.default.createElement(material_1.Box, { className: classes.dialogContent },
248
- react_1.default.createElement(Autocomplete_1.default, { className: classes.autocomplete, loading: loading, size: "small", multiple: true, freeSolo: true, disableClearable: true, options: suggested, onChange: handleChange, onInputChange: handleInputChange, inputValue: value, value: invited, getOptionLabel: (option) => (option ? option.username : '...'), isOptionEqualToValue: (option, value) => (option ? value.id === option.id : false), renderTags: () => null, renderOption: (props, option) => (react_1.default.createElement(material_1.Box, Object.assign({ component: "li" }, props),
235
+ react_1.default.createElement(Autocomplete_1.default, { className: classes.autocomplete, loading: loading, size: "small", multiple: true, freeSolo: true, disableClearable: true, options: list, onChange: handleChange, onInputChange: handleInputChange, inputValue: value, value: invited, getOptionLabel: (option) => (option ? option.username : '...'), isOptionEqualToValue: (option, value) => (option ? value.id === option.id : false), renderTags: () => null, renderOption: (props, option) => (react_1.default.createElement(material_1.Box, Object.assign({ component: "li" }, props),
249
236
  react_1.default.createElement(material_1.Avatar, { alt: option.username, src: option.avatar }),
250
237
  react_1.default.createElement(material_1.Typography, { ml: 1 }, option.username))), renderInput: (params) => (react_1.default.createElement(material_1.TextField, Object.assign({}, params, { variant: "outlined", placeholder: `${intl.formatMessage(messages.placeholder)}`, InputProps: Object.assign(Object.assign({}, params.InputProps), { className: classes.input, startAdornment: (react_1.default.createElement(react_1.default.Fragment, null,
251
238
  react_1.default.createElement(material_1.InputAdornment, { position: "start" },
@@ -0,0 +1,74 @@
1
+ import { WidgetProps } from '../Widget';
2
+ import { SCGroupType } from '@selfcommunity/types';
3
+ import { CacheStrategies } from '@selfcommunity/utils';
4
+ import { BaseDialogProps } from '../../shared/BaseDialog';
5
+ import { VirtualScrollerItemProps } from '../../types/virtualScroller';
6
+ import { UserProps } from '../User';
7
+ export interface GroupInvitedWidgetProps extends VirtualScrollerItemProps, WidgetProps {
8
+ /**
9
+ * Group Object
10
+ * @default null
11
+ */
12
+ group?: SCGroupType;
13
+ /**
14
+ * Id of the group
15
+ * @default null
16
+ */
17
+ groupId?: number | string;
18
+ /**
19
+ * Limit the number of users to show
20
+ * @default false
21
+ */
22
+ limit?: number;
23
+ /**
24
+ * Caching strategies
25
+ * @default CacheStrategies.CACHE_FIRST
26
+ */
27
+ cacheStrategy?: CacheStrategies;
28
+ /**
29
+ * Props to spread to single user object
30
+ * @default empty object
31
+ */
32
+ UserProps?: UserProps;
33
+ /**
34
+ * Props to spread to followers users dialog
35
+ * @default {}
36
+ */
37
+ DialogProps?: BaseDialogProps;
38
+ /**
39
+ * Other props
40
+ */
41
+ [p: string]: any;
42
+ }
43
+ /**
44
+ * > API documentation for the Community-JS Group Invited Widget component. Learn about the available props and the CSS API.
45
+ *
46
+ *
47
+ * This component renders the list of the follows of the given group.
48
+ * Take a look at our <strong>demo</strong> component [here](/docs/sdk/community-js/react-ui/Components/GroupRequests)
49
+
50
+ #### Import
51
+
52
+ ```jsx
53
+ import {GroupInvitedWidget} from '@selfcommunity/react-ui';
54
+ ```
55
+
56
+ #### Component Name
57
+
58
+ The name `SCGroupInvitedWidget` can be used when providing style overrides in the theme.
59
+
60
+
61
+ #### CSS
62
+
63
+ |Rule Name|Global class|Description|
64
+ |---|---|---|
65
+ |root|.SCGroupInvitedWidget-root|Styles applied to the root element.|
66
+ |title|.SCGroupInvitedWidget-title|Styles applied to the title element.|
67
+ |noResults|.SCGroupInvitedWidget-no-results|Styles applied to no results section.|
68
+ |showMore|.SCGroupInvitedWidget-show-more|Styles applied to show more button element.|
69
+ |dialogRoot|.SCGroupInvitedWidget-dialog-root|Styles applied to the dialog root element.|
70
+ |endMessage|.SCGroupInvitedWidget-end-message|Styles applied to the end message element.|
71
+
72
+ * @param inProps
73
+ */
74
+ export default function GroupInvitedWidget(inProps: GroupInvitedWidgetProps): JSX.Element;