@selfcommunity/react-ui 0.7.9-alpha.2 → 0.7.9-alpha.21

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 (155) hide show
  1. package/lib/cjs/components/BottomNavigation/BottomNavigation.js +3 -1
  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.d.ts +1 -1
  5. package/lib/cjs/components/Composer/Attributes/Attributes.js +9 -2
  6. package/lib/cjs/components/Composer/Composer.d.ts +2 -1
  7. package/lib/cjs/components/Composer/Composer.js +39 -12
  8. package/lib/cjs/components/Composer/Content/ContentDiscussion/ContentDiscussion.js +7 -3
  9. package/lib/cjs/components/Composer/Content/ContentPost/ContentPost.js +4 -3
  10. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +7 -1
  11. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +46 -12
  12. package/lib/cjs/components/CreateGroupButton/CreateGroupButton.d.ts +2 -2
  13. package/lib/cjs/components/CreateGroupButton/CreateGroupButton.js +5 -6
  14. package/lib/cjs/components/CustomAdv/CustomAdv.d.ts +4 -0
  15. package/lib/cjs/components/{CreateGroup/CreateGroup.d.ts → EditGroupButton/EditGroupButton.d.ts} +11 -16
  16. package/lib/cjs/components/EditGroupButton/EditGroupButton.js +61 -0
  17. package/lib/cjs/components/EditGroupButton/index.d.ts +3 -0
  18. package/lib/cjs/components/EditGroupButton/index.js +5 -0
  19. package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
  20. package/lib/cjs/components/FeedObject/FeedObject.js +23 -6
  21. package/lib/cjs/components/Group/Group.d.ts +4 -3
  22. package/lib/cjs/components/Group/Group.js +5 -4
  23. package/lib/cjs/components/Group/Skeleton.js +1 -1
  24. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.d.ts +49 -0
  25. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +101 -0
  26. package/lib/cjs/components/GroupAutocomplete/index.d.ts +3 -0
  27. package/lib/cjs/components/GroupAutocomplete/index.js +5 -0
  28. package/lib/cjs/components/GroupForm/GroupForm.d.ts +70 -0
  29. package/lib/cjs/components/GroupForm/GroupForm.js +239 -0
  30. package/lib/cjs/components/GroupForm/constants.d.ts +1 -0
  31. package/lib/cjs/components/{CreateGroup → GroupForm}/constants.js +1 -1
  32. package/lib/cjs/components/GroupForm/index.d.ts +3 -0
  33. package/lib/cjs/components/GroupForm/index.js +5 -0
  34. package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
  35. package/lib/cjs/components/GroupHeader/GroupHeader.js +21 -11
  36. package/lib/cjs/components/GroupHeader/Skeleton.d.ts +2 -4
  37. package/lib/cjs/components/GroupHeader/Skeleton.js +10 -10
  38. package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +8 -8
  39. package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +9 -6
  40. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  41. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +3 -2
  42. package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +37 -14
  43. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +0 -5
  44. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +17 -7
  45. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  46. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +132 -0
  47. package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
  48. package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
  49. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  50. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +26 -9
  51. package/lib/cjs/components/Groups/Groups.d.ts +65 -0
  52. package/lib/cjs/components/Groups/Groups.js +135 -0
  53. package/lib/cjs/components/Groups/Skeleton.d.ts +34 -0
  54. package/lib/cjs/components/Groups/Skeleton.js +45 -0
  55. package/lib/cjs/components/Groups/constants.d.ts +1 -0
  56. package/lib/cjs/components/Groups/constants.js +4 -0
  57. package/lib/cjs/components/Groups/index.d.ts +4 -0
  58. package/lib/cjs/components/Groups/index.js +8 -0
  59. package/lib/cjs/components/InlineComposerWidget/InlineComposerWidget.d.ts +2 -1
  60. package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  61. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.js +5 -1
  62. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
  63. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
  64. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  65. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +10 -7
  66. package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  67. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  68. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +24 -6
  69. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  70. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +45 -20
  71. package/lib/cjs/index.d.ts +7 -3
  72. package/lib/cjs/index.js +14 -4
  73. package/lib/esm/components/BottomNavigation/BottomNavigation.js +3 -1
  74. package/lib/esm/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  75. package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  76. package/lib/esm/components/Composer/Attributes/Attributes.d.ts +1 -1
  77. package/lib/esm/components/Composer/Attributes/Attributes.js +9 -2
  78. package/lib/esm/components/Composer/Composer.d.ts +2 -1
  79. package/lib/esm/components/Composer/Composer.js +39 -12
  80. package/lib/esm/components/Composer/Content/ContentDiscussion/ContentDiscussion.js +7 -3
  81. package/lib/esm/components/Composer/Content/ContentPost/ContentPost.js +4 -3
  82. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +7 -1
  83. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +45 -12
  84. package/lib/esm/components/CreateGroupButton/CreateGroupButton.d.ts +2 -2
  85. package/lib/esm/components/CreateGroupButton/CreateGroupButton.js +5 -6
  86. package/lib/esm/components/CustomAdv/CustomAdv.d.ts +4 -0
  87. package/lib/esm/components/{CreateGroup/CreateGroup.d.ts → EditGroupButton/EditGroupButton.d.ts} +11 -16
  88. package/lib/esm/components/EditGroupButton/EditGroupButton.js +58 -0
  89. package/lib/esm/components/EditGroupButton/index.d.ts +3 -0
  90. package/lib/esm/components/EditGroupButton/index.js +2 -0
  91. package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
  92. package/lib/esm/components/FeedObject/FeedObject.js +24 -7
  93. package/lib/esm/components/Group/Group.d.ts +4 -3
  94. package/lib/esm/components/Group/Group.js +5 -4
  95. package/lib/esm/components/Group/Skeleton.js +1 -1
  96. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.d.ts +49 -0
  97. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +99 -0
  98. package/lib/esm/components/GroupAutocomplete/index.d.ts +3 -0
  99. package/lib/esm/components/GroupAutocomplete/index.js +2 -0
  100. package/lib/esm/components/GroupForm/GroupForm.d.ts +70 -0
  101. package/lib/esm/components/GroupForm/GroupForm.js +236 -0
  102. package/lib/esm/components/GroupForm/constants.d.ts +1 -0
  103. package/lib/esm/components/GroupForm/constants.js +1 -0
  104. package/lib/esm/components/GroupForm/index.d.ts +3 -0
  105. package/lib/esm/components/GroupForm/index.js +2 -0
  106. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
  107. package/lib/esm/components/GroupHeader/GroupHeader.js +21 -11
  108. package/lib/esm/components/GroupHeader/Skeleton.d.ts +2 -4
  109. package/lib/esm/components/GroupHeader/Skeleton.js +10 -10
  110. package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +8 -8
  111. package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +9 -6
  112. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  113. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +4 -3
  114. package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +39 -16
  115. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +0 -5
  116. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +17 -7
  117. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  118. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +129 -0
  119. package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
  120. package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
  121. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  122. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +27 -10
  123. package/lib/esm/components/Groups/Groups.d.ts +65 -0
  124. package/lib/esm/components/Groups/Groups.js +132 -0
  125. package/lib/esm/components/Groups/Skeleton.d.ts +34 -0
  126. package/lib/esm/components/Groups/Skeleton.js +42 -0
  127. package/lib/esm/components/Groups/constants.d.ts +1 -0
  128. package/lib/esm/components/Groups/constants.js +1 -0
  129. package/lib/esm/components/Groups/index.d.ts +4 -0
  130. package/lib/esm/components/Groups/index.js +4 -0
  131. package/lib/esm/components/InlineComposerWidget/InlineComposerWidget.d.ts +2 -1
  132. package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  133. package/lib/esm/components/NavigationToolbar/NavigationToolbar.js +5 -1
  134. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
  135. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
  136. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  137. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +11 -8
  138. package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  139. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  140. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
  141. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  142. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +47 -22
  143. package/lib/esm/index.d.ts +7 -3
  144. package/lib/esm/index.js +8 -4
  145. package/lib/umd/react-ui.js +1 -1
  146. package/package.json +6 -6
  147. package/lib/cjs/components/CreateGroup/CreateGroup.js +0 -187
  148. package/lib/cjs/components/CreateGroup/constants.d.ts +0 -1
  149. package/lib/cjs/components/CreateGroup/index.d.ts +0 -3
  150. package/lib/cjs/components/CreateGroup/index.js +0 -5
  151. package/lib/esm/components/CreateGroup/CreateGroup.js +0 -184
  152. package/lib/esm/components/CreateGroup/constants.d.ts +0 -1
  153. package/lib/esm/components/CreateGroup/constants.js +0 -1
  154. package/lib/esm/components/CreateGroup/index.d.ts +0 -3
  155. package/lib/esm/components/CreateGroup/index.js +0 -2
@@ -73,25 +73,25 @@ export default function GroupInfoWidget(inProps) {
73
73
  React.createElement(Typography, { component: "div", className: classes.privacy }, scGroup.privacy === SCGroupPrivacyType.PUBLIC ? (React.createElement(React.Fragment, null,
74
74
  React.createElement(Typography, { className: classes.privacyTitle },
75
75
  React.createElement(Icon, null, "public"),
76
- React.createElement(FormattedMessage, { id: "ui.createGroup.privacy.public", defaultMessage: "ui.createGroup.privacy.public" })),
76
+ React.createElement(FormattedMessage, { id: "ui.groupForm.privacy.public", defaultMessage: "ui.groupForm.privacy.public" })),
77
77
  React.createElement(Typography, { variant: "body2" },
78
- React.createElement(FormattedMessage, { id: "ui.createGroup.privacy.public.info", defaultMessage: "ui.createGroup.privacy.public.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } })))) : (React.createElement(React.Fragment, null,
78
+ React.createElement(FormattedMessage, { id: "ui.groupForm.privacy.public.info", defaultMessage: "ui.groupForm.privacy.public.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } })))) : (React.createElement(React.Fragment, null,
79
79
  React.createElement(Typography, { className: classes.privacyTitle },
80
80
  React.createElement(Icon, null, "private"),
81
- React.createElement(FormattedMessage, { id: "ui.createGroup.privacy.private", defaultMessage: "ui.createGroup.privacy.private" })),
81
+ React.createElement(FormattedMessage, { id: "ui.groupForm.privacy.private", defaultMessage: "ui.groupForm.privacy.private" })),
82
82
  React.createElement(Typography, { variant: "body2" },
83
- React.createElement(FormattedMessage, { id: "ui.createGroup.privacy.private.info", defaultMessage: "ui.createGroup.private.public.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } }))))),
83
+ React.createElement(FormattedMessage, { id: "ui.groupForm.privacy.private.info", defaultMessage: "ui.groupForm.private.public.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } }))))),
84
84
  scGroup.privacy === SCGroupPrivacyType.PRIVATE && (React.createElement(Typography, { component: "div", className: classes.visibility }, scGroup.visible ? (React.createElement(React.Fragment, null,
85
85
  React.createElement(Typography, { className: classes.visibilityTitle },
86
86
  React.createElement(Icon, null, "visibility"),
87
- React.createElement(FormattedMessage, { id: "ui.createGroup.visibility.visible", defaultMessage: "ui.createGroup.visibility.visible" })),
87
+ React.createElement(FormattedMessage, { id: "ui.groupForm.visibility.visible", defaultMessage: "ui.groupForm.visibility.visible" })),
88
88
  React.createElement(Typography, { variant: "body2" },
89
- React.createElement(FormattedMessage, { id: "ui.createGroup.visibility.visible.info", defaultMessage: "ui.createGroup.visibility.visible.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } })))) : (React.createElement(React.Fragment, null,
89
+ React.createElement(FormattedMessage, { id: "ui.groupForm.visibility.visible.info", defaultMessage: "ui.groupForm.visibility.visible.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } })))) : (React.createElement(React.Fragment, null,
90
90
  React.createElement(Typography, { className: classes.visibilityTitle },
91
91
  React.createElement(Icon, null, "visibility_off"),
92
- React.createElement(FormattedMessage, { id: "ui.createGroup.visibility.hidden", defaultMessage: "ui.createGroup.visibility.hidden" })),
92
+ React.createElement(FormattedMessage, { id: "ui.groupForm.visibility.hidden", defaultMessage: "ui.groupForm.visibility.hidden" })),
93
93
  React.createElement(Typography, { variant: "body2" },
94
- React.createElement(FormattedMessage, { id: "ui.createGroup.visibility.hidden.info", defaultMessage: "ui.createGroup.visibility.hidden.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } })))))),
94
+ React.createElement(FormattedMessage, { id: "ui.groupForm.visibility.hidden.info", defaultMessage: "ui.groupForm.visibility.hidden.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } })))))),
95
95
  React.createElement(Typography, { variant: "body2", className: classes.date },
96
96
  React.createElement(FormattedMessage, { id: "ui.groupInfoWidget.date", defaultMessage: "ui.groupInfoWidget.date", values: { date: intl.formatDate(scGroup.created_at, { day: 'numeric', year: 'numeric', month: 'long' }) } })))));
97
97
  }
@@ -71,6 +71,7 @@ const DialogRoot = styled(BaseDialog, {
71
71
  * @param inProps
72
72
  */
73
73
  export default function GroupInviteButton(inProps) {
74
+ var _a;
74
75
  //PROPS
75
76
  const props = useThemeProps({
76
77
  props: inProps,
@@ -105,10 +106,9 @@ export default function GroupInviteButton(inProps) {
105
106
  }
106
107
  return [invited];
107
108
  }, [invited]);
108
- // CONST
109
- const authUserId = scUserContext.user ? scUserContext.user.id : null;
110
109
  // HOOKS
111
110
  const { scGroup } = useSCFetchGroup({ id: groupId, group });
111
+ const isGroupAdmin = 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]);
112
112
  // INTL
113
113
  const intl = useIntl();
114
114
  function fetchResults() {
@@ -178,8 +178,11 @@ export default function GroupInviteButton(inProps) {
178
178
  GroupService.inviteOrAcceptGroupRequest(scGroup.id, data)
179
179
  .then(() => {
180
180
  setIsSending(false);
181
+ setOpen(false);
182
+ setInvited([]);
181
183
  })
182
184
  .catch((error) => {
185
+ setOpen(false);
183
186
  setLoading(false);
184
187
  Logger.error(SCOPE_SC_UI, error);
185
188
  });
@@ -221,23 +224,23 @@ export default function GroupInviteButton(inProps) {
221
224
  setList((prev) => [...prev, option]);
222
225
  };
223
226
  /**
224
- * If there's no authUserId, component is hidden.
227
+ * If in group edit mode and logged-in user is not also the group manager, the component is hidden.
225
228
  // */
226
- if (!authUserId) {
229
+ if (group && !isGroupAdmin) {
227
230
  return null;
228
231
  }
229
232
  /**
230
233
  * Renders root object
231
234
  */
232
235
  return (React.createElement(React.Fragment, null,
233
- React.createElement(Root, Object.assign({ className: classNames(classes.root, className), onClick: handleClose, size: "small", variant: "outlined", startIcon: React.createElement(Icon, { fontSize: "small" }, "add") }, rest),
236
+ React.createElement(Root, Object.assign({ className: classNames(classes.root, className), onClick: handleClose, variant: scGroup ? 'contained' : 'outlined', color: scGroup ? 'secondary' : 'inherit', startIcon: React.createElement(Icon, { fontSize: "small" }, "add") }, rest),
234
237
  React.createElement(FormattedMessage, { id: "ui.groupInviteButton", defaultMessage: "ui.groupInviteButton" })),
235
238
  open && (React.createElement(DialogRoot, { DialogContentProps: { dividers: false }, open: true, className: classes.dialogRoot, title: React.createElement(React.Fragment, null,
236
239
  React.createElement(IconButton, { onClick: handleClose },
237
240
  React.createElement(Icon, { fontSize: "medium" }, "arrow_back")),
238
241
  React.createElement(Typography, { className: classes.dialogTitle },
239
242
  React.createElement(FormattedMessage, { id: "ui.groupInviteButton.dialog.title", defaultMessage: "ui.groupInviteButton.dialog.title" })),
240
- React.createElement(LoadingButton, { size: "small", color: "secondary", variant: "contained", onClick: handleSendInvitations, loading: isSending },
243
+ React.createElement(LoadingButton, { size: "small", color: "secondary", variant: "contained", onClick: handleSendInvitations, loading: isSending, disabled: !invited.length },
241
244
  React.createElement(FormattedMessage, { id: "ui.groupInviteButton.dialog.button.end", defaultMessage: "ui.groupInviteButton.dialog.button.end" }))) },
242
245
  React.createElement(Box, { className: classes.dialogContent },
243
246
  React.createElement(Autocomplete, { 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.createElement(Box, Object.assign({ component: "li" }, props),
@@ -17,6 +17,11 @@ export interface GroupMembersButtonProps extends Pick<ButtonProps, Exclude<keyof
17
17
  * @default {}
18
18
  */
19
19
  DialogProps?: BaseDialogProps;
20
+ /**
21
+ * Hides this component
22
+ * @default false
23
+ */
24
+ autoHide?: boolean;
20
25
  /**
21
26
  * Any other properties
22
27
  */
@@ -6,8 +6,9 @@ import BaseDialog from '../../shared/BaseDialog';
6
6
  import { FormattedMessage } from 'react-intl';
7
7
  import InfiniteScroll from '../../shared/InfiniteScroll';
8
8
  import User, { UserSkeleton } from '../User';
9
- import { GroupService, Endpoints, http } from '@selfcommunity/api-services';
9
+ import { Endpoints, GroupService, http } from '@selfcommunity/api-services';
10
10
  import { useSCFetchGroup } from '@selfcommunity/react-core';
11
+ import { SCGroupPrivacyType } from '@selfcommunity/types';
11
12
  import AvatarGroupSkeleton from '../Skeleton/AvatarGroupSkeleton';
12
13
  import classNames from 'classnames';
13
14
  import { useThemeProps } from '@mui/system';
@@ -58,7 +59,7 @@ export default function GroupMembersButton(inProps) {
58
59
  props: inProps,
59
60
  name: PREFIX
60
61
  });
61
- const { className, groupId, group, DialogProps = {} } = props, rest = __rest(props, ["className", "groupId", "group", "DialogProps"]);
62
+ const { className, groupId, group, DialogProps = {}, autoHide = false } = props, rest = __rest(props, ["className", "groupId", "group", "DialogProps", "autoHide"]);
62
63
  // STATE
63
64
  const [loading, setLoading] = useState(true);
64
65
  const [next, setNext] = useState(null);
@@ -69,7 +70,7 @@ export default function GroupMembersButton(inProps) {
69
70
  const { scGroup } = useSCFetchGroup({ id: groupId, group });
70
71
  // FETCH FIRST FOLLOWERS
71
72
  useDeepCompareEffectNoCheck(() => {
72
- if (!scGroup) {
73
+ if (!scGroup || (scGroup && scGroup.privacy !== SCGroupPrivacyType.PUBLIC && autoHide)) {
73
74
  return;
74
75
  }
75
76
  if (members.length === 0) {
@@ -2,11 +2,11 @@ import { __rest } from "tslib";
2
2
  import React, { useEffect, useMemo, useReducer, useState } from 'react';
3
3
  import { styled } from '@mui/material/styles';
4
4
  import List from '@mui/material/List';
5
- import { Button, CardContent, ListItem, Typography, useMediaQuery, useTheme } from '@mui/material';
5
+ import { Button, CardActions, CardContent, ListItem, Typography, useMediaQuery, useTheme } from '@mui/material';
6
6
  import Widget from '../Widget';
7
7
  import { http, Endpoints, GroupService } from '@selfcommunity/api-services';
8
8
  import { CacheStrategies, isInteger, Logger } from '@selfcommunity/utils';
9
- import { SCCache, SCPreferences, useSCFetchGroup, useSCPreferences, useSCUser } from '@selfcommunity/react-core';
9
+ import { Link, SCCache, SCPreferences, SCRoutes, useSCFetchGroup, useSCPreferences, useSCRouting, useSCUser } from '@selfcommunity/react-core';
10
10
  import { actionWidgetTypes, dataWidgetReducer, stateWidgetInitializer } from '../../utils/widget';
11
11
  import Skeleton from './Skeleton';
12
12
  import { FormattedMessage } from 'react-intl';
@@ -18,9 +18,12 @@ import { useThemeProps } from '@mui/system';
18
18
  import HiddenPlaceholder from '../../shared/HiddenPlaceholder';
19
19
  import { PREFIX } from './constants';
20
20
  import User, { UserSkeleton } from '../User';
21
+ import GroupInviteButton from '../GroupInviteButton';
22
+ import GroupSettingsIconButton from '../GroupSettingsIconButton';
21
23
  const classes = {
22
24
  root: `${PREFIX}-root`,
23
25
  title: `${PREFIX}-title`,
26
+ actions: `${PREFIX}-actions`,
24
27
  noResults: `${PREFIX}-no-results`,
25
28
  showMore: `${PREFIX}-show-more`,
26
29
  dialogRoot: `${PREFIX}-dialog-root`,
@@ -66,6 +69,7 @@ const DialogRoot = styled(BaseDialog, {
66
69
  * @param inProps
67
70
  */
68
71
  export default function GroupMembersWidget(inProps) {
72
+ var _a;
69
73
  // PROPS
70
74
  const props = useThemeProps({
71
75
  props: inProps,
@@ -83,8 +87,11 @@ export default function GroupMembersWidget(inProps) {
83
87
  const [openDialog, setOpenDialog] = useState(false);
84
88
  // CONTEXT
85
89
  const scUserContext = useSCUser();
90
+ const scRoutingContext = useSCRouting();
86
91
  const scPreferencesContext = useSCPreferences();
87
92
  const { scGroup } = useSCFetchGroup({ id: groupId, group });
93
+ // CONST
94
+ const isGroupAdmin = 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]);
88
95
  // MEMO
89
96
  const contentAvailability = useMemo(() => SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY in scPreferencesContext.preferences &&
90
97
  scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY].value, [scPreferencesContext.preferences]);
@@ -166,6 +173,14 @@ export default function GroupMembersWidget(inProps) {
166
173
  const handleToggleDialogOpen = () => {
167
174
  setOpenDialog((prev) => !prev);
168
175
  };
176
+ const handleRefresh = useMemo(() => (userId) => {
177
+ const newMembers = [...state.results];
178
+ const _updated = newMembers.filter((u) => u.id !== userId);
179
+ dispatch({
180
+ type: actionWidgetTypes.SET_RESULTS,
181
+ payload: { results: newMembers.length > 1 ? _updated : [] }
182
+ });
183
+ }, [dispatch, state.count, state.results]);
169
184
  // RENDER
170
185
  if ((autoHide && !state.count && state.initialized) || (!contentAvailability && !scUserContext.user) || !scGroup) {
171
186
  return React.createElement(HiddenPlaceholder, null);
@@ -173,19 +188,27 @@ export default function GroupMembersWidget(inProps) {
173
188
  if (!state.initialized) {
174
189
  return React.createElement(Skeleton, null);
175
190
  }
176
- const content = (React.createElement(CardContent, null,
177
- React.createElement(Typography, { className: classes.title, variant: "h5" },
178
- React.createElement(FormattedMessage, { id: "ui.groupMembersWidget.title", defaultMessage: "ui.groupMembersWidget.title" })),
179
- !state.count ? (React.createElement(Typography, { className: classes.noResults, variant: "body2" },
180
- React.createElement(FormattedMessage, { id: "ui.groupMembersWidget.subtitle.noResults", defaultMessage: "" }))) : (React.createElement(React.Fragment, null,
181
- React.createElement(List, null, state.results.slice(0, state.visibleItems).map((user) => (React.createElement(ListItem, { key: user.id },
182
- React.createElement(User, { elevation: 0, actions: React.createElement(React.Fragment, null), user: user, userId: user.id, buttonProps: { onClick: () => console.log(user) } }))))),
183
- state.count > state.visibleItems && (React.createElement(Button, { className: classes.showMore, onClick: handleToggleDialogOpen },
184
- React.createElement(FormattedMessage, { id: "ui.groupMembersWidget.button.showMore", defaultMessage: "ui.groupMembersWidget.button.showMore" }))))),
185
- openDialog && (React.createElement(DialogRoot, Object.assign({ className: classes.dialogRoot, title: React.createElement(FormattedMessage, { defaultMessage: "ui.groupMembersWidget.dialogTitle", id: "ui.groupMembersWidget.dialogTitle", values: { total: scGroup.subscribers_counter } }), onClose: handleToggleDialogOpen, open: openDialog }, DialogProps),
186
- React.createElement(InfiniteScroll, { dataLength: state.results.length, next: handleNext, hasMoreNext: Boolean(state.next), loaderNext: React.createElement(UserSkeleton, Object.assign({ elevation: 0 }, UserProps)), height: isMobile ? '100%' : 400, endMessage: React.createElement(Typography, { className: classes.endMessage },
187
- React.createElement(FormattedMessage, { id: "ui.groupMembersWidget.noMoreResults", defaultMessage: "ui.groupMembersWidget.noMoreResults" })) },
188
- React.createElement(List, null, state.results.map((user) => (React.createElement(ListItem, { key: user.id },
189
- React.createElement(User, { elevation: 0, actions: React.createElement(React.Fragment, null), user: user, userId: user.id, buttonProps: { onClick: () => console.log(user) } }))))))))));
191
+ const content = (React.createElement(React.Fragment, null,
192
+ React.createElement(CardContent, null,
193
+ React.createElement(Typography, { className: classes.title, variant: "h5" },
194
+ React.createElement(FormattedMessage, { id: "ui.groupMembersWidget.title", defaultMessage: "ui.groupMembersWidget.title" })),
195
+ !state.count ? (React.createElement(Typography, { className: classes.noResults, variant: "body2" },
196
+ React.createElement(FormattedMessage, { id: "ui.groupMembersWidget.subtitle.noResults", defaultMessage: "" }))) : (React.createElement(React.Fragment, null,
197
+ React.createElement(List, null, state.results.slice(0, state.visibleItems).map((user) => {
198
+ var _a;
199
+ return (React.createElement(ListItem, { key: user.id },
200
+ React.createElement(User, { elevation: 0, actions: isGroupAdmin ? (React.createElement(GroupSettingsIconButton, { group: scGroup, user: user, onRemoveSuccess: () => handleRefresh(user.id) })) : ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id) !== user.id ? (React.createElement(Button, { size: "small", variant: "outlined", component: Link, to: scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, user) },
201
+ React.createElement(FormattedMessage, { id: "ui.groupSettingsIconButton.item.message", defaultMessage: "ui.groupSettingsIconButton.item.message" }))) : null, user: user, userId: user.id })));
202
+ })),
203
+ state.count > state.visibleItems && (React.createElement(Button, { className: classes.showMore, onClick: handleToggleDialogOpen },
204
+ React.createElement(FormattedMessage, { id: "ui.groupMembersWidget.button.showMore", defaultMessage: "ui.groupMembersWidget.button.showMore" }))))),
205
+ openDialog && (React.createElement(DialogRoot, Object.assign({ className: classes.dialogRoot, title: React.createElement(FormattedMessage, { defaultMessage: "ui.groupMembersWidget.dialogTitle", id: "ui.groupMembersWidget.dialogTitle", values: { total: scGroup.subscribers_counter } }), onClose: handleToggleDialogOpen, open: openDialog }, DialogProps),
206
+ React.createElement(InfiniteScroll, { dataLength: state.results.length, next: handleNext, hasMoreNext: Boolean(state.next), loaderNext: React.createElement(UserSkeleton, Object.assign({ elevation: 0 }, UserProps)), height: isMobile ? '100%' : 400, endMessage: React.createElement(Typography, { className: classes.endMessage },
207
+ React.createElement(FormattedMessage, { id: "ui.groupMembersWidget.noMoreResults", defaultMessage: "ui.groupMembersWidget.noMoreResults" })) },
208
+ React.createElement(List, null, state.results.map((user) => (React.createElement(ListItem, { key: user.id },
209
+ React.createElement(User, { elevation: 0, actions: isGroupAdmin ? (React.createElement(GroupSettingsIconButton, { group: scGroup, user: user, onRemoveSuccess: () => handleRefresh(user.id) })) : (React.createElement(Button, null,
210
+ React.createElement(FormattedMessage, { id: "ui.groupSettingsIconButton.item.message", defaultMessage: "ui.groupSettingsIconButton.item.message" }))), user: user, userId: user.id }))))))))),
211
+ React.createElement(CardActions, { className: classes.actions },
212
+ React.createElement(GroupInviteButton, { groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, group: scGroup }))));
190
213
  return (React.createElement(Root, Object.assign({ className: classNames(classes.root, className) }, rest), content));
191
214
  }
@@ -15,11 +15,6 @@ export interface GroupRequestsWidgetProps extends VirtualScrollerItemProps, Widg
15
15
  * @default null
16
16
  */
17
17
  groupId?: number | string;
18
- /**
19
- * Hides this component
20
- * @default false
21
- */
22
- autoHide?: boolean;
23
18
  /**
24
19
  * Limit the number of users to show
25
20
  * @default false
@@ -18,6 +18,7 @@ import { useThemeProps } from '@mui/system';
18
18
  import HiddenPlaceholder from '../../shared/HiddenPlaceholder';
19
19
  import { PREFIX } from './constants';
20
20
  import User, { UserSkeleton } from '../User';
21
+ import GroupSubscribeButton from '../GroupSubscribeButton';
21
22
  const classes = {
22
23
  root: `${PREFIX}-root`,
23
24
  title: `${PREFIX}-title`,
@@ -66,12 +67,13 @@ const DialogRoot = styled(BaseDialog, {
66
67
  * @param inProps
67
68
  */
68
69
  export default function GroupRequestsWidget(inProps) {
70
+ var _a;
69
71
  // PROPS
70
72
  const props = useThemeProps({
71
73
  props: inProps,
72
74
  name: PREFIX
73
75
  });
74
- const { groupId, group, autoHide = false, limit = 5, className, cacheStrategy = CacheStrategies.NETWORK_ONLY, onHeightChange, onStateChange, UserProps = {}, DialogProps = {} } = props, rest = __rest(props, ["groupId", "group", "autoHide", "limit", "className", "cacheStrategy", "onHeightChange", "onStateChange", "UserProps", "DialogProps"]);
76
+ const { groupId, group, limit = 5, className, cacheStrategy = CacheStrategies.NETWORK_ONLY, onHeightChange, onStateChange, UserProps = {}, DialogProps = {} } = props, rest = __rest(props, ["groupId", "group", "limit", "className", "cacheStrategy", "onHeightChange", "onStateChange", "UserProps", "DialogProps"]);
75
77
  // STATE
76
78
  const [state, dispatch] = useReducer(dataWidgetReducer, {
77
79
  isLoadingNext: false,
@@ -91,6 +93,7 @@ export default function GroupRequestsWidget(inProps) {
91
93
  // HOOKS
92
94
  const theme = useTheme();
93
95
  const isMobile = useMediaQuery(theme.breakpoints.down('md'));
96
+ const isGroupAdmin = 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]);
94
97
  /**
95
98
  * Initialize component
96
99
  * Fetch data only if the component is not initialized and it is not loading data
@@ -166,8 +169,16 @@ export default function GroupRequestsWidget(inProps) {
166
169
  const handleToggleDialogOpen = () => {
167
170
  setOpenDialog((prev) => !prev);
168
171
  };
172
+ const handleSubscribeAction = useMemo(() => (userId) => {
173
+ const newRequests = [...state.results];
174
+ const _updated = newRequests.filter((u) => u.id !== userId);
175
+ dispatch({
176
+ type: actionWidgetTypes.SET_RESULTS,
177
+ payload: { results: newRequests.length > 1 ? _updated : [] }
178
+ });
179
+ }, [dispatch, state.count, state.results]);
169
180
  // RENDER
170
- if ((autoHide && !state.count && state.initialized) || (!contentAvailability && !scUserContext.user) || !scGroup) {
181
+ if ((!state.count && state.initialized) || !contentAvailability || !scGroup || !state.count || !state.results.length || !isGroupAdmin) {
171
182
  return React.createElement(HiddenPlaceholder, null);
172
183
  }
173
184
  if (!state.initialized) {
@@ -176,16 +187,15 @@ export default function GroupRequestsWidget(inProps) {
176
187
  const content = (React.createElement(CardContent, null,
177
188
  React.createElement(Typography, { className: classes.title, variant: "h5" },
178
189
  React.createElement(FormattedMessage, { id: "ui.groupRequestsWidget.title", defaultMessage: "ui.groupRequestsWidget.title" })),
179
- !state.count ? (React.createElement(Typography, { className: classes.noResults, variant: "body2" },
180
- React.createElement(FormattedMessage, { id: "ui.groupRequestsWidget.subtitle.noResults", defaultMessage: "" }))) : (React.createElement(React.Fragment, null,
190
+ React.createElement(React.Fragment, null,
181
191
  React.createElement(List, null, state.results.slice(0, state.visibleItems).map((user) => (React.createElement(ListItem, { key: user.id },
182
- React.createElement(User, { elevation: 0, actions: React.createElement(React.Fragment, null), user: user, userId: user.id, buttonProps: { onClick: () => console.log(user) } }))))),
192
+ React.createElement(User, { elevation: 0, actions: React.createElement(GroupSubscribeButton, { group: scGroup, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, user: user, onSubscribe: () => handleSubscribeAction(user.id) }), user: user, userId: user.id }))))),
183
193
  state.count > state.visibleItems && (React.createElement(Button, { className: classes.showMore, onClick: handleToggleDialogOpen },
184
- React.createElement(FormattedMessage, { id: "ui.groupRequestsWidget.button.showMore", defaultMessage: "ui.groupRequestsWidget.button.showMore" }))))),
194
+ React.createElement(FormattedMessage, { id: "ui.groupRequestsWidget.button.showMore", defaultMessage: "ui.groupRequestsWidget.button.showMore" })))),
185
195
  openDialog && (React.createElement(DialogRoot, Object.assign({ className: classes.dialogRoot, title: React.createElement(FormattedMessage, { defaultMessage: "ui.groupRequestsWidget.dialogTitle", id: "ui.groupRequestsWidget.dialogTitle", values: { total: scGroup.subscribers_counter } }), onClose: handleToggleDialogOpen, open: openDialog }, DialogProps),
186
196
  React.createElement(InfiniteScroll, { dataLength: state.results.length, next: handleNext, hasMoreNext: Boolean(state.next), loaderNext: React.createElement(UserSkeleton, Object.assign({ elevation: 0 }, UserProps)), height: isMobile ? '100%' : 400, endMessage: React.createElement(Typography, { className: classes.endMessage },
187
197
  React.createElement(FormattedMessage, { id: "ui.groupRequestsWidget.noMoreResults", defaultMessage: "ui.groupRequestsWidget.noMoreResults" })) },
188
198
  React.createElement(List, null, state.results.map((user) => (React.createElement(ListItem, { key: user.id },
189
- React.createElement(User, { elevation: 0, actions: React.createElement(React.Fragment, null), user: user, userId: user.id, buttonProps: { onClick: () => console.log(user) } }))))))))));
199
+ React.createElement(User, { elevation: 0, actions: React.createElement(GroupSubscribeButton, { group: scGroup, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, user: user, onSubscribe: () => handleSubscribeAction(user.id) }), user: user, userId: user.id }))))))))));
190
200
  return (React.createElement(Root, Object.assign({ className: classNames(classes.root, className) }, rest), content));
191
201
  }
@@ -0,0 +1,48 @@
1
+ import { IconButtonProps } from '@mui/material';
2
+ import { SCGroupType, SCUserType } from '@selfcommunity/types';
3
+ export interface GroupSettingsIconButtonProps extends IconButtonProps {
4
+ /**
5
+ * Overrides or extends the styles applied to the component.
6
+ * @default null
7
+ */
8
+ className?: string;
9
+ /**
10
+ * Handles callback on delete success
11
+ */
12
+ onRemoveSuccess?: () => void;
13
+ /**
14
+ * The user
15
+ */
16
+ user: SCUserType;
17
+ /**
18
+ * The group obj
19
+ */
20
+ group: SCGroupType;
21
+ /**
22
+ * Any other properties
23
+ */
24
+ [p: string]: any;
25
+ }
26
+ /**
27
+ * > API documentation for the Community-JS PrivateMessageSettingsIconButton component. Learn about the available props and the CSS API.
28
+
29
+ #### Import
30
+
31
+ ```jsx
32
+ import {PrivateMessageSettingsIconButton} from '@selfcommunity/react-ui';
33
+ ```
34
+
35
+ #### Component Name
36
+
37
+ The name `SCGroupSettingsIconButton` can be used when providing style overrides in the theme.
38
+
39
+
40
+ #### CSS
41
+
42
+ |Rule Name|Global class|Description|
43
+ |---|---|---|
44
+ |root|.SCGroupSettingsIconButton-root|Styles applied to the root element.|
45
+
46
+ * @param inProps
47
+ */
48
+ export default function GroupSettingsIconButton(inProps: GroupSettingsIconButtonProps): JSX.Element;
@@ -0,0 +1,129 @@
1
+ import { __rest } from "tslib";
2
+ import React, { useState } from 'react';
3
+ import { styled } from '@mui/material/styles';
4
+ import { SwipeableDrawer, MenuItem, IconButton, Menu, useTheme, useMediaQuery, List, ListItem } from '@mui/material';
5
+ import { FormattedMessage } from 'react-intl';
6
+ import Icon from '@mui/material/Icon';
7
+ import classNames from 'classnames';
8
+ import { useThemeProps } from '@mui/system';
9
+ import { Link, SCRoutes, useSCRouting, useSCUser } from '@selfcommunity/react-core';
10
+ import ConfirmDialog from '../../shared/ConfirmDialog/ConfirmDialog';
11
+ import { GroupService } from '@selfcommunity/api-services';
12
+ const PREFIX = 'SCGroupSettingsIconButton';
13
+ const classes = {
14
+ root: `${PREFIX}-root`,
15
+ drawerRoot: `${PREFIX}-drawer-root`,
16
+ menuRoot: `${PREFIX}-menu-root`,
17
+ paper: `${PREFIX}-paper`,
18
+ item: `${PREFIX}-item`
19
+ };
20
+ const Root = styled(IconButton, {
21
+ name: PREFIX,
22
+ slot: 'Root'
23
+ })(() => ({}));
24
+ const SwipeableDrawerRoot = styled(SwipeableDrawer, {
25
+ name: PREFIX,
26
+ slot: 'DrawerRoot'
27
+ })(() => ({}));
28
+ const MenuRoot = styled(Menu, {
29
+ name: PREFIX,
30
+ slot: 'MenuRoot'
31
+ })(() => ({}));
32
+ /**
33
+ * > API documentation for the Community-JS PrivateMessageSettingsIconButton component. Learn about the available props and the CSS API.
34
+
35
+ #### Import
36
+
37
+ ```jsx
38
+ import {PrivateMessageSettingsIconButton} from '@selfcommunity/react-ui';
39
+ ```
40
+
41
+ #### Component Name
42
+
43
+ The name `SCGroupSettingsIconButton` can be used when providing style overrides in the theme.
44
+
45
+
46
+ #### CSS
47
+
48
+ |Rule Name|Global class|Description|
49
+ |---|---|---|
50
+ |root|.SCGroupSettingsIconButton-root|Styles applied to the root element.|
51
+
52
+ * @param inProps
53
+ */
54
+ export default function GroupSettingsIconButton(inProps) {
55
+ // PROPS
56
+ const props = useThemeProps({
57
+ props: inProps,
58
+ name: PREFIX
59
+ });
60
+ const { className = null, group, user, onRemoveSuccess } = props, rest = __rest(props, ["className", "group", "user", "onRemoveSuccess"]);
61
+ // STATE
62
+ const [anchorEl, setAnchorEl] = useState(null);
63
+ const [openConfirmDialog, setOpenConfirmDialog] = useState(false);
64
+ // HOOKS
65
+ const theme = useTheme();
66
+ const isMobile = useMediaQuery(theme.breakpoints.down('md'));
67
+ const scRoutingContext = useSCRouting();
68
+ // CONTEXT
69
+ const scUserContext = useSCUser();
70
+ // HANDLERS
71
+ const handleOpen = (event) => {
72
+ setAnchorEl(event.currentTarget);
73
+ };
74
+ const handleClose = () => {
75
+ setAnchorEl(null);
76
+ };
77
+ const handleOpenDialog = () => {
78
+ setOpenConfirmDialog(true);
79
+ setAnchorEl(null);
80
+ };
81
+ const handleCloseDialog = () => {
82
+ setOpenConfirmDialog(false);
83
+ setAnchorEl(null);
84
+ onRemoveSuccess && onRemoveSuccess();
85
+ };
86
+ /**
87
+ * Handles thread deletion
88
+ */
89
+ function handleRemoveUser() {
90
+ GroupService.removeUserFromGroup(group.id, user.id)
91
+ .then(() => {
92
+ handleCloseDialog();
93
+ })
94
+ .catch((error) => {
95
+ setOpenConfirmDialog(false);
96
+ console.log(error);
97
+ });
98
+ }
99
+ if (scUserContext.user.id === user.id) {
100
+ return null;
101
+ }
102
+ /**
103
+ *
104
+ */
105
+ const renderList = () => {
106
+ if (isMobile) {
107
+ return [
108
+ React.createElement(ListItem, { className: classes.item, key: "message", component: Link, to: scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, user) },
109
+ React.createElement(FormattedMessage, { id: "ui.groupSettingsIconButton.item.message", defaultMessage: "ui.groupSettingsIconButton.item.message" })),
110
+ React.createElement(ListItem, { className: classes.item, key: "delete", onClick: handleOpenDialog },
111
+ React.createElement(FormattedMessage, { id: "ui.groupSettingsIconButton.item.remove", defaultMessage: "ui.groupSettingsIconButton.item.remove" }))
112
+ ];
113
+ }
114
+ else {
115
+ return [
116
+ React.createElement(MenuItem, { className: classes.item, component: Link, to: scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, user), key: "message" },
117
+ React.createElement(FormattedMessage, { id: "ui.groupSettingsIconButton.item.message", defaultMessage: "ui.groupSettingsIconButton.item.message" })),
118
+ React.createElement(MenuItem, { className: classes.item, onClick: handleOpenDialog, key: "delete" },
119
+ React.createElement(FormattedMessage, { id: "ui.groupSettingsIconButton.item.remove", defaultMessage: "ui.groupSettingsIconButton.item.remove" }))
120
+ ];
121
+ }
122
+ };
123
+ return (React.createElement(React.Fragment, null,
124
+ React.createElement(Root, Object.assign({ className: classNames(classes.root, className) }, rest, { onClick: handleOpen }),
125
+ React.createElement(Icon, null, "more_vert")),
126
+ isMobile ? (React.createElement(SwipeableDrawerRoot, { className: classes.drawerRoot, anchor: "bottom", open: Boolean(anchorEl), onClose: handleClose, onOpen: handleOpen, PaperProps: { className: classes.paper }, disableSwipeToOpen: true },
127
+ React.createElement(List, null, renderList()))) : (React.createElement(MenuRoot, { className: classes.menuRoot, anchorEl: anchorEl, open: Boolean(anchorEl), onClose: handleClose, PaperProps: { className: classes.paper } }, renderList())),
128
+ openConfirmDialog && (React.createElement(ConfirmDialog, { open: openConfirmDialog, title: React.createElement(FormattedMessage, { id: "ui.groupSettingsIconButton.dialog.msg", defaultMessage: "ui.groupSettingsIconButton.dialog.msg", values: { b: (...chunks) => React.createElement("strong", null, chunks), user: user.username, group: group.name } }), btnConfirm: React.createElement(FormattedMessage, { id: "ui.groupSettingsIconButton.dialog.confirm", defaultMessage: "ui.groupSettingsIconButton.dialog.confirm" }), onConfirm: handleRemoveUser, onClose: handleCloseDialog }))));
129
+ }
@@ -0,0 +1,3 @@
1
+ import GroupSettingsIconButton, { GroupSettingsIconButtonProps } from './GroupSettingsIconButton';
2
+ export default GroupSettingsIconButton;
3
+ export { GroupSettingsIconButtonProps };
@@ -0,0 +1,2 @@
1
+ import GroupSettingsIconButton from './GroupSettingsIconButton';
2
+ export default GroupSettingsIconButton;
@@ -1,4 +1,4 @@
1
- import { SCGroupType } from '@selfcommunity/types';
1
+ import { SCGroupType, SCUserType } from '@selfcommunity/types';
2
2
  export interface GroupSubscribeButtonProps {
3
3
  /**
4
4
  * Overrides or extends the styles applied to the component.
@@ -16,11 +16,16 @@ export interface GroupSubscribeButtonProps {
16
16
  */
17
17
  groupId?: number;
18
18
  /**
19
- * onJoin callback
19
+ * The user to be accepted into the group
20
+ * @default null
21
+ */
22
+ user?: SCUserType;
23
+ /**
24
+ * onSubscribe callback
20
25
  * @param user
21
26
  * @param joined
22
27
  */
23
- onJoin?: (group: SCGroupType, member: boolean) => any;
28
+ onSubscribe?: (group: SCGroupType, status: string | null) => any;
24
29
  /**
25
30
  * Others properties
26
31
  */