@selfcommunity/react-ui 0.7.9-alpha.8 → 0.7.9-alpha.9

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 (34) hide show
  1. package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
  2. package/lib/cjs/components/GroupHeader/GroupHeader.js +17 -9
  3. package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +2 -2
  4. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  5. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +3 -2
  6. package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +8 -2
  7. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +0 -5
  8. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +16 -7
  9. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +56 -0
  10. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +137 -0
  11. package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
  12. package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
  13. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +7 -2
  14. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +14 -11
  15. package/lib/cjs/index.d.ts +2 -1
  16. package/lib/cjs/index.js +3 -1
  17. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
  18. package/lib/esm/components/GroupHeader/GroupHeader.js +17 -9
  19. package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +2 -2
  20. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  21. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +4 -3
  22. package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +8 -2
  23. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +0 -5
  24. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +16 -7
  25. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +56 -0
  26. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +134 -0
  27. package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
  28. package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
  29. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +7 -2
  30. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +14 -11
  31. package/lib/esm/index.d.ts +2 -1
  32. package/lib/esm/index.js +2 -1
  33. package/lib/umd/react-ui.js +1 -1
  34. package/package.json +5 -5
@@ -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 category button followed
39
39
  * @default {}
40
40
  */
41
- GroupMembersButtonProps?: GroupMembersButtonProps;
41
+ GroupSubscribeButtonProps?: Pick<GroupSubscribeButtonProps, Exclude<keyof GroupSubscribeButtonProps, 'group' | 'onSubscribe'>>;
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,8 @@ 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"));
19
21
  const classes = {
20
22
  root: `${constants_1.PREFIX}-root`,
21
23
  cover: `${constants_1.PREFIX}-cover`,
@@ -72,7 +74,7 @@ function GroupHeader(inProps) {
72
74
  props: inProps,
73
75
  name: constants_1.PREFIX
74
76
  });
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"]);
77
+ 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
78
  // PREFERENCES
77
79
  const scPreferences = (0, react_core_1.useSCPreferences)();
78
80
  // CONTEXT
@@ -80,13 +82,13 @@ function GroupHeader(inProps) {
80
82
  // HOOKS
81
83
  const { scGroup, setSCGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
82
84
  // 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]);
85
+ 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
86
  /**
85
87
  * Handles Change Avatar
86
88
  * @param avatar
87
89
  */
88
90
  function handleChangeAvatar(avatar) {
89
- if (canEdit) {
91
+ if (isGroupAdmin) {
90
92
  setSCGroup(Object.assign({}, scGroup, { image_bigger: avatar }));
91
93
  }
92
94
  }
@@ -95,10 +97,16 @@ function GroupHeader(inProps) {
95
97
  * @param cover
96
98
  */
97
99
  function handleChangeCover(cover) {
98
- if (canEdit) {
100
+ if (isGroupAdmin) {
99
101
  setSCGroup(Object.assign({}, scGroup, { emotional_image: cover }));
100
102
  }
101
103
  }
104
+ /**
105
+ * Handles callback subscribe/unsubscribe group
106
+ */
107
+ const handleSubscribe = (group, status) => {
108
+ setSCGroup(Object.assign(Object.assign({}, group), { subscribers_counter: group.subscribers_counter + (status ? 1 : -1) }));
109
+ };
102
110
  // RENDER
103
111
  if (!scGroup) {
104
112
  return react_1.default.createElement(Skeleton_1.default, null);
@@ -111,12 +119,12 @@ function GroupHeader(inProps) {
111
119
  react_1.default.createElement(material_1.Box, { className: classes.avatar },
112
120
  react_1.default.createElement(material_1.Avatar, null,
113
121
  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,
122
+ isGroupAdmin && (react_1.default.createElement(react_1.default.Fragment, null,
115
123
  react_1.default.createElement(ChangeGroupPicture_1.default, Object.assign({ groupId: scGroup.id, onChange: handleChangeAvatar, className: classes.changePicture }, ChangePictureProps)),
116
124
  react_1.default.createElement("div", { className: classes.changeCover },
117
125
  react_1.default.createElement(ChangeGroupCover_1.default, Object.assign({ groupId: scGroup.id, onChange: handleChangeCover }, ChangeCoverProps)))))),
118
126
  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) }),
127
+ isGroupAdmin && react_1.default.createElement(EditGroupButton_1.default, { group: scGroup, groupId: scGroup.id, onEditSuccess: (data) => setSCGroup(data) }),
120
128
  react_1.default.createElement(material_1.Typography, { variant: "h5", className: classes.name }, scGroup.name),
121
129
  react_1.default.createElement(material_1.Box, { className: classes.visibility },
122
130
  scGroup.privacy === types_1.SCGroupPrivacyType.PUBLIC ? (react_1.default.createElement(material_1.Typography, { className: classes.visibilityItem },
@@ -130,10 +138,10 @@ function GroupHeader(inProps) {
130
138
  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
139
  react_1.default.createElement(material_1.Icon, null, "visibility_off"),
132
140
  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 },
141
+ react_1.default.createElement(react_1.default.Fragment, null, ((scGroup && scGroup.privacy === types_1.SCGroupPrivacyType.PUBLIC) || isGroupAdmin) && (react_1.default.createElement(material_1.Box, { className: classes.members },
134
142
  react_1.default.createElement(material_1.Typography, { className: classes.membersCounter, component: "div" },
135
143
  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)));
144
+ react_1.default.createElement(GroupMembersButton_1.default, Object.assign({ groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, group: scGroup, autoHide: !isGroupAdmin }, GroupMembersButtonProps))))),
145
+ 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
146
  }
139
147
  exports.default = GroupHeader;
@@ -110,7 +110,7 @@ function GroupInviteButton(inProps) {
110
110
  }, [invited]);
111
111
  // HOOKS
112
112
  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]);
113
+ 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
114
  // INTL
115
115
  const intl = (0, react_intl_1.useIntl)();
116
116
  function fetchResults() {
@@ -228,7 +228,7 @@ function GroupInviteButton(inProps) {
228
228
  /**
229
229
  * If in group edit mode and logged-in user is not also the group manager, the component is hidden.
230
230
  // */
231
- if (group && !canEdit) {
231
+ if (group && !isGroupAdmin) {
232
232
  return null;
233
233
  }
234
234
  /**
@@ -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
  */
@@ -10,6 +10,7 @@ const InfiniteScroll_1 = tslib_1.__importDefault(require("../../shared/InfiniteS
10
10
  const User_1 = tslib_1.__importStar(require("../User"));
11
11
  const api_services_1 = require("@selfcommunity/api-services");
12
12
  const react_core_1 = require("@selfcommunity/react-core");
13
+ const types_1 = require("@selfcommunity/types");
13
14
  const AvatarGroupSkeleton_1 = tslib_1.__importDefault(require("../Skeleton/AvatarGroupSkeleton"));
14
15
  const classnames_1 = tslib_1.__importDefault(require("classnames"));
15
16
  const system_1 = require("@mui/system");
@@ -60,7 +61,7 @@ function GroupMembersButton(inProps) {
60
61
  props: inProps,
61
62
  name: PREFIX
62
63
  });
63
- const { className, groupId, group, DialogProps = {} } = props, rest = tslib_1.__rest(props, ["className", "groupId", "group", "DialogProps"]);
64
+ const { className, groupId, group, DialogProps = {}, autoHide = false } = props, rest = tslib_1.__rest(props, ["className", "groupId", "group", "DialogProps", "autoHide"]);
64
65
  // STATE
65
66
  const [loading, setLoading] = (0, react_1.useState)(true);
66
67
  const [next, setNext] = (0, react_1.useState)(null);
@@ -71,7 +72,7 @@ function GroupMembersButton(inProps) {
71
72
  const { scGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
72
73
  // FETCH FIRST FOLLOWERS
73
74
  (0, use_deep_compare_effect_1.useDeepCompareEffectNoCheck)(() => {
74
- if (!scGroup) {
75
+ if (!scGroup || (scGroup && scGroup.privacy !== types_1.SCGroupPrivacyType.PUBLIC && autoHide)) {
75
76
  return;
76
77
  }
77
78
  if (members.length === 0) {
@@ -21,6 +21,7 @@ const HiddenPlaceholder_1 = tslib_1.__importDefault(require("../../shared/Hidden
21
21
  const constants_1 = require("./constants");
22
22
  const User_1 = tslib_1.__importStar(require("../User"));
23
23
  const GroupInviteButton_1 = tslib_1.__importDefault(require("../GroupInviteButton"));
24
+ const GroupSettingsIconButton_1 = tslib_1.__importDefault(require("../GroupSettingsIconButton"));
24
25
  const classes = {
25
26
  root: `${constants_1.PREFIX}-root`,
26
27
  title: `${constants_1.PREFIX}-title`,
@@ -70,6 +71,7 @@ const DialogRoot = (0, styles_1.styled)(BaseDialog_1.default, {
70
71
  * @param inProps
71
72
  */
72
73
  function GroupMembersWidget(inProps) {
74
+ var _a;
73
75
  // PROPS
74
76
  const props = (0, system_1.useThemeProps)({
75
77
  props: inProps,
@@ -89,6 +91,8 @@ function GroupMembersWidget(inProps) {
89
91
  const scUserContext = (0, react_core_1.useSCUser)();
90
92
  const scPreferencesContext = (0, react_core_1.useSCPreferences)();
91
93
  const { scGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
94
+ // CONST
95
+ 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]);
92
96
  // MEMO
93
97
  const contentAvailability = (0, react_1.useMemo)(() => react_core_1.SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY in scPreferencesContext.preferences &&
94
98
  scPreferencesContext.preferences[react_core_1.SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY].value, [scPreferencesContext.preferences]);
@@ -184,14 +188,16 @@ function GroupMembersWidget(inProps) {
184
188
  !state.count ? (react_1.default.createElement(material_1.Typography, { className: classes.noResults, variant: "body2" },
185
189
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupMembersWidget.subtitle.noResults", defaultMessage: "" }))) : (react_1.default.createElement(react_1.default.Fragment, null,
186
190
  react_1.default.createElement(List_1.default, null, state.results.slice(0, state.visibleItems).map((user) => (react_1.default.createElement(material_1.ListItem, { key: user.id },
187
- react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(react_1.default.Fragment, null), user: user, userId: user.id, buttonProps: { onClick: () => console.log(user) } }))))),
191
+ react_1.default.createElement(User_1.default, { elevation: 0, actions: isGroupAdmin ? (react_1.default.createElement(GroupSettingsIconButton_1.default, { group: scGroup, user: user })) : (react_1.default.createElement(material_1.Button, null,
192
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSettingsIconButton.item.message", defaultMessage: "ui.groupSettingsIconButton.item.message" }))), user: user, userId: user.id }))))),
188
193
  state.count > state.visibleItems && (react_1.default.createElement(material_1.Button, { className: classes.showMore, onClick: handleToggleDialogOpen },
189
194
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupMembersWidget.button.showMore", defaultMessage: "ui.groupMembersWidget.button.showMore" }))))),
190
195
  openDialog && (react_1.default.createElement(DialogRoot, Object.assign({ className: classes.dialogRoot, title: react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupMembersWidget.dialogTitle", id: "ui.groupMembersWidget.dialogTitle", values: { total: scGroup.subscribers_counter } }), onClose: handleToggleDialogOpen, open: openDialog }, DialogProps),
191
196
  react_1.default.createElement(InfiniteScroll_1.default, { dataLength: state.results.length, next: handleNext, hasMoreNext: Boolean(state.next), loaderNext: react_1.default.createElement(User_1.UserSkeleton, Object.assign({ elevation: 0 }, UserProps)), height: isMobile ? '100%' : 400, endMessage: react_1.default.createElement(material_1.Typography, { className: classes.endMessage },
192
197
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupMembersWidget.noMoreResults", defaultMessage: "ui.groupMembersWidget.noMoreResults" })) },
193
198
  react_1.default.createElement(List_1.default, null, state.results.map((user) => (react_1.default.createElement(material_1.ListItem, { key: user.id },
194
- react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(react_1.default.Fragment, null), user: user, userId: user.id, buttonProps: { onClick: () => console.log(user) } }))))))))),
199
+ react_1.default.createElement(User_1.default, { elevation: 0, actions: isGroupAdmin ? (react_1.default.createElement(GroupSettingsIconButton_1.default, { group: scGroup, user: user })) : (react_1.default.createElement(material_1.Button, null,
200
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSettingsIconButton.item.message", defaultMessage: "ui.groupSettingsIconButton.item.message" }))), user: user, userId: user.id }))))))))),
195
201
  react_1.default.createElement(material_1.CardActions, { className: classes.actions },
196
202
  react_1.default.createElement(GroupInviteButton_1.default, { groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, group: scGroup }))));
197
203
  return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, rest), content));
@@ -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
@@ -20,6 +20,7 @@ const system_1 = require("@mui/system");
20
20
  const HiddenPlaceholder_1 = tslib_1.__importDefault(require("../../shared/HiddenPlaceholder"));
21
21
  const constants_1 = require("./constants");
22
22
  const User_1 = tslib_1.__importStar(require("../User"));
23
+ const GroupSubscribeButton_1 = tslib_1.__importDefault(require("../GroupSubscribeButton"));
23
24
  const classes = {
24
25
  root: `${constants_1.PREFIX}-root`,
25
26
  title: `${constants_1.PREFIX}-title`,
@@ -68,12 +69,13 @@ const DialogRoot = (0, styles_1.styled)(BaseDialog_1.default, {
68
69
  * @param inProps
69
70
  */
70
71
  function GroupRequestsWidget(inProps) {
72
+ var _a;
71
73
  // PROPS
72
74
  const props = (0, system_1.useThemeProps)({
73
75
  props: inProps,
74
76
  name: constants_1.PREFIX
75
77
  });
76
- const { groupId, group, autoHide = false, limit = 5, className, cacheStrategy = utils_1.CacheStrategies.NETWORK_ONLY, onHeightChange, onStateChange, UserProps = {}, DialogProps = {} } = props, rest = tslib_1.__rest(props, ["groupId", "group", "autoHide", "limit", "className", "cacheStrategy", "onHeightChange", "onStateChange", "UserProps", "DialogProps"]);
78
+ const { groupId, group, limit = 5, className, cacheStrategy = utils_1.CacheStrategies.NETWORK_ONLY, onHeightChange, onStateChange, UserProps = {}, DialogProps = {} } = props, rest = tslib_1.__rest(props, ["groupId", "group", "limit", "className", "cacheStrategy", "onHeightChange", "onStateChange", "UserProps", "DialogProps"]);
77
79
  // STATE
78
80
  const [state, dispatch] = (0, react_1.useReducer)(widget_1.dataWidgetReducer, {
79
81
  isLoadingNext: false,
@@ -93,6 +95,7 @@ function GroupRequestsWidget(inProps) {
93
95
  // HOOKS
94
96
  const theme = (0, material_1.useTheme)();
95
97
  const isMobile = (0, material_1.useMediaQuery)(theme.breakpoints.down('md'));
98
+ 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]);
96
99
  /**
97
100
  * Initialize component
98
101
  * Fetch data only if the component is not initialized and it is not loading data
@@ -168,8 +171,15 @@ function GroupRequestsWidget(inProps) {
168
171
  const handleToggleDialogOpen = () => {
169
172
  setOpenDialog((prev) => !prev);
170
173
  };
174
+ const handleSubscribeAction = (0, react_1.useMemo)(() => (userId) => {
175
+ const newRequests = [...state.results];
176
+ const index = newRequests.findIndex((u) => u.id === userId);
177
+ if (index !== -1) {
178
+ dispatch({ type: widget_1.actionWidgetTypes.SET_RESULTS, payload: { results: newRequests } });
179
+ }
180
+ }, [dispatch, state.count, state.results]);
171
181
  // RENDER
172
- if ((autoHide && !state.count && state.initialized) || (!contentAvailability && !scUserContext.user) || !scGroup) {
182
+ if ((!state.count && state.initialized) || (!contentAvailability && !isGroupAdmin) || !scGroup || !state.count) {
173
183
  return react_1.default.createElement(HiddenPlaceholder_1.default, null);
174
184
  }
175
185
  if (!state.initialized) {
@@ -178,17 +188,16 @@ function GroupRequestsWidget(inProps) {
178
188
  const content = (react_1.default.createElement(material_1.CardContent, null,
179
189
  react_1.default.createElement(material_1.Typography, { className: classes.title, variant: "h5" },
180
190
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupRequestsWidget.title", defaultMessage: "ui.groupRequestsWidget.title" })),
181
- !state.count ? (react_1.default.createElement(material_1.Typography, { className: classes.noResults, variant: "body2" },
182
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupRequestsWidget.subtitle.noResults", defaultMessage: "" }))) : (react_1.default.createElement(react_1.default.Fragment, null,
191
+ react_1.default.createElement(react_1.default.Fragment, null,
183
192
  react_1.default.createElement(List_1.default, null, state.results.slice(0, state.visibleItems).map((user) => (react_1.default.createElement(material_1.ListItem, { key: user.id },
184
- react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(react_1.default.Fragment, null), user: user, userId: user.id, buttonProps: { onClick: () => console.log(user) } }))))),
193
+ react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(GroupSubscribeButton_1.default, { group: scGroup, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, userId: user.id, onSubscribe: () => handleSubscribeAction(user.id) }), user: user, userId: user.id }))))),
185
194
  state.count > state.visibleItems && (react_1.default.createElement(material_1.Button, { className: classes.showMore, onClick: handleToggleDialogOpen },
186
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupRequestsWidget.button.showMore", defaultMessage: "ui.groupRequestsWidget.button.showMore" }))))),
195
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupRequestsWidget.button.showMore", defaultMessage: "ui.groupRequestsWidget.button.showMore" })))),
187
196
  openDialog && (react_1.default.createElement(DialogRoot, Object.assign({ className: classes.dialogRoot, title: react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupRequestsWidget.dialogTitle", id: "ui.groupRequestsWidget.dialogTitle", values: { total: scGroup.subscribers_counter } }), onClose: handleToggleDialogOpen, open: openDialog }, DialogProps),
188
197
  react_1.default.createElement(InfiniteScroll_1.default, { dataLength: state.results.length, next: handleNext, hasMoreNext: Boolean(state.next), loaderNext: react_1.default.createElement(User_1.UserSkeleton, Object.assign({ elevation: 0 }, UserProps)), height: isMobile ? '100%' : 400, endMessage: react_1.default.createElement(material_1.Typography, { className: classes.endMessage },
189
198
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupRequestsWidget.noMoreResults", defaultMessage: "ui.groupRequestsWidget.noMoreResults" })) },
190
199
  react_1.default.createElement(List_1.default, null, state.results.map((user) => (react_1.default.createElement(material_1.ListItem, { key: user.id },
191
- react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(react_1.default.Fragment, null), user: user, userId: user.id, buttonProps: { onClick: () => console.log(user) } }))))))))));
200
+ react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(GroupSubscribeButton_1.default, { group: scGroup, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, userId: user.id }), user: user, userId: user.id }))))))))));
192
201
  return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, rest), content));
193
202
  }
194
203
  exports.default = GroupRequestsWidget;
@@ -0,0 +1,56 @@
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 menu item delete click
11
+ */
12
+ onMenuItemRemoveClick?: () => void;
13
+ /**
14
+ * Handles callback on delete confirm
15
+ */
16
+ onItemRemoveConfirm?: () => void;
17
+ /**
18
+ * The deleting thread id
19
+ */
20
+ userToRemove?: any;
21
+ /**
22
+ * The user
23
+ */
24
+ user?: SCUserType;
25
+ /**
26
+ * The group obj
27
+ */
28
+ group?: SCGroupType;
29
+ /**
30
+ * Any other properties
31
+ */
32
+ [p: string]: any;
33
+ }
34
+ /**
35
+ * > API documentation for the Community-JS PrivateMessageSettingsIconButton component. Learn about the available props and the CSS API.
36
+
37
+ #### Import
38
+
39
+ ```jsx
40
+ import {PrivateMessageSettingsIconButton} from '@selfcommunity/react-ui';
41
+ ```
42
+
43
+ #### Component Name
44
+
45
+ The name `SCGroupSettingsIconButton` can be used when providing style overrides in the theme.
46
+
47
+
48
+ #### CSS
49
+
50
+ |Rule Name|Global class|Description|
51
+ |---|---|---|
52
+ |root|.SCGroupSettingsIconButton-root|Styles applied to the root element.|
53
+
54
+ * @param inProps
55
+ */
56
+ export default function GroupSettingsIconButton(inProps: GroupSettingsIconButtonProps): JSX.Element;
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importStar(require("react"));
5
+ const styles_1 = require("@mui/material/styles");
6
+ const material_1 = require("@mui/material");
7
+ const react_intl_1 = require("react-intl");
8
+ const Icon_1 = tslib_1.__importDefault(require("@mui/material/Icon"));
9
+ const classnames_1 = tslib_1.__importDefault(require("classnames"));
10
+ const system_1 = require("@mui/system");
11
+ const react_core_1 = require("@selfcommunity/react-core");
12
+ const ConfirmDialog_1 = tslib_1.__importDefault(require("../../shared/ConfirmDialog/ConfirmDialog"));
13
+ const PREFIX = 'SCGroupSettingsIconButton';
14
+ const classes = {
15
+ root: `${PREFIX}-root`,
16
+ drawerRoot: `${PREFIX}-drawer-root`,
17
+ menuRoot: `${PREFIX}-menu-root`,
18
+ paper: `${PREFIX}-paper`,
19
+ item: `${PREFIX}-item`
20
+ };
21
+ const Root = (0, styles_1.styled)(material_1.IconButton, {
22
+ name: PREFIX,
23
+ slot: 'Root'
24
+ })(() => ({}));
25
+ const SwipeableDrawerRoot = (0, styles_1.styled)(material_1.SwipeableDrawer, {
26
+ name: PREFIX,
27
+ slot: 'DrawerRoot'
28
+ })(() => ({}));
29
+ const MenuRoot = (0, styles_1.styled)(material_1.Menu, {
30
+ name: PREFIX,
31
+ slot: 'MenuRoot'
32
+ })(() => ({}));
33
+ /**
34
+ * > API documentation for the Community-JS PrivateMessageSettingsIconButton component. Learn about the available props and the CSS API.
35
+
36
+ #### Import
37
+
38
+ ```jsx
39
+ import {PrivateMessageSettingsIconButton} from '@selfcommunity/react-ui';
40
+ ```
41
+
42
+ #### Component Name
43
+
44
+ The name `SCGroupSettingsIconButton` can be used when providing style overrides in the theme.
45
+
46
+
47
+ #### CSS
48
+
49
+ |Rule Name|Global class|Description|
50
+ |---|---|---|
51
+ |root|.SCGroupSettingsIconButton-root|Styles applied to the root element.|
52
+
53
+ * @param inProps
54
+ */
55
+ function GroupSettingsIconButton(inProps) {
56
+ // PROPS
57
+ const props = (0, system_1.useThemeProps)({
58
+ props: inProps,
59
+ name: PREFIX
60
+ });
61
+ const { className = null, onMenuItemRemoveClick, group, user, onItemRemoveConfirm, userToRemove } = props, rest = tslib_1.__rest(props, ["className", "onMenuItemRemoveClick", "group", "user", "onItemRemoveConfirm", "userToRemove"]);
62
+ // STATE
63
+ const [anchorEl, setAnchorEl] = (0, react_1.useState)(null);
64
+ const [openConfirmDialog, setOpenConfirmDialog] = (0, react_1.useState)(false);
65
+ // HOOKS
66
+ const theme = (0, material_1.useTheme)();
67
+ const isMobile = (0, material_1.useMediaQuery)(theme.breakpoints.down('md'));
68
+ const scRoutingContext = (0, react_core_1.useSCRouting)();
69
+ // CONTEXT
70
+ const scUserContext = (0, react_core_1.useSCUser)();
71
+ // HANDLERS
72
+ const handleOpen = (event) => {
73
+ setAnchorEl(event.currentTarget);
74
+ };
75
+ const handleClose = () => {
76
+ setAnchorEl(null);
77
+ };
78
+ const handleOpenDialog = () => {
79
+ setOpenConfirmDialog(true);
80
+ setAnchorEl(null);
81
+ };
82
+ const handleCloseDialog = () => {
83
+ setOpenConfirmDialog(false);
84
+ setAnchorEl(null);
85
+ onItemRemoveConfirm && onItemRemoveConfirm();
86
+ };
87
+ /**
88
+ * Handles thread deletion
89
+ */
90
+ function handleRemoveUser() {
91
+ console.log(userToRemove);
92
+ // GroupService.removeUserFromGroup(group.id, userToRemove)
93
+ // .then(() => {
94
+ // PubSub.publish('snippetsChannelDelete', userToRemove);
95
+ // handleCloseDialog();
96
+ // })
97
+ // .catch((error) => {
98
+ // setOpenConfirmDialog(false);
99
+ // console.log(error);
100
+ // });
101
+ }
102
+ if (scUserContext.user.id === user.id) {
103
+ return null;
104
+ }
105
+ /**
106
+ *
107
+ */
108
+ const renderList = () => {
109
+ if (isMobile) {
110
+ return [
111
+ react_1.default.createElement(material_1.ListItem, { className: classes.item, key: "message", component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, user) },
112
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSettingsIconButton.item.message", defaultMessage: "ui.groupSettingsIconButton.item.message" })),
113
+ react_1.default.createElement(material_1.ListItem, { className: classes.item, key: "report", onClick: () => console.log('report') },
114
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSettingsIconButton.item.report", defaultMessage: "ui.groupSettingsIconButton.item.report" })),
115
+ react_1.default.createElement(material_1.ListItem, { className: classes.item, key: "delete", onClick: userToRemove ? handleOpenDialog : onMenuItemRemoveClick },
116
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSettingsIconButton.item.remove", defaultMessage: "ui.groupSettingsIconButton.item.remove" }))
117
+ ];
118
+ }
119
+ else {
120
+ return [
121
+ react_1.default.createElement(material_1.MenuItem, { className: classes.item, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, user), key: "message" },
122
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSettingsIconButton.item.message", defaultMessage: "ui.groupSettingsIconButton.item.message" })),
123
+ react_1.default.createElement(material_1.MenuItem, { className: classes.item, onClick: () => console.log('report'), key: "report" },
124
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSettingsIconButton.item.report", defaultMessage: "ui.groupSettingsIconButton.item.report" })),
125
+ react_1.default.createElement(material_1.MenuItem, { className: classes.item, onClick: userToRemove ? handleOpenDialog : onMenuItemRemoveClick, key: "delete" },
126
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSettingsIconButton.item.remove", defaultMessage: "ui.groupSettingsIconButton.item.remove" }))
127
+ ];
128
+ }
129
+ };
130
+ return (react_1.default.createElement(react_1.default.Fragment, null,
131
+ react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, rest, { onClick: handleOpen }),
132
+ react_1.default.createElement(Icon_1.default, null, "more_vert")),
133
+ isMobile ? (react_1.default.createElement(SwipeableDrawerRoot, { className: classes.drawerRoot, anchor: "bottom", open: Boolean(anchorEl), onClose: handleClose, onOpen: handleOpen, PaperProps: { className: classes.paper }, disableSwipeToOpen: true },
134
+ react_1.default.createElement(material_1.List, null, renderList()))) : (react_1.default.createElement(MenuRoot, { className: classes.menuRoot, anchorEl: anchorEl, open: Boolean(anchorEl), onClose: handleClose, PaperProps: { className: classes.paper } }, renderList())),
135
+ openConfirmDialog && (react_1.default.createElement(ConfirmDialog_1.default, { open: openConfirmDialog, title: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSettingsIconButton.dialog.msg", defaultMessage: "ui.groupSettingsIconButton.dialog.msg" }), btnConfirm: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupSettingsIconButton.dialog.confirm", defaultMessage: "ui.groupSettingsIconButton.dialog.confirm" }), onConfirm: handleRemoveUser, onClose: handleCloseDialog }))));
136
+ }
137
+ exports.default = GroupSettingsIconButton;
@@ -0,0 +1,3 @@
1
+ import GroupSettingsIconButton, { GroupSettingsIconButtonProps } from './GroupSettingsIconButton';
2
+ export default GroupSettingsIconButton;
3
+ export { GroupSettingsIconButtonProps };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const GroupSettingsIconButton_1 = tslib_1.__importDefault(require("./GroupSettingsIconButton"));
5
+ exports.default = GroupSettingsIconButton_1.default;
@@ -16,11 +16,16 @@ export interface GroupSubscribeButtonProps {
16
16
  */
17
17
  groupId?: number;
18
18
  /**
19
- * onJoin callback
19
+ * id of the user to be accepted into the group
20
+ * @default null
21
+ */
22
+ userId?: number;
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
  */
@@ -49,7 +49,7 @@ function GroupSubscribeButton(inProps) {
49
49
  props: inProps,
50
50
  name: PREFIX
51
51
  });
52
- const { className, groupId, group, onJoin } = props, rest = tslib_1.__rest(props, ["className", "groupId", "group", "onJoin"]);
52
+ const { className, groupId, group, userId, onSubscribe } = props, rest = tslib_1.__rest(props, ["className", "groupId", "group", "userId", "onSubscribe"]);
53
53
  // STATE
54
54
  const [status, setStatus] = (0, react_1.useState)(null);
55
55
  // CONTEXT
@@ -63,7 +63,7 @@ function GroupSubscribeButton(inProps) {
63
63
  group,
64
64
  cacheStrategy: authUserId ? utils_1.CacheStrategies.CACHE_FIRST : utils_1.CacheStrategies.STALE_WHILE_REVALIDATE
65
65
  });
66
- 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]);
66
+ 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]);
67
67
  (0, react_1.useEffect)(() => {
68
68
  /**
69
69
  * Call scGroupsManager.subscriptionStatus inside an effect
@@ -73,11 +73,11 @@ function GroupSubscribeButton(inProps) {
73
73
  setStatus(scGroupsManager.subscriptionStatus(scGroup));
74
74
  }
75
75
  }, [authUserId, scGroupsManager.subscriptionStatus]);
76
- const subscribe = () => {
76
+ const subscribe = (userId) => {
77
77
  scGroupsManager
78
- .subscribe(scGroup)
78
+ .subscribe(scGroup, userId)
79
79
  .then(() => {
80
- // onJoin && onJoin(scGroup, !joined);
80
+ onSubscribe && onSubscribe(scGroup, types_1.SCGroupSubscriptionStatusType.SUBSCRIBED);
81
81
  })
82
82
  .catch((e) => {
83
83
  utils_1.Logger.error(Errors_1.SCOPE_SC_UI, e);
@@ -87,7 +87,7 @@ function GroupSubscribeButton(inProps) {
87
87
  scGroupsManager
88
88
  .unsubscribe(scGroup)
89
89
  .then(() => {
90
- // onJoin && onJoin(scGroup, !joined);
90
+ onSubscribe && onSubscribe(scGroup, null);
91
91
  })
92
92
  .catch((e) => {
93
93
  utils_1.Logger.error(Errors_1.SCOPE_SC_UI, e);
@@ -98,7 +98,7 @@ function GroupSubscribeButton(inProps) {
98
98
  scContext.settings.handleAnonymousAction();
99
99
  }
100
100
  else {
101
- types_1.SCGroupSubscriptionStatusType.SUBSCRIBED ? unsubscribe() : subscribe();
101
+ status === types_1.SCGroupSubscriptionStatusType.SUBSCRIBED && !userId ? unsubscribe() : userId ? subscribe(userId) : subscribe();
102
102
  }
103
103
  };
104
104
  /**
@@ -108,22 +108,25 @@ function GroupSubscribeButton(inProps) {
108
108
  let _status;
109
109
  switch (status) {
110
110
  case types_1.SCGroupSubscriptionStatusType.REQUESTED:
111
- _status = react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupJoinButton.waitingApproval", id: "ui.groupJoinButton.waitingApproval" });
111
+ _status = react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupSubscribeButton.waitingApproval", id: "ui.groupSubscribeButton.waitingApproval" });
112
112
  break;
113
113
  case types_1.SCGroupSubscriptionStatusType.SUBSCRIBED:
114
114
  _status = react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupSubscribeButton.exit", id: "ui.groupSubscribeButton.exit" });
115
115
  break;
116
+ case types_1.SCGroupSubscriptionStatusType.INVITED:
117
+ _status = react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupSubscribeButton.accept", id: "ui.groupSubscribeButton.accept" });
118
+ break;
116
119
  default:
117
120
  scGroup.privacy === types_1.SCGroupPrivacyType.PUBLIC
118
121
  ? (_status = react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupSubscribeButton.enter", id: "ui.groupSubscribeButton.enter" }))
119
- : (_status = react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupJoinButton.requestAccess", id: "ui.groupJoinButton.requestAccess" }));
122
+ : (_status = react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupSubscribeButton.requestAccess", id: "ui.groupSubscribeButton.requestAccess" }));
120
123
  break;
121
124
  }
122
125
  return _status;
123
126
  };
124
- if (!scGroup || (scGroup && !scGroup.subscription_status) || canEdit) {
127
+ if (!scGroup || (isGroupAdmin && userId === scUserContext.user.id)) {
125
128
  return null;
126
129
  }
127
- return (react_1.default.createElement(Root, Object.assign({ size: "small", variant: "outlined", onClick: handleSubscribeAction, loading: scUserContext.user ? scGroupsManager.isLoading(scGroup) : null, className: (0, classnames_1.default)(classes.root, className) }, rest), getStatus()));
130
+ return (react_1.default.createElement(Root, Object.assign({ size: "small", variant: "outlined", onClick: handleSubscribeAction, loading: scUserContext.user ? scGroupsManager.isLoading(scGroup) : null, disabled: status === types_1.SCGroupSubscriptionStatusType.REQUESTED, className: (0, classnames_1.default)(classes.root, className) }, rest), isGroupAdmin ? react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupSubscribeButton.accept", id: "ui.groupSubscribeButton.accept" }) : getStatus()));
128
131
  }
129
132
  exports.default = GroupSubscribeButton;