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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/lib/cjs/components/BottomNavigation/BottomNavigation.js +2 -2
  2. package/lib/cjs/components/CategoryHeader/Skeleton.js +3 -2
  3. package/lib/cjs/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  4. package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  5. package/lib/cjs/components/Composer/Attributes/Attributes.js +3 -3
  6. package/lib/cjs/components/Composer/Composer.js +3 -3
  7. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -1
  8. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +9 -19
  9. package/lib/cjs/components/FeedObject/Contributors/Contributors.js +1 -1
  10. package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
  11. package/lib/cjs/components/FeedObject/FeedObject.js +23 -6
  12. package/lib/cjs/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  13. package/lib/cjs/components/Group/Group.d.ts +8 -0
  14. package/lib/cjs/components/Group/Group.js +40 -5
  15. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
  16. package/lib/cjs/components/GroupForm/GroupForm.js +33 -10
  17. package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
  18. package/lib/cjs/components/GroupHeader/GroupHeader.js +53 -11
  19. package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +40 -7
  20. package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +33 -11
  21. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  22. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.js +221 -0
  23. package/lib/cjs/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  24. package/lib/cjs/components/GroupInvitedWidget/Skeleton.js +38 -0
  25. package/lib/cjs/components/GroupInvitedWidget/constants.d.ts +1 -0
  26. package/lib/cjs/components/GroupInvitedWidget/constants.js +4 -0
  27. package/lib/cjs/components/GroupInvitedWidget/index.d.ts +4 -0
  28. package/lib/cjs/components/GroupInvitedWidget/index.js +8 -0
  29. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  30. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +8 -3
  31. package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +25 -4
  32. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  33. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  34. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  35. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +145 -0
  36. package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
  37. package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
  38. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  39. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +30 -11
  40. package/lib/cjs/components/Groups/Groups.d.ts +19 -16
  41. package/lib/cjs/components/Groups/Groups.js +85 -86
  42. package/lib/cjs/components/Groups/Skeleton.d.ts +4 -0
  43. package/lib/cjs/components/Groups/Skeleton.js +2 -2
  44. package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  45. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.js +1 -1
  46. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +5 -0
  47. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +11 -4
  48. package/lib/cjs/components/Notification/Group/Group.d.ts +15 -0
  49. package/lib/cjs/components/Notification/Group/Group.js +78 -0
  50. package/lib/cjs/components/Notification/Group/index.d.ts +3 -0
  51. package/lib/cjs/components/Notification/Group/index.js +5 -0
  52. package/lib/cjs/components/Notification/Notification.js +31 -1
  53. package/lib/cjs/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  54. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  55. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +12 -7
  56. package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  57. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  58. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +24 -6
  59. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  60. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +45 -20
  61. package/lib/cjs/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +6 -0
  62. package/lib/cjs/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  63. package/lib/cjs/components/SnippetNotifications/SnippetNotifications.js +7 -0
  64. package/lib/cjs/components/ToastNotifications/ToastNotifications.js +7 -0
  65. package/lib/cjs/components/User/User.d.ts +6 -1
  66. package/lib/cjs/components/User/User.js +5 -4
  67. package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
  68. package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.js +46 -0
  69. package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
  70. package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +183 -0
  71. package/lib/cjs/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
  72. package/lib/cjs/components/UserSubscribedGroupsWidget/constants.js +4 -0
  73. package/lib/cjs/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
  74. package/lib/cjs/components/UserSubscribedGroupsWidget/index.js +8 -0
  75. package/lib/cjs/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
  76. package/lib/cjs/constants/PubSub.d.ts +28 -0
  77. package/lib/cjs/constants/PubSub.js +22 -0
  78. package/lib/cjs/index.d.ts +6 -2
  79. package/lib/cjs/index.js +15 -4
  80. package/lib/esm/components/BottomNavigation/BottomNavigation.js +2 -2
  81. package/lib/esm/components/CategoryHeader/Skeleton.js +3 -2
  82. package/lib/esm/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  83. package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  84. package/lib/esm/components/Composer/Attributes/Attributes.js +3 -3
  85. package/lib/esm/components/Composer/Composer.js +3 -3
  86. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -1
  87. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +9 -19
  88. package/lib/esm/components/FeedObject/Contributors/Contributors.js +1 -1
  89. package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
  90. package/lib/esm/components/FeedObject/FeedObject.js +24 -7
  91. package/lib/esm/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  92. package/lib/esm/components/Group/Group.d.ts +8 -0
  93. package/lib/esm/components/Group/Group.js +44 -9
  94. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
  95. package/lib/esm/components/GroupForm/GroupForm.js +33 -10
  96. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
  97. package/lib/esm/components/GroupHeader/GroupHeader.js +55 -13
  98. package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +40 -7
  99. package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +33 -11
  100. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  101. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.js +218 -0
  102. package/lib/esm/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  103. package/lib/esm/components/GroupInvitedWidget/Skeleton.js +34 -0
  104. package/lib/esm/components/GroupInvitedWidget/constants.d.ts +1 -0
  105. package/lib/esm/components/GroupInvitedWidget/constants.js +1 -0
  106. package/lib/esm/components/GroupInvitedWidget/index.d.ts +4 -0
  107. package/lib/esm/components/GroupInvitedWidget/index.js +4 -0
  108. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  109. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +9 -4
  110. package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +26 -5
  111. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  112. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  113. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  114. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +142 -0
  115. package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
  116. package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
  117. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  118. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +30 -11
  119. package/lib/esm/components/Groups/Groups.d.ts +19 -16
  120. package/lib/esm/components/Groups/Groups.js +90 -91
  121. package/lib/esm/components/Groups/Skeleton.d.ts +4 -0
  122. package/lib/esm/components/Groups/Skeleton.js +2 -2
  123. package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  124. package/lib/esm/components/NavigationToolbar/NavigationToolbar.js +1 -1
  125. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +5 -0
  126. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +13 -6
  127. package/lib/esm/components/Notification/Group/Group.d.ts +15 -0
  128. package/lib/esm/components/Notification/Group/Group.js +75 -0
  129. package/lib/esm/components/Notification/Group/index.d.ts +3 -0
  130. package/lib/esm/components/Notification/Group/index.js +2 -0
  131. package/lib/esm/components/Notification/Notification.js +31 -1
  132. package/lib/esm/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  133. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  134. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +13 -8
  135. package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  136. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  137. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
  138. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  139. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +47 -22
  140. package/lib/esm/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +7 -1
  141. package/lib/esm/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  142. package/lib/esm/components/SnippetNotifications/SnippetNotifications.js +7 -0
  143. package/lib/esm/components/ToastNotifications/ToastNotifications.js +7 -0
  144. package/lib/esm/components/User/User.d.ts +6 -1
  145. package/lib/esm/components/User/User.js +5 -4
  146. package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
  147. package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.js +42 -0
  148. package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
  149. package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +180 -0
  150. package/lib/esm/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
  151. package/lib/esm/components/UserSubscribedGroupsWidget/constants.js +1 -0
  152. package/lib/esm/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
  153. package/lib/esm/components/UserSubscribedGroupsWidget/index.js +4 -0
  154. package/lib/esm/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
  155. package/lib/esm/constants/PubSub.d.ts +28 -0
  156. package/lib/esm/constants/PubSub.js +19 -0
  157. package/lib/esm/index.d.ts +6 -2
  158. package/lib/esm/index.js +8 -4
  159. package/lib/umd/react-ui.js +1 -1
  160. package/package.json +6 -6
@@ -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',
@@ -90,6 +92,7 @@ const Root = (0, styles_1.styled)(BaseDialog_1.default, {
90
92
  * @param inProps
91
93
  */
92
94
  function GroupForm(inProps) {
95
+ var _a;
93
96
  //PROPS
94
97
  const props = (0, system_1.useThemeProps)({
95
98
  props: inProps,
@@ -142,6 +145,22 @@ function GroupForm(inProps) {
142
145
  setError(error);
143
146
  }
144
147
  }
148
+ /**
149
+ * Notify when a group info changed
150
+ * @param data
151
+ */
152
+ function notifyChanges(data) {
153
+ if (data) {
154
+ if (group) {
155
+ // Edit group
156
+ pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.EDIT}`, data);
157
+ }
158
+ else {
159
+ // Create group
160
+ pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.CREATE}`, data);
161
+ }
162
+ }
163
+ }
145
164
  const handleSubmit = () => {
146
165
  setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: true })));
147
166
  const formData = new FormData();
@@ -155,8 +174,10 @@ function GroupForm(inProps) {
155
174
  if (field.emotionalImageOriginalFile) {
156
175
  formData.append('emotional_image_original', field.emotionalImageOriginalFile);
157
176
  }
158
- for (const key in field.invitedUsers) {
159
- formData.append(key, field.invitedUsers[key]);
177
+ if (!group) {
178
+ for (const key in field.invitedUsers) {
179
+ formData.append(key, field.invitedUsers[key]);
180
+ }
160
181
  }
161
182
  let groupService;
162
183
  if (group) {
@@ -168,6 +189,7 @@ function GroupForm(inProps) {
168
189
  groupService
169
190
  .then((data) => {
170
191
  onSuccess && onSuccess(data);
192
+ notifyChanges(data);
171
193
  onClose && onClose();
172
194
  setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: false })));
173
195
  })
@@ -206,7 +228,7 @@ function GroupForm(inProps) {
206
228
  endAdornment: react_1.default.createElement(material_1.Typography, { variant: "body2" }, Group_1.GROUP_TITLE_MAX_LENGTH - field.name.length)
207
229
  } }),
208
230
  react_1.default.createElement(material_1.TextField, { multiline: true, className: classes.description, placeholder: `${intl.formatMessage(messages.description)}`, margin: "normal", value: field.description, name: "description", onChange: handleChange, InputProps: {
209
- endAdornment: react_1.default.createElement(material_1.Typography, { variant: "body2" }, Group_1.GROUP_DESCRIPTION_MAX_LENGTH - field.description.length)
231
+ endAdornment: (react_1.default.createElement(material_1.Typography, { variant: "body2" }, ((_a = field.description) === null || _a === void 0 ? void 0 : _a.length) ? Group_1.GROUP_DESCRIPTION_MAX_LENGTH - field.description.length : Group_1.GROUP_DESCRIPTION_MAX_LENGTH))
210
232
  } }),
211
233
  react_1.default.createElement(material_1.Box, { className: classes.privacySection },
212
234
  react_1.default.createElement(material_1.Typography, { variant: "h4" },
@@ -215,25 +237,26 @@ function GroupForm(inProps) {
215
237
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isPublic }) },
216
238
  react_1.default.createElement(material_1.Icon, null, "private"),
217
239
  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 }))) }),
240
+ 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
241
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: field.isPublic }) },
220
242
  react_1.default.createElement(material_1.Icon, null, "public"),
221
243
  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,
244
+ 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) } })))))),
245
+ 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
246
  react_1.default.createElement(material_1.Typography, { variant: "h4" },
225
247
  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
248
  react_1.default.createElement(material_1.Stack, { direction: "row", spacing: 1, alignItems: "center" },
227
249
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isVisible }) },
228
250
  react_1.default.createElement(material_1.Icon, null, "visibility_off"),
229
251
  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 }))) }),
252
+ 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
253
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: field.isVisible }) },
232
254
  react_1.default.createElement(material_1.Icon, null, "visibility"),
233
255
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.visible", defaultMessage: "ui.groupForm.visibility.visible" }))),
234
256
  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 })))));
257
+ !group && (react_1.default.createElement(react_1.default.Fragment, null,
258
+ react_1.default.createElement(material_1.Divider, null),
259
+ react_1.default.createElement(material_1.Box, { className: classes.inviteSection },
260
+ react_1.default.createElement(GroupInviteButton_1.default, { handleInvitations: handleInviteSection })))))));
238
261
  }
239
262
  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,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',
@@ -90,12 +92,22 @@ function GroupInviteButton(inProps) {
90
92
  const [list, setList] = (0, react_1.useState)([]);
91
93
  const [loading, setLoading] = (0, react_1.useState)(false);
92
94
  const [invited, setInvited] = (0, react_1.useState)([]);
95
+ /**
96
+ * Notify UI when a member is invited to a group
97
+ * @param group
98
+ * @param usersInvited
99
+ */
100
+ function notifyChanges(group, usersInvited) {
101
+ if (group && usersInvited) {
102
+ pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.INVITE_MEMBER}`, usersInvited);
103
+ }
104
+ }
93
105
  function convertToInvitedUsersObject(data) {
94
- const invited_users = {};
106
+ const invite_users = {};
95
107
  data.forEach((user, index) => {
96
- invited_users[`invited_users[${index}]`] = user.id;
108
+ invite_users[`invite_users[${index}]`] = user.id;
97
109
  });
98
- return invited_users;
110
+ return invite_users;
99
111
  }
100
112
  /**
101
113
  * Memoized users invited ids
@@ -110,7 +122,7 @@ function GroupInviteButton(inProps) {
110
122
  }, [invited]);
111
123
  // HOOKS
112
124
  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]);
125
+ 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
126
  // INTL
115
127
  const intl = (0, react_intl_1.useIntl)();
116
128
  function fetchResults() {
@@ -155,11 +167,13 @@ function GroupInviteButton(inProps) {
155
167
  * If a value is entered in new message field, it fetches user suggested
156
168
  */
157
169
  (0, react_1.useEffect)(() => {
158
- if (value && !handleInvitations) {
170
+ if (scGroup) {
159
171
  fetchResults();
160
172
  }
161
- fetchGeneralResults();
162
- }, [value, handleInvitations]);
173
+ else {
174
+ fetchGeneralResults();
175
+ }
176
+ }, [value, scGroup]);
163
177
  /**
164
178
  * Handles dialog close
165
179
  */
@@ -182,6 +196,7 @@ function GroupInviteButton(inProps) {
182
196
  setIsSending(false);
183
197
  setOpen(false);
184
198
  setInvited([]);
199
+ notifyChanges(scGroup, invited);
185
200
  })
186
201
  .catch((error) => {
187
202
  setOpen(false);
@@ -225,10 +240,17 @@ function GroupInviteButton(inProps) {
225
240
  setInvited(invited.filter((v) => v !== option));
226
241
  setList((prev) => [...prev, option]);
227
242
  };
243
+ const filterOptions = (options, { inputValue }) => {
244
+ return options.filter((option) => {
245
+ const usernameMatch = option.username.toLowerCase().includes(inputValue.toLowerCase());
246
+ const nameMatch = option.real_name.toLowerCase().includes(inputValue.toLowerCase());
247
+ return usernameMatch || nameMatch;
248
+ });
249
+ };
228
250
  /**
229
- * If there's no authUserId, component is hidden.
251
+ * If in group edit mode and logged-in user is not also the group manager, the component is hidden.
230
252
  // */
231
- if (!canEdit) {
253
+ if (group && !isGroupAdmin) {
232
254
  return null;
233
255
  }
234
256
  /**
@@ -242,10 +264,10 @@ function GroupInviteButton(inProps) {
242
264
  react_1.default.createElement(material_1.Icon, { fontSize: "medium" }, "arrow_back")),
243
265
  react_1.default.createElement(material_1.Typography, { className: classes.dialogTitle },
244
266
  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 },
267
+ react_1.default.createElement(lab_1.LoadingButton, { size: "small", color: "secondary", variant: "contained", onClick: handleSendInvitations, loading: isSending, disabled: !invited.length },
246
268
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInviteButton.dialog.button.end", defaultMessage: "ui.groupInviteButton.dialog.button.end" }))) },
247
269
  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),
270
+ 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, filterOptions: filterOptions, 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
271
  react_1.default.createElement(material_1.Avatar, { alt: option.username, src: option.avatar }),
250
272
  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
273
  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;