@selfcommunity/react-ui 0.7.9-alpha.3 → 0.7.9-alpha.30
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.
- package/lib/cjs/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
- package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
- package/lib/cjs/components/Composer/Attributes/Attributes.d.ts +1 -1
- package/lib/cjs/components/Composer/Attributes/Attributes.js +9 -2
- package/lib/cjs/components/Composer/Composer.d.ts +2 -1
- package/lib/cjs/components/Composer/Composer.js +39 -12
- package/lib/cjs/components/Composer/Content/ContentDiscussion/ContentDiscussion.js +7 -3
- package/lib/cjs/components/Composer/Content/ContentPost/ContentPost.js +4 -3
- package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +7 -1
- package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +46 -12
- package/lib/cjs/components/CreateGroupButton/CreateGroupButton.d.ts +2 -2
- package/lib/cjs/components/CreateGroupButton/CreateGroupButton.js +5 -6
- package/lib/cjs/components/CustomAdv/CustomAdv.d.ts +4 -0
- package/lib/cjs/components/{CreateGroup/CreateGroup.d.ts → EditGroupButton/EditGroupButton.d.ts} +11 -16
- package/lib/cjs/components/EditGroupButton/EditGroupButton.js +61 -0
- package/lib/cjs/components/EditGroupButton/index.d.ts +3 -0
- package/lib/cjs/components/EditGroupButton/index.js +5 -0
- package/lib/cjs/components/FeedObject/Actions/Follow/Follow.js +18 -0
- package/lib/cjs/components/FeedObject/Actions/Share/Share.js +18 -0
- package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
- package/lib/cjs/components/FeedObject/FeedObject.js +43 -9
- package/lib/cjs/components/Group/Group.d.ts +4 -3
- package/lib/cjs/components/Group/Group.js +5 -4
- package/lib/cjs/components/Group/Skeleton.js +1 -1
- package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.d.ts +49 -0
- package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +101 -0
- package/lib/cjs/components/GroupAutocomplete/index.d.ts +3 -0
- package/lib/cjs/components/GroupAutocomplete/index.js +5 -0
- package/lib/cjs/components/GroupForm/GroupForm.d.ts +70 -0
- package/lib/cjs/components/GroupForm/GroupForm.js +239 -0
- package/lib/cjs/components/GroupForm/constants.d.ts +1 -0
- package/lib/cjs/components/{CreateGroup → GroupForm}/constants.js +1 -1
- package/lib/cjs/components/GroupForm/index.d.ts +3 -0
- package/lib/cjs/components/GroupForm/index.js +5 -0
- package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
- package/lib/cjs/components/GroupHeader/GroupHeader.js +21 -11
- package/lib/cjs/components/GroupHeader/Skeleton.d.ts +2 -4
- package/lib/cjs/components/GroupHeader/Skeleton.js +10 -10
- package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +12 -8
- package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +7 -6
- package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
- package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +3 -2
- package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +36 -16
- package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +0 -5
- package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +17 -7
- package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
- package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +132 -0
- package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
- package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
- package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
- package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +24 -9
- package/lib/cjs/components/Groups/Groups.d.ts +16 -16
- package/lib/cjs/components/Groups/Groups.js +47 -96
- package/lib/cjs/components/Groups/Skeleton.d.ts +14 -2
- package/lib/cjs/components/Groups/Skeleton.js +12 -5
- package/lib/cjs/components/InlineComposerWidget/InlineComposerWidget.d.ts +2 -1
- package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
- package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
- package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
- package/lib/cjs/components/Notification/Group/Group.d.ts +15 -0
- package/lib/cjs/components/Notification/Group/Group.js +79 -0
- package/lib/cjs/components/Notification/Group/index.d.ts +3 -0
- package/lib/cjs/components/Notification/Group/index.js +5 -0
- package/lib/cjs/components/Notification/Notification.js +32 -1
- package/lib/cjs/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
- package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
- package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +10 -7
- package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
- package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
- package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +24 -6
- package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
- package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +45 -20
- package/lib/cjs/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
- package/lib/cjs/components/SnippetNotifications/SnippetNotifications.js +7 -0
- package/lib/cjs/components/ToastNotifications/ToastNotifications.js +7 -0
- package/lib/cjs/components/VoteButton/VoteButton.js +19 -0
- package/lib/cjs/index.d.ts +7 -4
- package/lib/cjs/index.js +13 -6
- package/lib/esm/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
- package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
- package/lib/esm/components/Composer/Attributes/Attributes.d.ts +1 -1
- package/lib/esm/components/Composer/Attributes/Attributes.js +9 -2
- package/lib/esm/components/Composer/Composer.d.ts +2 -1
- package/lib/esm/components/Composer/Composer.js +39 -12
- package/lib/esm/components/Composer/Content/ContentDiscussion/ContentDiscussion.js +7 -3
- package/lib/esm/components/Composer/Content/ContentPost/ContentPost.js +4 -3
- package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +7 -1
- package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +45 -12
- package/lib/esm/components/CreateGroupButton/CreateGroupButton.d.ts +2 -2
- package/lib/esm/components/CreateGroupButton/CreateGroupButton.js +5 -6
- package/lib/esm/components/CustomAdv/CustomAdv.d.ts +4 -0
- package/lib/esm/components/{CreateGroup/CreateGroup.d.ts → EditGroupButton/EditGroupButton.d.ts} +11 -16
- package/lib/esm/components/EditGroupButton/EditGroupButton.js +58 -0
- package/lib/esm/components/EditGroupButton/index.d.ts +3 -0
- package/lib/esm/components/EditGroupButton/index.js +2 -0
- package/lib/esm/components/FeedObject/Actions/Follow/Follow.js +20 -2
- package/lib/esm/components/FeedObject/Actions/Share/Share.js +20 -2
- package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
- package/lib/esm/components/FeedObject/FeedObject.js +45 -11
- package/lib/esm/components/Group/Group.d.ts +4 -3
- package/lib/esm/components/Group/Group.js +5 -4
- package/lib/esm/components/Group/Skeleton.js +1 -1
- package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.d.ts +49 -0
- package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +99 -0
- package/lib/esm/components/GroupAutocomplete/index.d.ts +3 -0
- package/lib/esm/components/GroupAutocomplete/index.js +2 -0
- package/lib/esm/components/GroupForm/GroupForm.d.ts +70 -0
- package/lib/esm/components/GroupForm/GroupForm.js +236 -0
- package/lib/esm/components/GroupForm/constants.d.ts +1 -0
- package/lib/esm/components/GroupForm/constants.js +1 -0
- package/lib/esm/components/GroupForm/index.d.ts +3 -0
- package/lib/esm/components/GroupForm/index.js +2 -0
- package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
- package/lib/esm/components/GroupHeader/GroupHeader.js +21 -11
- package/lib/esm/components/GroupHeader/Skeleton.d.ts +2 -4
- package/lib/esm/components/GroupHeader/Skeleton.js +10 -10
- package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +12 -8
- package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +7 -6
- package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
- package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +4 -3
- package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +38 -18
- package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +0 -5
- package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +17 -7
- package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
- package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +129 -0
- package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
- package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
- package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
- package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +25 -10
- package/lib/esm/components/Groups/Groups.d.ts +16 -16
- package/lib/esm/components/Groups/Groups.js +52 -101
- package/lib/esm/components/Groups/Skeleton.d.ts +14 -2
- package/lib/esm/components/Groups/Skeleton.js +13 -5
- package/lib/esm/components/InlineComposerWidget/InlineComposerWidget.d.ts +2 -1
- package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
- package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
- package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
- package/lib/esm/components/Notification/Group/Group.d.ts +15 -0
- package/lib/esm/components/Notification/Group/Group.js +76 -0
- package/lib/esm/components/Notification/Group/index.d.ts +3 -0
- package/lib/esm/components/Notification/Group/index.js +2 -0
- package/lib/esm/components/Notification/Notification.js +32 -1
- package/lib/esm/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
- package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
- package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +11 -8
- package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
- package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
- package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
- package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
- package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +47 -22
- package/lib/esm/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
- package/lib/esm/components/SnippetNotifications/SnippetNotifications.js +7 -0
- package/lib/esm/components/ToastNotifications/ToastNotifications.js +7 -0
- package/lib/esm/components/VoteButton/VoteButton.js +20 -1
- package/lib/esm/index.d.ts +7 -4
- package/lib/esm/index.js +8 -5
- package/lib/umd/react-ui.js +1 -1
- package/package.json +6 -6
- package/lib/cjs/components/CreateGroup/CreateGroup.js +0 -187
- package/lib/cjs/components/CreateGroup/constants.d.ts +0 -1
- package/lib/cjs/components/CreateGroup/index.d.ts +0 -3
- package/lib/cjs/components/CreateGroup/index.js +0 -5
- package/lib/esm/components/CreateGroup/CreateGroup.js +0 -184
- package/lib/esm/components/CreateGroup/constants.d.ts +0 -1
- package/lib/esm/components/CreateGroup/constants.js +0 -1
- package/lib/esm/components/CreateGroup/index.d.ts +0 -3
- package/lib/esm/components/CreateGroup/index.js +0 -2
|
@@ -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 {
|
|
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';
|
|
@@ -19,10 +19,11 @@ import HiddenPlaceholder from '../../shared/HiddenPlaceholder';
|
|
|
19
19
|
import { PREFIX } from './constants';
|
|
20
20
|
import User, { UserSkeleton } from '../User';
|
|
21
21
|
import GroupInviteButton from '../GroupInviteButton';
|
|
22
|
+
import GroupSettingsIconButton from '../GroupSettingsIconButton';
|
|
22
23
|
const classes = {
|
|
23
24
|
root: `${PREFIX}-root`,
|
|
24
25
|
title: `${PREFIX}-title`,
|
|
25
|
-
|
|
26
|
+
actions: `${PREFIX}-actions`,
|
|
26
27
|
noResults: `${PREFIX}-no-results`,
|
|
27
28
|
showMore: `${PREFIX}-show-more`,
|
|
28
29
|
dialogRoot: `${PREFIX}-dialog-root`,
|
|
@@ -68,6 +69,7 @@ const DialogRoot = styled(BaseDialog, {
|
|
|
68
69
|
* @param inProps
|
|
69
70
|
*/
|
|
70
71
|
export default function GroupMembersWidget(inProps) {
|
|
72
|
+
var _a;
|
|
71
73
|
// PROPS
|
|
72
74
|
const props = useThemeProps({
|
|
73
75
|
props: inProps,
|
|
@@ -85,8 +87,11 @@ export default function GroupMembersWidget(inProps) {
|
|
|
85
87
|
const [openDialog, setOpenDialog] = useState(false);
|
|
86
88
|
// CONTEXT
|
|
87
89
|
const scUserContext = useSCUser();
|
|
90
|
+
const scRoutingContext = useSCRouting();
|
|
88
91
|
const scPreferencesContext = useSCPreferences();
|
|
89
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]);
|
|
90
95
|
// MEMO
|
|
91
96
|
const contentAvailability = useMemo(() => SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY in scPreferencesContext.preferences &&
|
|
92
97
|
scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY].value, [scPreferencesContext.preferences]);
|
|
@@ -168,6 +173,14 @@ export default function GroupMembersWidget(inProps) {
|
|
|
168
173
|
const handleToggleDialogOpen = () => {
|
|
169
174
|
setOpenDialog((prev) => !prev);
|
|
170
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]);
|
|
171
184
|
// RENDER
|
|
172
185
|
if ((autoHide && !state.count && state.initialized) || (!contentAvailability && !scUserContext.user) || !scGroup) {
|
|
173
186
|
return React.createElement(HiddenPlaceholder, null);
|
|
@@ -175,20 +188,27 @@ export default function GroupMembersWidget(inProps) {
|
|
|
175
188
|
if (!state.initialized) {
|
|
176
189
|
return React.createElement(Skeleton, null);
|
|
177
190
|
}
|
|
178
|
-
const content = (React.createElement(
|
|
179
|
-
React.createElement(
|
|
180
|
-
React.createElement(
|
|
181
|
-
|
|
182
|
-
React.createElement(
|
|
183
|
-
|
|
184
|
-
React.createElement(
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
React.createElement(
|
|
192
|
-
|
|
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 }))));
|
|
193
213
|
return (React.createElement(Root, Object.assign({ className: classNames(classes.root, className) }, rest), content));
|
|
194
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,
|
|
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 ((
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
+
}
|
|
@@ -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
|
-
*
|
|
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
|
-
|
|
28
|
+
onSubscribe?: (group: SCGroupType, status: string | null) => any;
|
|
24
29
|
/**
|
|
25
30
|
* Others properties
|
|
26
31
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __rest } from "tslib";
|
|
2
|
-
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
3
3
|
import { styled } from '@mui/material/styles';
|
|
4
4
|
import { CacheStrategies, Logger } from '@selfcommunity/utils';
|
|
5
5
|
import { useSCContext, useSCFetchGroup, useSCUser } from '@selfcommunity/react-core';
|
|
@@ -41,12 +41,13 @@ const Root = styled(LoadingButton, {
|
|
|
41
41
|
* @param inProps
|
|
42
42
|
*/
|
|
43
43
|
export default function GroupSubscribeButton(inProps) {
|
|
44
|
+
var _a;
|
|
44
45
|
// PROPS
|
|
45
46
|
const props = useThemeProps({
|
|
46
47
|
props: inProps,
|
|
47
48
|
name: PREFIX
|
|
48
49
|
});
|
|
49
|
-
const { className, groupId, group,
|
|
50
|
+
const { className, groupId, group, user, onSubscribe } = props, rest = __rest(props, ["className", "groupId", "group", "user", "onSubscribe"]);
|
|
50
51
|
// STATE
|
|
51
52
|
const [status, setStatus] = useState(null);
|
|
52
53
|
// CONTEXT
|
|
@@ -60,6 +61,7 @@ export default function GroupSubscribeButton(inProps) {
|
|
|
60
61
|
group,
|
|
61
62
|
cacheStrategy: authUserId ? CacheStrategies.CACHE_FIRST : CacheStrategies.STALE_WHILE_REVALIDATE
|
|
62
63
|
});
|
|
64
|
+
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]);
|
|
63
65
|
useEffect(() => {
|
|
64
66
|
/**
|
|
65
67
|
* Call scGroupsManager.subscriptionStatus inside an effect
|
|
@@ -69,11 +71,21 @@ export default function GroupSubscribeButton(inProps) {
|
|
|
69
71
|
setStatus(scGroupsManager.subscriptionStatus(scGroup));
|
|
70
72
|
}
|
|
71
73
|
}, [authUserId, scGroupsManager.subscriptionStatus]);
|
|
72
|
-
const subscribe = () => {
|
|
74
|
+
const subscribe = (userId) => {
|
|
73
75
|
scGroupsManager
|
|
74
|
-
.subscribe(scGroup)
|
|
76
|
+
.subscribe(scGroup, userId)
|
|
75
77
|
.then(() => {
|
|
76
|
-
|
|
78
|
+
onSubscribe && onSubscribe(scGroup, SCGroupSubscriptionStatusType.SUBSCRIBED);
|
|
79
|
+
})
|
|
80
|
+
.catch((e) => {
|
|
81
|
+
Logger.error(SCOPE_SC_UI, e);
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
const unsubscribe = () => {
|
|
85
|
+
scGroupsManager
|
|
86
|
+
.unsubscribe(scGroup)
|
|
87
|
+
.then(() => {
|
|
88
|
+
onSubscribe && onSubscribe(scGroup, null);
|
|
77
89
|
})
|
|
78
90
|
.catch((e) => {
|
|
79
91
|
Logger.error(SCOPE_SC_UI, e);
|
|
@@ -84,7 +96,7 @@ export default function GroupSubscribeButton(inProps) {
|
|
|
84
96
|
scContext.settings.handleAnonymousAction();
|
|
85
97
|
}
|
|
86
98
|
else {
|
|
87
|
-
subscribe();
|
|
99
|
+
status === SCGroupSubscriptionStatusType.SUBSCRIBED && !(user === null || user === void 0 ? void 0 : user.id) ? unsubscribe() : (user === null || user === void 0 ? void 0 : user.id) ? subscribe(user === null || user === void 0 ? void 0 : user.id) : subscribe();
|
|
88
100
|
}
|
|
89
101
|
};
|
|
90
102
|
/**
|
|
@@ -94,21 +106,24 @@ export default function GroupSubscribeButton(inProps) {
|
|
|
94
106
|
let _status;
|
|
95
107
|
switch (status) {
|
|
96
108
|
case SCGroupSubscriptionStatusType.REQUESTED:
|
|
97
|
-
_status = React.createElement(FormattedMessage, { defaultMessage: "ui.
|
|
109
|
+
_status = React.createElement(FormattedMessage, { defaultMessage: "ui.groupSubscribeButton.waitingApproval", id: "ui.groupSubscribeButton.waitingApproval" });
|
|
98
110
|
break;
|
|
99
111
|
case SCGroupSubscriptionStatusType.SUBSCRIBED:
|
|
100
112
|
_status = React.createElement(FormattedMessage, { defaultMessage: "ui.groupSubscribeButton.exit", id: "ui.groupSubscribeButton.exit" });
|
|
101
113
|
break;
|
|
114
|
+
case SCGroupSubscriptionStatusType.INVITED:
|
|
115
|
+
_status = React.createElement(FormattedMessage, { defaultMessage: "ui.groupSubscribeButton.accept", id: "ui.groupSubscribeButton.accept" });
|
|
116
|
+
break;
|
|
102
117
|
default:
|
|
103
118
|
scGroup.privacy === SCGroupPrivacyType.PUBLIC
|
|
104
119
|
? (_status = React.createElement(FormattedMessage, { defaultMessage: "ui.groupSubscribeButton.enter", id: "ui.groupSubscribeButton.enter" }))
|
|
105
|
-
: (_status = React.createElement(FormattedMessage, { defaultMessage: "ui.
|
|
120
|
+
: (_status = React.createElement(FormattedMessage, { defaultMessage: "ui.groupSubscribeButton.requestAccess", id: "ui.groupSubscribeButton.requestAccess" }));
|
|
106
121
|
break;
|
|
107
122
|
}
|
|
108
123
|
return _status;
|
|
109
124
|
};
|
|
110
|
-
if (!scGroup || (
|
|
125
|
+
if (!scGroup || (isGroupAdmin && (user === null || user === void 0 ? void 0 : user.id) === scUserContext.user.id) || (isGroupAdmin && !(user === null || user === void 0 ? void 0 : user.id))) {
|
|
111
126
|
return null;
|
|
112
127
|
}
|
|
113
|
-
return (React.createElement(Root, Object.assign({ size: "small", variant: "outlined", onClick: handleSubscribeAction, loading: scUserContext.user ? scGroupsManager.isLoading(scGroup) : null, className: classNames(classes.root, className) }, rest), getStatus()));
|
|
128
|
+
return (React.createElement(Root, Object.assign({ size: "small", variant: "outlined", onClick: handleSubscribeAction, loading: scUserContext.user ? scGroupsManager.isLoading(scGroup) : null, disabled: status === SCGroupSubscriptionStatusType.REQUESTED, className: classNames(classes.root, className) }, rest), isGroupAdmin ? React.createElement(FormattedMessage, { defaultMessage: "ui.groupSubscribeButton.accept", id: "ui.groupSubscribeButton.accept" }) : getStatus()));
|
|
114
129
|
}
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
+
import { SCGroupType } from '@selfcommunity/types';
|
|
1
2
|
import { EndpointType } from '@selfcommunity/api-services';
|
|
2
|
-
import { CacheStrategies } from '@selfcommunity/utils';
|
|
3
3
|
import { GroupProps } from '../Group';
|
|
4
4
|
export interface GroupsProps {
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Overrides or extends the styles applied to the component.
|
|
7
|
+
* @default null
|
|
7
8
|
*/
|
|
8
|
-
|
|
9
|
+
className?: string;
|
|
9
10
|
/**
|
|
10
|
-
*
|
|
11
|
-
* @default false
|
|
11
|
+
* Endpoint to call
|
|
12
12
|
*/
|
|
13
|
-
|
|
13
|
+
endpoint: EndpointType;
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
* @default
|
|
15
|
+
* Props to spread to single group object
|
|
16
|
+
* @default {variant: 'outlined', ButtonBaseProps: {disableRipple: 'true'}}
|
|
17
17
|
*/
|
|
18
|
-
|
|
18
|
+
GroupComponentProps?: GroupProps;
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
20
|
+
* Prefetch groups. Useful for SSR.
|
|
21
|
+
* Use this to init the component with groups
|
|
22
|
+
* @default null
|
|
22
23
|
*/
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
*
|
|
26
|
-
* @default empty object
|
|
24
|
+
prefetchedGroups?: SCGroupType[];
|
|
25
|
+
/** If true, it means that the endpoint fetches all groups available
|
|
26
|
+
* @default null
|
|
27
27
|
*/
|
|
28
|
-
|
|
28
|
+
general?: boolean;
|
|
29
29
|
/**
|
|
30
30
|
* Other props
|
|
31
31
|
*/
|