@selfcommunity/react-ui 0.7.9-alpha.2 → 0.7.9-alpha.20
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/BottomNavigation/BottomNavigation.js +3 -1
- 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/FeedObject.d.ts +1 -0
- package/lib/cjs/components/FeedObject/FeedObject.js +23 -6
- 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 +8 -8
- package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +9 -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 +29 -14
- 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 +56 -0
- package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +137 -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 +7 -2
- package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +24 -9
- package/lib/cjs/components/Groups/Groups.d.ts +65 -0
- package/lib/cjs/components/Groups/Groups.js +135 -0
- package/lib/cjs/components/Groups/Skeleton.d.ts +34 -0
- package/lib/cjs/components/Groups/Skeleton.js +45 -0
- package/lib/cjs/components/Groups/constants.d.ts +1 -0
- package/lib/cjs/components/Groups/constants.js +4 -0
- package/lib/cjs/components/Groups/index.d.ts +4 -0
- package/lib/cjs/components/Groups/index.js +8 -0
- package/lib/cjs/components/InlineComposerWidget/InlineComposerWidget.d.ts +2 -1
- package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
- package/lib/cjs/components/NavigationToolbar/NavigationToolbar.js +5 -1
- package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
- package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
- 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/index.d.ts +7 -3
- package/lib/cjs/index.js +14 -4
- package/lib/esm/components/BottomNavigation/BottomNavigation.js +3 -1
- 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/FeedObject.d.ts +1 -0
- package/lib/esm/components/FeedObject/FeedObject.js +24 -7
- 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 +8 -8
- package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +9 -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 +31 -16
- 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 +56 -0
- package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +134 -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 +7 -2
- package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +25 -10
- package/lib/esm/components/Groups/Groups.d.ts +65 -0
- package/lib/esm/components/Groups/Groups.js +132 -0
- package/lib/esm/components/Groups/Skeleton.d.ts +34 -0
- package/lib/esm/components/Groups/Skeleton.js +42 -0
- package/lib/esm/components/Groups/constants.d.ts +1 -0
- package/lib/esm/components/Groups/constants.js +1 -0
- package/lib/esm/components/Groups/index.d.ts +4 -0
- package/lib/esm/components/Groups/index.js +4 -0
- package/lib/esm/components/InlineComposerWidget/InlineComposerWidget.d.ts +2 -1
- package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
- package/lib/esm/components/NavigationToolbar/NavigationToolbar.js +5 -1
- package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
- package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
- 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/index.d.ts +7 -3
- package/lib/esm/index.js +8 -4
- 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
|
@@ -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, userId, onSubscribe } = props, rest = __rest(props, ["className", "groupId", "group", "userId", "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 && !userId ? unsubscribe() : userId ? subscribe(userId) : 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 && userId === scUserContext.user.id) || (isGroupAdmin && !userId)) {
|
|
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
|
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { SCGroupType } from '@selfcommunity/types';
|
|
2
|
+
import { EndpointType } from '@selfcommunity/api-services';
|
|
3
|
+
import { GroupProps } from '../Group';
|
|
4
|
+
export interface GroupsProps {
|
|
5
|
+
/**
|
|
6
|
+
* Overrides or extends the styles applied to the component.
|
|
7
|
+
* @default null
|
|
8
|
+
*/
|
|
9
|
+
className?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Endpoint to call
|
|
12
|
+
*/
|
|
13
|
+
endpoint: EndpointType;
|
|
14
|
+
/**
|
|
15
|
+
* Props to spread to single group object
|
|
16
|
+
* @default {variant: 'outlined', ButtonBaseProps: {disableRipple: 'true'}}
|
|
17
|
+
*/
|
|
18
|
+
GroupComponentProps?: GroupProps;
|
|
19
|
+
/**
|
|
20
|
+
* Prefetch groups. Useful for SSR.
|
|
21
|
+
* Use this to init the component with groups
|
|
22
|
+
* @default null
|
|
23
|
+
*/
|
|
24
|
+
prefetchedGroups?: SCGroupType[];
|
|
25
|
+
/** If true, it means that the endpoint fetches all groups available
|
|
26
|
+
* @default null
|
|
27
|
+
*/
|
|
28
|
+
general?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Other props
|
|
31
|
+
*/
|
|
32
|
+
[p: string]: any;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* > API documentation for the Community-JS Groups component. Learn about the available props and the CSS API.
|
|
36
|
+
*
|
|
37
|
+
*
|
|
38
|
+
* This component renders the list of the follows of the given group.
|
|
39
|
+
* Take a look at our <strong>demo</strong> component [here](/docs/sdk/community-js/react-ui/Components/Groups)
|
|
40
|
+
|
|
41
|
+
#### Import
|
|
42
|
+
|
|
43
|
+
```jsx
|
|
44
|
+
import {Groups} from '@selfcommunity/react-ui';
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
#### Component Name
|
|
48
|
+
|
|
49
|
+
The name `SCGroups` can be used when providing style overrides in the theme.
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
#### CSS
|
|
53
|
+
|
|
54
|
+
|Rule Name|Global class|Description|
|
|
55
|
+
|---|---|---|
|
|
56
|
+
|root|.SCGroups-root|Styles applied to the root element.|
|
|
57
|
+
|title|.SCGroups-title|Styles applied to the title element.|
|
|
58
|
+
|noResults|.SCGroups-no-results|Styles applied to no results section.|
|
|
59
|
+
|showMore|.SCGroups-show-more|Styles applied to show more button element.|
|
|
60
|
+
|dialogRoot|.SCGroups-dialog-root|Styles applied to the dialog root element.|
|
|
61
|
+
|endMessage|.SCGroups-end-message|Styles applied to the end message element.|
|
|
62
|
+
|
|
63
|
+
* @param inProps
|
|
64
|
+
*/
|
|
65
|
+
export default function Groups(inProps: GroupsProps): JSX.Element;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { __awaiter, __rest } from "tslib";
|
|
2
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { styled } from '@mui/material/styles';
|
|
4
|
+
import { Box, Grid, Typography } from '@mui/material';
|
|
5
|
+
import { http } from '@selfcommunity/api-services';
|
|
6
|
+
import { Logger } from '@selfcommunity/utils';
|
|
7
|
+
import { SCPreferences, useIsComponentMountedRef, useSCPreferences, useSCUser } from '@selfcommunity/react-core';
|
|
8
|
+
import Skeleton from './Skeleton';
|
|
9
|
+
import { FormattedMessage } from 'react-intl';
|
|
10
|
+
import classNames from 'classnames';
|
|
11
|
+
import { SCOPE_SC_UI } from '../../constants/Errors';
|
|
12
|
+
import { useThemeProps } from '@mui/system';
|
|
13
|
+
import HiddenPlaceholder from '../../shared/HiddenPlaceholder';
|
|
14
|
+
import { PREFIX } from './constants';
|
|
15
|
+
import Group from '../Group';
|
|
16
|
+
const classes = {
|
|
17
|
+
root: `${PREFIX}-root`,
|
|
18
|
+
groups: `${PREFIX}-groups`,
|
|
19
|
+
item: `${PREFIX}-item`,
|
|
20
|
+
noResults: `${PREFIX}-no-results`,
|
|
21
|
+
showMore: `${PREFIX}-show-more`,
|
|
22
|
+
endMessage: `${PREFIX}-end-message`
|
|
23
|
+
};
|
|
24
|
+
const Root = styled(Box, {
|
|
25
|
+
name: PREFIX,
|
|
26
|
+
slot: 'Root'
|
|
27
|
+
})(() => ({}));
|
|
28
|
+
/**
|
|
29
|
+
* > API documentation for the Community-JS Groups component. Learn about the available props and the CSS API.
|
|
30
|
+
*
|
|
31
|
+
*
|
|
32
|
+
* This component renders the list of the follows of the given group.
|
|
33
|
+
* Take a look at our <strong>demo</strong> component [here](/docs/sdk/community-js/react-ui/Components/Groups)
|
|
34
|
+
|
|
35
|
+
#### Import
|
|
36
|
+
|
|
37
|
+
```jsx
|
|
38
|
+
import {Groups} from '@selfcommunity/react-ui';
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
#### Component Name
|
|
42
|
+
|
|
43
|
+
The name `SCGroups` can be used when providing style overrides in the theme.
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
#### CSS
|
|
47
|
+
|
|
48
|
+
|Rule Name|Global class|Description|
|
|
49
|
+
|---|---|---|
|
|
50
|
+
|root|.SCGroups-root|Styles applied to the root element.|
|
|
51
|
+
|title|.SCGroups-title|Styles applied to the title element.|
|
|
52
|
+
|noResults|.SCGroups-no-results|Styles applied to no results section.|
|
|
53
|
+
|showMore|.SCGroups-show-more|Styles applied to show more button element.|
|
|
54
|
+
|dialogRoot|.SCGroups-dialog-root|Styles applied to the dialog root element.|
|
|
55
|
+
|endMessage|.SCGroups-end-message|Styles applied to the end message element.|
|
|
56
|
+
|
|
57
|
+
* @param inProps
|
|
58
|
+
*/
|
|
59
|
+
export default function Groups(inProps) {
|
|
60
|
+
// PROPS
|
|
61
|
+
const props = useThemeProps({
|
|
62
|
+
props: inProps,
|
|
63
|
+
name: PREFIX
|
|
64
|
+
});
|
|
65
|
+
const { endpoint, className, GroupComponentProps = { variant: 'outlined', ButtonBaseProps: { disableRipple: true, component: Box } }, prefetchedGroups = [], general } = props, rest = __rest(props, ["endpoint", "className", "GroupComponentProps", "prefetchedGroups", "general"]);
|
|
66
|
+
// STATE
|
|
67
|
+
const [groups, setGroups] = useState([]);
|
|
68
|
+
const [loading, setLoading] = useState(true);
|
|
69
|
+
// CONTEXT
|
|
70
|
+
const scUserContext = useSCUser();
|
|
71
|
+
const scPreferencesContext = useSCPreferences();
|
|
72
|
+
// MEMO
|
|
73
|
+
const contentAvailability = useMemo(() => SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY in scPreferencesContext.preferences &&
|
|
74
|
+
scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY].value, [scPreferencesContext.preferences]);
|
|
75
|
+
// CONST
|
|
76
|
+
const authUserId = scUserContext.user ? scUserContext.user.id : null;
|
|
77
|
+
// REFS
|
|
78
|
+
const isMountedRef = useIsComponentMountedRef();
|
|
79
|
+
/**
|
|
80
|
+
* Fetches groups list
|
|
81
|
+
*/
|
|
82
|
+
const fetchGroups = (next = endpoint.url({})) => __awaiter(this, void 0, void 0, function* () {
|
|
83
|
+
const response = yield http.request({
|
|
84
|
+
url: next,
|
|
85
|
+
method: endpoint.method
|
|
86
|
+
});
|
|
87
|
+
const data = response.data;
|
|
88
|
+
return data.next ? data.results.concat(yield fetchGroups(data.next)) : data.results;
|
|
89
|
+
});
|
|
90
|
+
/**
|
|
91
|
+
* On mount, fetches groups list
|
|
92
|
+
*/
|
|
93
|
+
useEffect(() => {
|
|
94
|
+
if (!contentAvailability && !authUserId) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
else if (prefetchedGroups.length) {
|
|
98
|
+
setGroups(prefetchedGroups);
|
|
99
|
+
setLoading(false);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
fetchGroups()
|
|
103
|
+
.then((data) => {
|
|
104
|
+
if (isMountedRef.current) {
|
|
105
|
+
setGroups(data);
|
|
106
|
+
setLoading(false);
|
|
107
|
+
}
|
|
108
|
+
})
|
|
109
|
+
.catch((error) => {
|
|
110
|
+
Logger.error(SCOPE_SC_UI, error);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}, [contentAvailability, authUserId, prefetchedGroups.length]);
|
|
114
|
+
const handleSubscribe = (group) => {
|
|
115
|
+
if (!general) {
|
|
116
|
+
const newGroups = [...groups];
|
|
117
|
+
const _updated = newGroups.filter((g) => g.id !== group.id);
|
|
118
|
+
setGroups(_updated);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
// RENDER
|
|
122
|
+
if (!contentAvailability && !scUserContext.user) {
|
|
123
|
+
return React.createElement(HiddenPlaceholder, null);
|
|
124
|
+
}
|
|
125
|
+
const content = (React.createElement(React.Fragment, null, loading ? (React.createElement(Skeleton, null)) : (React.createElement(Grid, { container: true, spacing: { xs: 3 }, className: classes.groups }, !groups.length ? (React.createElement(Box, { className: classes.noResults },
|
|
126
|
+
React.createElement(Typography, { variant: "h4" },
|
|
127
|
+
React.createElement(FormattedMessage, { id: "ui.groups.noGroups.title", defaultMessage: "ui.groups.noGroups.title" })),
|
|
128
|
+
React.createElement(Typography, { variant: "body1" },
|
|
129
|
+
React.createElement(FormattedMessage, { id: "ui.groups.noGroups.subtitle", defaultMessage: "ui.groups.noGroups.subtitle" })))) : (React.createElement(React.Fragment, null, groups.map((group) => (React.createElement(Grid, { item: true, xs: 12, sm: 8, md: 6, key: group.id, className: classes.item },
|
|
130
|
+
React.createElement(Group, Object.assign({ group: group, groupId: group.id, groupSubscribeButtonProps: { onSubscribe: handleSubscribe } }, GroupComponentProps)))))))))));
|
|
131
|
+
return (React.createElement(Root, Object.assign({ className: classNames(classes.root, className) }, rest), content));
|
|
132
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface GroupsSkeletonProps {
|
|
2
|
+
/**
|
|
3
|
+
* Overrides or extends the styles applied to the component.
|
|
4
|
+
* @default null
|
|
5
|
+
*/
|
|
6
|
+
className?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Overrides or extends the styles applied to the component.
|
|
9
|
+
* @default null
|
|
10
|
+
*/
|
|
11
|
+
GroupSkeletonProps?: any;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* > API documentation for the Community-JS Groups Skeleton component. Learn about the available props and the CSS API.
|
|
15
|
+
|
|
16
|
+
#### Import
|
|
17
|
+
|
|
18
|
+
```jsx
|
|
19
|
+
import {GroupsSkeleton} from '@selfcommunity/react-ui';
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
#### Component Name
|
|
23
|
+
|
|
24
|
+
The name `SCGroups-skeleton-root` can be used when providing style overrides in the theme.
|
|
25
|
+
|
|
26
|
+
#### CSS
|
|
27
|
+
|
|
28
|
+
|Rule Name|Global class|Description|
|
|
29
|
+
|---|---|---|
|
|
30
|
+
|root|.SCGroups-skeleton-root|Styles applied to the root element.|
|
|
31
|
+
|groups|.SCGroups-skeleton-groups|Styles applied to the group elements.|
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
export default function GroupsSkeleton(inProps: GroupsSkeletonProps): JSX.Element;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { __rest } from "tslib";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { styled } from '@mui/material/styles';
|
|
4
|
+
import { PREFIX } from './constants';
|
|
5
|
+
import { Box, Grid } from '@mui/material';
|
|
6
|
+
import classNames from 'classnames';
|
|
7
|
+
import { GroupSkeleton } from '../Group';
|
|
8
|
+
const classes = {
|
|
9
|
+
root: `${PREFIX}-skeleton-root`,
|
|
10
|
+
groups: `${PREFIX}-groups`
|
|
11
|
+
};
|
|
12
|
+
const Root = styled(Box, {
|
|
13
|
+
name: PREFIX,
|
|
14
|
+
slot: 'SkeletonRoot'
|
|
15
|
+
})(() => ({}));
|
|
16
|
+
/**
|
|
17
|
+
* > API documentation for the Community-JS Groups Skeleton component. Learn about the available props and the CSS API.
|
|
18
|
+
|
|
19
|
+
#### Import
|
|
20
|
+
|
|
21
|
+
```jsx
|
|
22
|
+
import {GroupsSkeleton} from '@selfcommunity/react-ui';
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
#### Component Name
|
|
26
|
+
|
|
27
|
+
The name `SCGroups-skeleton-root` can be used when providing style overrides in the theme.
|
|
28
|
+
|
|
29
|
+
#### CSS
|
|
30
|
+
|
|
31
|
+
|Rule Name|Global class|Description|
|
|
32
|
+
|---|---|---|
|
|
33
|
+
|root|.SCGroups-skeleton-root|Styles applied to the root element.|
|
|
34
|
+
|groups|.SCGroups-skeleton-groups|Styles applied to the group elements.|
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
export default function GroupsSkeleton(inProps) {
|
|
38
|
+
const { className, GroupSkeletonProps = {} } = inProps, rest = __rest(inProps, ["className", "GroupSkeletonProps"]);
|
|
39
|
+
return (React.createElement(Root, Object.assign({ className: classNames(classes.root, className) }, rest),
|
|
40
|
+
React.createElement(Grid, { container: true, spacing: { xs: 3 }, className: classes.groups }, [...Array(15)].map((category, index) => (React.createElement(Grid, { item: true, xs: 12, sm: 8, md: 6, key: index },
|
|
41
|
+
React.createElement(GroupSkeleton, Object.assign({ elevation: 0, variant: 'outlined' }, GroupSkeletonProps))))))));
|
|
42
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const PREFIX = "SCGroups";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const PREFIX = 'SCGroups';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SCCategoryType, SCMediaType, SCPollType, SCTagType } from '@selfcommunity/types';
|
|
1
|
+
import { SCCategoryType, SCGroupType, SCMediaType, SCPollType, SCTagType } from '@selfcommunity/types';
|
|
2
2
|
import { SCMediaObjectType } from '../../types/media';
|
|
3
3
|
import { WidgetProps } from '../Widget';
|
|
4
4
|
export interface InlineComposerWidgetProps extends Omit<WidgetProps, 'defaultValue'> {
|
|
@@ -15,6 +15,7 @@ export interface InlineComposerWidgetProps extends Omit<WidgetProps, 'defaultVal
|
|
|
15
15
|
title?: string;
|
|
16
16
|
text?: string;
|
|
17
17
|
categories?: SCCategoryType[];
|
|
18
|
+
group?: SCGroupType;
|
|
18
19
|
audience?: string;
|
|
19
20
|
addressing?: SCTagType[];
|
|
20
21
|
medias?: SCMediaType[];
|
|
@@ -60,7 +60,7 @@ export default function NavigationMenuIconButton(inProps) {
|
|
|
60
60
|
props: inProps,
|
|
61
61
|
name: PREFIX
|
|
62
62
|
});
|
|
63
|
-
const { className = null, DrawerProps = { anchor: 'left' },
|
|
63
|
+
const { className = null, DrawerProps = { anchor: 'left' }, drawerHeaderContent = React.createElement(DefaultHeaderContent, null), drawerContent = React.createElement(DefaultDrawerContent, null), ScrollContainerProps = {} } = props, rest = __rest(props, ["className", "DrawerProps", "drawerHeaderContent", "drawerContent", "ScrollContainerProps"]);
|
|
64
64
|
// STATE
|
|
65
65
|
const [anchorEl, setAnchorEl] = useState(null);
|
|
66
66
|
// CONTEXT
|
|
@@ -21,6 +21,7 @@ const classes = {
|
|
|
21
21
|
navigation: `${PREFIX}-navigation`,
|
|
22
22
|
home: `${PREFIX}-home`,
|
|
23
23
|
explore: `${PREFIX}-explore`,
|
|
24
|
+
groups: `${PREFIX}-groups`,
|
|
24
25
|
search: `${PREFIX}-search`,
|
|
25
26
|
composer: `${PREFIX}-composer`,
|
|
26
27
|
profile: `${PREFIX}-profile`,
|
|
@@ -98,6 +99,7 @@ export default function NavigationToolbar(inProps) {
|
|
|
98
99
|
return _preferences;
|
|
99
100
|
}, [scPreferences.preferences]);
|
|
100
101
|
const privateMessagingEnabled = useMemo(() => scPreferences.features.includes(SCFeatureName.PRIVATE_MESSAGING), [scPreferences.features]);
|
|
102
|
+
const groupsEnabled = useMemo(() => scPreferences.features.includes(SCFeatureName.GROUPING), [scPreferences.features]);
|
|
101
103
|
// STATE
|
|
102
104
|
const [anchorNotification, setAnchorNotification] = React.useState(null);
|
|
103
105
|
// HANDLERS
|
|
@@ -118,7 +120,9 @@ export default function NavigationToolbar(inProps) {
|
|
|
118
120
|
React.createElement(Icon, null, "home"))),
|
|
119
121
|
preferences[SCPreferences.CONFIGURATIONS_EXPLORE_STREAM_ENABLED] &&
|
|
120
122
|
(preferences[SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY] || scUserContext.user) && (React.createElement(IconButton, { className: classNames(classes.explore, { [classes.active]: value.startsWith(scRoutingContext.url(SCRoutes.EXPLORE_ROUTE_NAME, {})) }), "aria-label": "Explore", to: scRoutingContext.url(SCRoutes.EXPLORE_ROUTE_NAME, {}), component: Link },
|
|
121
|
-
React.createElement(Icon, null, "explore")))
|
|
123
|
+
React.createElement(Icon, null, "explore"))),
|
|
124
|
+
groupsEnabled && scUserContext.user && (React.createElement(IconButton, { className: classNames(classes.groups, { [classes.active]: value.startsWith(scRoutingContext.url(SCRoutes.GROUPS_ROUTE_NAME, {})) }), "aria-label": "Groups", to: scRoutingContext.url(SCRoutes.GROUPS_ROUTE_NAME, {}), component: Link },
|
|
125
|
+
React.createElement(Icon, null, "groups")))));
|
|
122
126
|
return (React.createElement(Root, Object.assign({ className: classNames(className, classes.root) }, rest),
|
|
123
127
|
React.createElement(NavigationMenuIconButtonComponent, null),
|
|
124
128
|
React.createElement(Link, { to: scRoutingContext.url(SCRoutes.HOME_ROUTE_NAME, {}), className: classes.logo },
|
|
@@ -8,6 +8,10 @@ export interface NavigationToolbarMobileProps extends ToolbarProps {
|
|
|
8
8
|
* Disable search action if possible
|
|
9
9
|
*/
|
|
10
10
|
disableSearch?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Preserve the same as the desktop version
|
|
13
|
+
*/
|
|
14
|
+
preserveDesktopLogo?: boolean;
|
|
11
15
|
/**
|
|
12
16
|
* Props spread to SearchAutocomplete component
|
|
13
17
|
*/
|
|
@@ -62,7 +62,7 @@ export default function NavigationToolbarMobile(inProps) {
|
|
|
62
62
|
props: inProps,
|
|
63
63
|
name: PREFIX
|
|
64
64
|
});
|
|
65
|
-
const { className = '', disableSearch = false, SearchAutocompleteProps = {}, children = null, startActions = null, endActions = null, NavigationMenuIconButtonComponent = NavigationMenuIconButton, NavigationSettingsIconButtonComponent = NavigationSettingsIconButton } = props, rest = __rest(props, ["className", "disableSearch", "SearchAutocompleteProps", "children", "startActions", "endActions", "NavigationMenuIconButtonComponent", "NavigationSettingsIconButtonComponent"]);
|
|
65
|
+
const { className = '', disableSearch = false, preserveDesktopLogo = false, SearchAutocompleteProps = {}, children = null, startActions = null, endActions = null, NavigationMenuIconButtonComponent = NavigationMenuIconButton, NavigationSettingsIconButtonComponent = NavigationSettingsIconButton } = props, rest = __rest(props, ["className", "disableSearch", "preserveDesktopLogo", "SearchAutocompleteProps", "children", "startActions", "endActions", "NavigationMenuIconButtonComponent", "NavigationSettingsIconButtonComponent"]);
|
|
66
66
|
// CONTEXT
|
|
67
67
|
const scUserContext = useSCUser();
|
|
68
68
|
const scRoutingContext = useSCRouting();
|
|
@@ -83,8 +83,7 @@ export default function NavigationToolbarMobile(inProps) {
|
|
|
83
83
|
}
|
|
84
84
|
const _children = children || (React.createElement(React.Fragment, null,
|
|
85
85
|
React.createElement(NavigationMenuIconButtonComponent, null),
|
|
86
|
-
React.createElement(Link, { to: scRoutingContext.url(SCRoutes.HOME_ROUTE_NAME, {}), className: classes.logo },
|
|
87
|
-
React.createElement("img", { src: preferences[SCPreferences.LOGO_NAVBAR_LOGO_MOBILE].value, alt: "logo" }))));
|
|
86
|
+
React.createElement(Link, { to: scRoutingContext.url(SCRoutes.HOME_ROUTE_NAME, {}), className: classes.logo }, !preserveDesktopLogo ? (React.createElement("img", { src: preferences[SCPreferences.LOGO_NAVBAR_LOGO_MOBILE].value, alt: "logo" })) : (React.createElement("img", { src: preferences[SCPreferences.LOGO_NAVBAR_LOGO].value, alt: "logo" })))));
|
|
88
87
|
return (React.createElement(Root, Object.assign({ className: classNames(className, classes.root) }, rest),
|
|
89
88
|
_children,
|
|
90
89
|
startActions,
|
|
@@ -5,7 +5,7 @@ import { Grid, useMediaQuery, useTheme } from '@mui/material';
|
|
|
5
5
|
import { useSCPreferences, useSCUser } from '@selfcommunity/react-core';
|
|
6
6
|
import classNames from 'classnames';
|
|
7
7
|
import { useThemeProps } from '@mui/system';
|
|
8
|
-
import { SCFeatureName, SCPrivateMessageStatusType } from '@selfcommunity/types';
|
|
8
|
+
import { SCFeatureName, SCPrivateMessageStatusType, SCPrivateMessageType } from '@selfcommunity/types';
|
|
9
9
|
import PrivateMessageThread from '../PrivateMessageThread';
|
|
10
10
|
import PrivateMessageSnippets from '../PrivateMessageSnippets';
|
|
11
11
|
import { PREFIX } from './constants';
|
|
@@ -65,6 +65,7 @@ export default function PrivateMessageComponent(inProps) {
|
|
|
65
65
|
const isMobile = useMediaQuery(theme.breakpoints.down('md'));
|
|
66
66
|
const [layout, setLayout] = useState('default');
|
|
67
67
|
const [obj, setObj] = useState(id !== null && id !== void 0 ? id : null);
|
|
68
|
+
const [type, setType] = useState(null);
|
|
68
69
|
const isNew = obj && obj === SCPrivateMessageStatusType.NEW;
|
|
69
70
|
const [openNewMessage, setOpenNewMessage] = useState(isNew !== null && isNew !== void 0 ? isNew : false);
|
|
70
71
|
const mobileSnippetsView = (layout === 'default' && !obj) || (layout === 'mobile' && !obj);
|
|
@@ -86,10 +87,12 @@ export default function PrivateMessageComponent(inProps) {
|
|
|
86
87
|
/**
|
|
87
88
|
* Handles thread opening on click
|
|
88
89
|
* @param item
|
|
90
|
+
* @param type
|
|
89
91
|
*/
|
|
90
|
-
const handleThreadOpening = (item) => {
|
|
91
|
-
onItemClick && onItemClick(messageReceiver(item, authUserId));
|
|
92
|
-
|
|
92
|
+
const handleThreadOpening = (item, type) => {
|
|
93
|
+
onItemClick && onItemClick(item.group ? item.group.id : messageReceiver(item, authUserId), type);
|
|
94
|
+
setType(type);
|
|
95
|
+
setObj(item.group ? item : messageReceiver(item, authUserId));
|
|
93
96
|
setOpenNewMessage(false);
|
|
94
97
|
};
|
|
95
98
|
/**
|
|
@@ -105,7 +108,7 @@ export default function PrivateMessageComponent(inProps) {
|
|
|
105
108
|
const handleOpenNewMessage = () => {
|
|
106
109
|
setOpenNewMessage(!openNewMessage);
|
|
107
110
|
setObj(SCPrivateMessageStatusType.NEW);
|
|
108
|
-
onItemClick && onItemClick(SCPrivateMessageStatusType.NEW);
|
|
111
|
+
onItemClick && onItemClick(SCPrivateMessageStatusType.NEW, SCPrivateMessageType.NEW);
|
|
109
112
|
};
|
|
110
113
|
/**
|
|
111
114
|
* Handles new messages open from user profile page or notifications section
|
|
@@ -127,7 +130,7 @@ export default function PrivateMessageComponent(inProps) {
|
|
|
127
130
|
* Handles state update when a new message is sent
|
|
128
131
|
*/
|
|
129
132
|
const handleOnNewMessageSent = (msg, isOne) => {
|
|
130
|
-
onItemClick && onItemClick(isOne ? messageReceiver(msg, authUserId) : '');
|
|
133
|
+
onItemClick && onItemClick(isOne ? messageReceiver(msg, authUserId) : '', msg.group ? SCPrivateMessageType.GROUP : SCPrivateMessageType.USER);
|
|
131
134
|
setObj(isOne ? messageReceiver(msg, authUserId) : null);
|
|
132
135
|
setOpenNewMessage(false);
|
|
133
136
|
};
|
|
@@ -147,14 +150,14 @@ export default function PrivateMessageComponent(inProps) {
|
|
|
147
150
|
onSnippetClick: handleThreadOpening,
|
|
148
151
|
onNewMessageClick: handleOpenNewMessage,
|
|
149
152
|
onDeleteConfirm: handleDeleteThread
|
|
150
|
-
},
|
|
153
|
+
}, threadObj: obj, clearSearch: clear, elevation: 0 })));
|
|
151
154
|
}
|
|
152
155
|
/**
|
|
153
156
|
* Renders thread section
|
|
154
157
|
*/
|
|
155
158
|
function renderThread() {
|
|
156
159
|
return (React.createElement(Grid, { item: true, xs: 12, md: 7, className: classNames(classes.threadBox, { [classes.hide]: isMobile && mobileSnippetsView }) },
|
|
157
|
-
React.createElement(PrivateMessageThread, {
|
|
160
|
+
React.createElement(PrivateMessageThread, { threadObj: obj, type: type, openNewMessage: openNewMessage, onNewMessageClose: handleMessageBack, onNewMessageSent: handleOnNewMessageSent, onSingleMessageOpen: handleSingleMessage, elevation: 0 })));
|
|
158
161
|
}
|
|
159
162
|
/**
|
|
160
163
|
* Renders the component (if not hidden by autoHide prop)
|
|
@@ -72,10 +72,12 @@ export default function PrivateMessageSnippetItem(inProps) {
|
|
|
72
72
|
// STATE
|
|
73
73
|
const hasBadge = () => {
|
|
74
74
|
var _a;
|
|
75
|
-
if (
|
|
76
|
-
|
|
75
|
+
if (message.receiver) {
|
|
76
|
+
if ((message === null || message === void 0 ? void 0 : message.receiver.id) !== ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id)) {
|
|
77
|
+
return message === null || message === void 0 ? void 0 : message.receiver.community_badge;
|
|
78
|
+
}
|
|
79
|
+
return message === null || message === void 0 ? void 0 : message.sender.community_badge;
|
|
77
80
|
}
|
|
78
|
-
return message === null || message === void 0 ? void 0 : message.sender.community_badge;
|
|
79
81
|
};
|
|
80
82
|
if (!message) {
|
|
81
83
|
return React.createElement(PrivateMessageSnippetItemSkeleton, { elevation: 0 });
|
|
@@ -86,10 +88,13 @@ export default function PrivateMessageSnippetItem(inProps) {
|
|
|
86
88
|
return (React.createElement(Root, Object.assign({ className: classNames(classes.root, className) }, rest, { secondaryAction: secondaryAction, disablePadding: true }),
|
|
87
89
|
React.createElement(ListItemButton, { onClick: onItemClick, classes: { root: classNames({ [classes.unread]: message.thread_status === SCPrivateMessageStatusType.NEW }) } },
|
|
88
90
|
React.createElement(ListItemAvatar, null,
|
|
89
|
-
React.createElement(UserAvatar, { hide: !hasBadge() },
|
|
90
|
-
React.createElement(Avatar, { alt: ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) === message.receiver.username ? message.sender.username : message.receiver.username, src: ((_b = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _b === void 0 ? void 0 : _b.username) === message.receiver.username ? message.sender.avatar : message.receiver.avatar }))),
|
|
91
|
+
React.createElement(UserAvatar, { hide: !hasBadge() }, message.group ? (React.createElement(Avatar, { alt: message.group.name, src: message.group.image_big })) : (React.createElement(Avatar, { alt: ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) === message.receiver.username ? message.sender.username : message.receiver.username, src: ((_b = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _b === void 0 ? void 0 : _b.username) === message.receiver.username ? message.sender.avatar : message.receiver.avatar })))),
|
|
91
92
|
React.createElement(ListItemText, { primary: React.createElement(React.Fragment, null,
|
|
92
|
-
React.createElement(Typography, { component: "span", className: classes.username },
|
|
93
|
+
React.createElement(Typography, { component: "span", className: classes.username }, message.group
|
|
94
|
+
? message.group.name
|
|
95
|
+
: ((_c = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _c === void 0 ? void 0 : _c.username) === message.receiver.username
|
|
96
|
+
? message.sender.username
|
|
97
|
+
: message.receiver.username),
|
|
93
98
|
hasBadge() && preferences && (React.createElement(Chip, { component: "span", className: classes.badgeLabel, size: "small", label: preferences[SCPreferences.STAFF_STAFF_BADGE_LABEL] })),
|
|
94
99
|
React.createElement(Typography, { color: "secondary", className: classes.time, component: "span" }, `${intl.formatDate(message.last_message_at, {
|
|
95
100
|
day: '2-digit',
|
|
@@ -20,7 +20,7 @@ export interface PrivateMessageSnippetsProps extends CardProps {
|
|
|
20
20
|
*
|
|
21
21
|
*/
|
|
22
22
|
snippetActions?: {
|
|
23
|
-
onSnippetClick?: (msg: any) => void;
|
|
23
|
+
onSnippetClick?: (msg: any, type: any) => void;
|
|
24
24
|
onNewMessageClick?: () => void;
|
|
25
25
|
onDeleteConfirm?: (msg: any) => void;
|
|
26
26
|
};
|
|
@@ -29,10 +29,10 @@ export interface PrivateMessageSnippetsProps extends CardProps {
|
|
|
29
29
|
*/
|
|
30
30
|
[p: string]: any;
|
|
31
31
|
/**
|
|
32
|
-
* thread user object
|
|
32
|
+
* thread user/ group object
|
|
33
33
|
* @default null
|
|
34
34
|
*/
|
|
35
|
-
|
|
35
|
+
threadObj?: any;
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
38
|
* > API documentation for the Community-JS PrivateMessageSnippets component. Learn about the available props and the CSS API.
|