@selfcommunity/react-ui 0.7.9-alpha.8 → 0.7.9-alpha.80
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/AccountRecover/AccountRecover.js +6 -1
- package/lib/cjs/components/BottomNavigation/BottomNavigation.js +4 -3
- package/lib/cjs/components/CategoryHeader/Skeleton.js +3 -2
- package/lib/cjs/components/ChangeGroupCover/ChangeGroupCover.js +6 -6
- package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +19 -16
- package/lib/cjs/components/Composer/Attributes/Attributes.js +3 -3
- package/lib/cjs/components/Composer/Composer.js +3 -3
- package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -1
- package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +9 -19
- package/lib/cjs/components/Editor/Editor.js +2 -0
- package/lib/cjs/components/Editor/nodes/ImageNode.js +6 -0
- package/lib/cjs/components/Editor/plugins/ImagePlugin.js +4 -0
- package/lib/cjs/components/Editor/plugins/ToolbarPlugin.js +17 -3
- package/lib/cjs/components/FeedObject/Actions/Share/Share.js +18 -16
- package/lib/cjs/components/FeedObject/Contributors/Contributors.js +1 -1
- package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
- package/lib/cjs/components/FeedObject/FeedObject.js +27 -8
- package/lib/cjs/components/FeedObject/Poll/Poll.js +20 -20
- package/lib/cjs/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
- package/lib/cjs/components/Footer/Footer.js +1 -1
- package/lib/cjs/components/Group/Group.d.ts +8 -0
- package/lib/cjs/components/Group/Group.js +17 -5
- package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
- package/lib/cjs/components/GroupForm/GroupForm.js +64 -13
- package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
- package/lib/cjs/components/GroupHeader/GroupHeader.js +53 -11
- package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +63 -9
- package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +31 -9
- package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
- package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.js +221 -0
- package/lib/cjs/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
- package/lib/cjs/components/GroupInvitedWidget/Skeleton.js +38 -0
- package/lib/cjs/components/GroupInvitedWidget/constants.d.ts +1 -0
- package/lib/cjs/components/GroupInvitedWidget/constants.js +4 -0
- package/lib/cjs/components/GroupInvitedWidget/index.d.ts +4 -0
- package/lib/cjs/components/GroupInvitedWidget/index.js +8 -0
- package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
- package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +8 -3
- package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +25 -4
- package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
- package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
- package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
- package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +151 -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 +30 -11
- package/lib/cjs/components/Groups/Groups.d.ts +15 -8
- package/lib/cjs/components/Groups/Groups.js +86 -32
- package/lib/cjs/components/Groups/Skeleton.d.ts +4 -0
- package/lib/cjs/components/Groups/Skeleton.js +2 -2
- package/lib/cjs/components/InlineComposerWidget/InlineComposerWidget.js +7 -0
- package/lib/cjs/components/NavigationSettingsIconButton/NavigationSettingsIconButton.js +4 -4
- package/lib/cjs/components/NavigationToolbar/NavigationToolbar.js +9 -2
- package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +1 -0
- package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +9 -1
- package/lib/cjs/components/Notification/Group/Group.d.ts +15 -0
- package/lib/cjs/components/Notification/Group/Group.js +78 -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 +31 -1
- package/lib/cjs/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
- package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +7 -1
- package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +16 -8
- package/lib/cjs/components/PrivateMessageSettingsIconButton/PrivateMessageSettingsIconButton.js +1 -1
- package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
- package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +9 -4
- 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 +46 -20
- package/lib/cjs/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +6 -0
- 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/User/User.d.ts +6 -1
- package/lib/cjs/components/User/User.js +5 -4
- package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
- package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.js +46 -0
- package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
- package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +183 -0
- package/lib/cjs/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
- package/lib/cjs/components/UserSubscribedGroupsWidget/constants.js +4 -0
- package/lib/cjs/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
- package/lib/cjs/components/UserSubscribedGroupsWidget/index.js +8 -0
- package/lib/cjs/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
- package/lib/cjs/constants/PubSub.d.ts +28 -0
- package/lib/cjs/constants/PubSub.js +22 -0
- package/lib/cjs/index.d.ts +6 -3
- package/lib/cjs/index.js +13 -4
- package/lib/cjs/types/index.d.ts +2 -1
- package/lib/esm/components/AccountRecover/AccountRecover.js +6 -1
- package/lib/esm/components/BottomNavigation/BottomNavigation.js +5 -4
- package/lib/esm/components/CategoryHeader/Skeleton.js +3 -2
- package/lib/esm/components/ChangeGroupCover/ChangeGroupCover.js +6 -6
- package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +19 -16
- package/lib/esm/components/Composer/Attributes/Attributes.js +3 -3
- package/lib/esm/components/Composer/Composer.js +3 -3
- package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -1
- package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +9 -19
- package/lib/esm/components/Editor/Editor.js +2 -0
- package/lib/esm/components/Editor/nodes/ImageNode.js +6 -0
- package/lib/esm/components/Editor/plugins/ImagePlugin.js +4 -0
- package/lib/esm/components/Editor/plugins/ToolbarPlugin.js +19 -5
- package/lib/esm/components/FeedObject/Actions/Share/Share.js +19 -17
- package/lib/esm/components/FeedObject/Contributors/Contributors.js +1 -1
- package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
- package/lib/esm/components/FeedObject/FeedObject.js +28 -9
- package/lib/esm/components/FeedObject/Poll/Poll.js +20 -20
- package/lib/esm/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
- package/lib/esm/components/Footer/Footer.js +2 -2
- package/lib/esm/components/Group/Group.d.ts +8 -0
- package/lib/esm/components/Group/Group.js +21 -9
- package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
- package/lib/esm/components/GroupForm/GroupForm.js +64 -13
- package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
- package/lib/esm/components/GroupHeader/GroupHeader.js +55 -13
- package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +63 -9
- package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +31 -9
- package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
- package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.js +218 -0
- package/lib/esm/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
- package/lib/esm/components/GroupInvitedWidget/Skeleton.js +34 -0
- package/lib/esm/components/GroupInvitedWidget/constants.d.ts +1 -0
- package/lib/esm/components/GroupInvitedWidget/constants.js +1 -0
- package/lib/esm/components/GroupInvitedWidget/index.d.ts +4 -0
- package/lib/esm/components/GroupInvitedWidget/index.js +4 -0
- package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
- package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +9 -4
- package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +26 -5
- package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
- package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
- package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
- package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +148 -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 +30 -11
- package/lib/esm/components/Groups/Groups.d.ts +15 -8
- package/lib/esm/components/Groups/Groups.js +91 -37
- package/lib/esm/components/Groups/Skeleton.d.ts +4 -0
- package/lib/esm/components/Groups/Skeleton.js +2 -2
- package/lib/esm/components/InlineComposerWidget/InlineComposerWidget.js +9 -2
- package/lib/esm/components/NavigationSettingsIconButton/NavigationSettingsIconButton.js +4 -4
- package/lib/esm/components/NavigationToolbar/NavigationToolbar.js +10 -3
- package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +1 -0
- package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +11 -3
- package/lib/esm/components/Notification/Group/Group.d.ts +15 -0
- package/lib/esm/components/Notification/Group/Group.js +75 -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 +31 -1
- package/lib/esm/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
- package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +7 -1
- package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +17 -9
- package/lib/esm/components/PrivateMessageSettingsIconButton/PrivateMessageSettingsIconButton.js +1 -1
- package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
- package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +9 -4
- 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 +48 -22
- package/lib/esm/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +7 -1
- 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/User/User.d.ts +6 -1
- package/lib/esm/components/User/User.js +5 -4
- package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
- package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.js +42 -0
- package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
- package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +180 -0
- package/lib/esm/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
- package/lib/esm/components/UserSubscribedGroupsWidget/constants.js +1 -0
- package/lib/esm/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
- package/lib/esm/components/UserSubscribedGroupsWidget/index.js +4 -0
- package/lib/esm/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
- package/lib/esm/constants/PubSub.d.ts +28 -0
- package/lib/esm/constants/PubSub.js +19 -0
- package/lib/esm/index.d.ts +6 -3
- package/lib/esm/index.js +6 -3
- package/lib/esm/types/index.d.ts +2 -1
- package/lib/umd/311.js +2 -0
- package/lib/umd/react-ui.js +1 -1
- package/package.json +9 -9
- package/lib/umd/871.js +0 -2
- /package/lib/umd/{871.js.LICENSE.txt → 311.js.LICENSE.txt} +0 -0
|
@@ -71,25 +71,30 @@ function PrivateMessageSnippets(inProps) {
|
|
|
71
71
|
props: inProps,
|
|
72
72
|
name: constants_1.PREFIX
|
|
73
73
|
});
|
|
74
|
-
const { className = null,
|
|
74
|
+
const { className = null, threadObj = null, type = null, snippetActions, clearSearch } = props, rest = tslib_1.__rest(props, ["className", "threadObj", "type", "snippetActions", "clearSearch"]);
|
|
75
75
|
// STATE
|
|
76
76
|
const theme = (0, material_1.useTheme)();
|
|
77
77
|
const isMobile = (0, useMediaQuery_1.default)(theme.breakpoints.down('md'));
|
|
78
78
|
const { data, updateSnippets } = (0, react_core_1.useSCFetchPrivateMessageSnippets)({ cacheStrategy: utils_1.CacheStrategies.CACHE_FIRST });
|
|
79
79
|
const [search, setSearch] = (0, react_1.useState)('');
|
|
80
|
-
const isObj = typeof
|
|
80
|
+
const isObj = typeof threadObj === 'object';
|
|
81
81
|
const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
|
|
82
82
|
const authUserId = scUserContext.user ? scUserContext.user.id : null;
|
|
83
|
+
const [_type, _setType] = (0, react_1.useState)(type);
|
|
83
84
|
// INTL
|
|
84
85
|
const intl = (0, react_intl_1.useIntl)();
|
|
85
86
|
// REFS
|
|
86
87
|
const refreshSubscription = (0, react_1.useRef)(null);
|
|
87
88
|
// CONST
|
|
88
89
|
const filteredSnippets = data.snippets.filter((el) => {
|
|
90
|
+
var _a;
|
|
89
91
|
if (search === '') {
|
|
90
92
|
return el;
|
|
91
93
|
}
|
|
92
|
-
else if (el.
|
|
94
|
+
else if (el.group) {
|
|
95
|
+
return el.group.slug.includes(search.toLowerCase());
|
|
96
|
+
}
|
|
97
|
+
else if (((_a = el === null || el === void 0 ? void 0 : el.receiver) === null || _a === void 0 ? void 0 : _a.id) === authUserId) {
|
|
93
98
|
return el.sender.username.includes(search.toLowerCase());
|
|
94
99
|
}
|
|
95
100
|
return el.receiver.username.includes(search.toLowerCase());
|
|
@@ -101,6 +106,18 @@ function PrivateMessageSnippets(inProps) {
|
|
|
101
106
|
}
|
|
102
107
|
return ((_b = item === null || item === void 0 ? void 0 : item.receiver) === null || _b === void 0 ? void 0 : _b.id) !== loggedUserId ? (_c = item === null || item === void 0 ? void 0 : item.receiver) === null || _c === void 0 ? void 0 : _c.id : (_d = item === null || item === void 0 ? void 0 : item.sender) === null || _d === void 0 ? void 0 : _d.id;
|
|
103
108
|
};
|
|
109
|
+
const isSelected = (0, react_1.useMemo)(() => {
|
|
110
|
+
return (message) => {
|
|
111
|
+
var _a, _b;
|
|
112
|
+
if (threadObj && _type === types_1.SCPrivateMessageType.GROUP) {
|
|
113
|
+
return ((_a = message === null || message === void 0 ? void 0 : message.group) === null || _a === void 0 ? void 0 : _a.id) === (isObj ? (_b = threadObj === null || threadObj === void 0 ? void 0 : threadObj.group) === null || _b === void 0 ? void 0 : _b.id : threadObj);
|
|
114
|
+
}
|
|
115
|
+
else if (threadObj && threadObj !== types_1.SCPrivateMessageType.NEW) {
|
|
116
|
+
return messageReceiver(message, authUserId) === (isObj ? messageReceiver(threadObj, authUserId) : threadObj);
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
};
|
|
120
|
+
}, [threadObj, authUserId, _type]);
|
|
104
121
|
//HANDLERS
|
|
105
122
|
const handleChange = (event) => {
|
|
106
123
|
setSearch(event.target.value);
|
|
@@ -116,7 +133,9 @@ function PrivateMessageSnippets(inProps) {
|
|
|
116
133
|
snippetActions && snippetActions.onDeleteConfirm(msg);
|
|
117
134
|
};
|
|
118
135
|
function handleOpenThread(msg) {
|
|
119
|
-
|
|
136
|
+
const threadType = msg.group !== null ? types_1.SCPrivateMessageType.GROUP : types_1.SCPrivateMessageType.USER;
|
|
137
|
+
_setType(threadType);
|
|
138
|
+
snippetActions && snippetActions.onSnippetClick(msg, threadType);
|
|
120
139
|
handleClear();
|
|
121
140
|
updateSnippetsParams(msg.id, 'seen');
|
|
122
141
|
}
|
|
@@ -221,7 +240,6 @@ function PrivateMessageSnippets(inProps) {
|
|
|
221
240
|
} }),
|
|
222
241
|
react_1.default.createElement(material_1.List, null, filteredSnippets.map((message) => (react_1.default.createElement(PrivateMessageSnippetItem_1.default, { message: message, key: message.id, onItemClick: () => handleOpenThread(message), secondaryAction: react_1.default.createElement(react_1.default.Fragment, null,
|
|
223
242
|
message.thread_status === types_1.SCPrivateMessageStatusType.NEW && (react_1.default.createElement(material_1.Icon, { fontSize: "small", color: "secondary" }, "fiber_manual_record")),
|
|
224
|
-
!isMobile && (react_1.default.createElement(PrivateMessageSettingsIconButton_1.default, { threadToDelete: messageReceiver(message, authUserId), onItemDeleteConfirm: () => handleDeleteConversation(messageReceiver(message, authUserId)), user: messageReceiver(message, authUserId, true) }))), selected:
|
|
225
|
-
messageReceiver(message, authUserId) === (isObj ? messageReceiver(userObj, authUserId) : userObj) })))))))));
|
|
243
|
+
!isMobile && (react_1.default.createElement(PrivateMessageSettingsIconButton_1.default, { threadToDelete: messageReceiver(message, authUserId), onItemDeleteConfirm: () => handleDeleteConversation(messageReceiver(message, authUserId)), user: messageReceiver(message, authUserId, true) }))), selected: isSelected(message) })))))))));
|
|
226
244
|
}
|
|
227
245
|
exports.default = PrivateMessageSnippets;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { SCPrivateMessageType } from '@selfcommunity/types';
|
|
1
2
|
import { CardProps } from '@mui/material';
|
|
2
3
|
export interface PrivateMessageThreadProps extends CardProps {
|
|
3
4
|
/**
|
|
4
5
|
* Thread object or thread id
|
|
5
6
|
* default null
|
|
6
7
|
*/
|
|
7
|
-
|
|
8
|
+
threadObj?: any;
|
|
8
9
|
/**
|
|
9
10
|
* Overrides or extends the styles applied to the component.
|
|
10
11
|
* @default null
|
|
@@ -30,6 +31,10 @@ export interface PrivateMessageThreadProps extends CardProps {
|
|
|
30
31
|
* @default null
|
|
31
32
|
*/
|
|
32
33
|
onSingleMessageOpen?: (open: boolean) => void;
|
|
34
|
+
/**
|
|
35
|
+
* The Thread type
|
|
36
|
+
*/
|
|
37
|
+
type?: SCPrivateMessageType;
|
|
33
38
|
/**
|
|
34
39
|
* Any other properties
|
|
35
40
|
*/
|
|
@@ -43,6 +43,8 @@ const classes = {
|
|
|
43
43
|
newMessageContent: `${constants_1.PREFIX}-new-message-content`,
|
|
44
44
|
sender: `${constants_1.PREFIX}-sender`,
|
|
45
45
|
receiver: `${constants_1.PREFIX}-receiver`,
|
|
46
|
+
avatar: `${constants_1.PREFIX}-avatar`,
|
|
47
|
+
item: `${constants_1.PREFIX}-item`,
|
|
46
48
|
autocomplete: `${constants_1.PREFIX}-autocomplete`,
|
|
47
49
|
autocompleteDialog: `${constants_1.PREFIX}-autocomplete-dialog`,
|
|
48
50
|
editor: `${constants_1.PREFIX}-editor`
|
|
@@ -95,7 +97,7 @@ function PrivateMessageThread(inProps) {
|
|
|
95
97
|
props: inProps,
|
|
96
98
|
name: constants_1.PREFIX
|
|
97
99
|
});
|
|
98
|
-
const {
|
|
100
|
+
const { threadObj, openNewMessage = false, onNewMessageClose = null, onNewMessageSent = null, onSingleMessageOpen = null, className, type } = props, rest = tslib_1.__rest(props, ["threadObj", "openNewMessage", "onNewMessageClose", "onNewMessageSent", "onSingleMessageOpen", "className", "type"]);
|
|
99
101
|
// CONTEXT
|
|
100
102
|
const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
|
|
101
103
|
// STATE
|
|
@@ -106,7 +108,7 @@ function PrivateMessageThread(inProps) {
|
|
|
106
108
|
const [loading, setLoading] = (0, react_1.useState)(false);
|
|
107
109
|
const [isHovered, setIsHovered] = (0, react_1.useState)({});
|
|
108
110
|
const [followers, setFollowers] = (0, react_1.useState)([]);
|
|
109
|
-
const isNew =
|
|
111
|
+
const isNew = threadObj && threadObj === types_1.SCPrivateMessageStatusType.NEW;
|
|
110
112
|
const authUserId = scUserContext.user ? scUserContext.user.id : null;
|
|
111
113
|
const [singleMessageUser, setSingleMessageUser] = (0, react_1.useState)(null);
|
|
112
114
|
const [receiver, setReceiver] = (0, react_1.useState)(null);
|
|
@@ -115,7 +117,7 @@ function PrivateMessageThread(inProps) {
|
|
|
115
117
|
const [openDeleteMessageDialog, setOpenDeleteMessageDialog] = (0, react_1.useState)(false);
|
|
116
118
|
const [recipients, setRecipients] = (0, react_1.useState)([]);
|
|
117
119
|
const { enqueueSnackbar, closeSnackbar } = (0, notistack_1.useSnackbar)();
|
|
118
|
-
const isNumber = typeof
|
|
120
|
+
const isNumber = typeof threadObj === 'number';
|
|
119
121
|
const messageReceiver = (item, loggedUserId) => {
|
|
120
122
|
var _a, _b, _c;
|
|
121
123
|
return ((_a = item === null || item === void 0 ? void 0 : item.receiver) === null || _a === void 0 ? void 0 : _a.id) !== loggedUserId ? (_b = item === null || item === void 0 ? void 0 : item.receiver) === null || _b === void 0 ? void 0 : _b.id : (_c = item === null || item === void 0 ? void 0 : item.sender) === null || _c === void 0 ? void 0 : _c.id;
|
|
@@ -128,7 +130,7 @@ function PrivateMessageThread(inProps) {
|
|
|
128
130
|
// HOOKS
|
|
129
131
|
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
|
|
130
132
|
// @ts-ignore
|
|
131
|
-
const { scUser } = (0, react_core_1.useSCFetchUser)({ id:
|
|
133
|
+
const { scUser } = (0, react_core_1.useSCFetchUser)({ id: threadObj, threadObj });
|
|
132
134
|
const messagesEndRef = (0, react_1.useRef)(null);
|
|
133
135
|
const scrollToBottom = () => {
|
|
134
136
|
var _a;
|
|
@@ -256,9 +258,9 @@ function PrivateMessageThread(inProps) {
|
|
|
256
258
|
* Fetches thread
|
|
257
259
|
*/
|
|
258
260
|
function fetchThread() {
|
|
259
|
-
if (
|
|
261
|
+
if (threadObj && typeof threadObj !== 'string' && type !== types_1.SCPrivateMessageType.GROUP) {
|
|
260
262
|
setLoadingMessageObjs(true);
|
|
261
|
-
const _userObjId = isNumber ?
|
|
263
|
+
const _userObjId = isNumber ? threadObj : messageReceiver(threadObj, authUserId);
|
|
262
264
|
api_services_1.PrivateMessageService.getAThread({ user: _userObjId, limit: 10 })
|
|
263
265
|
.then((res) => {
|
|
264
266
|
setMessageObjs(res.results);
|
|
@@ -291,6 +293,20 @@ function PrivateMessageThread(inProps) {
|
|
|
291
293
|
utils_1.Logger.error(Errors_1.SCOPE_SC_UI, { error });
|
|
292
294
|
});
|
|
293
295
|
}
|
|
296
|
+
else if (type === types_1.SCPrivateMessageType.GROUP) {
|
|
297
|
+
api_services_1.PrivateMessageService.getAThread({ group: isNumber ? threadObj : threadObj.group.id, limit: 10 })
|
|
298
|
+
.then((res) => {
|
|
299
|
+
setMessageObjs(res.results);
|
|
300
|
+
setPrevious(res.next && updateAndDeleteURLParameters(res.next, 'before_message', res.results[0].id, 'offset'));
|
|
301
|
+
setLoadingMessageObjs(false);
|
|
302
|
+
setSingleMessageThread(false);
|
|
303
|
+
})
|
|
304
|
+
.catch((error) => {
|
|
305
|
+
setLoadingMessageObjs(false);
|
|
306
|
+
console.log(error);
|
|
307
|
+
utils_1.Logger.error(Errors_1.SCOPE_SC_UI, { error });
|
|
308
|
+
});
|
|
309
|
+
}
|
|
294
310
|
}
|
|
295
311
|
const isNewerThan60Seconds = (creationTime) => {
|
|
296
312
|
const date = new Date(creationTime);
|
|
@@ -355,11 +371,15 @@ function PrivateMessageThread(inProps) {
|
|
|
355
371
|
.request({
|
|
356
372
|
url: api_services_1.Endpoints.SendMessage.url(),
|
|
357
373
|
method: api_services_1.Endpoints.SendMessage.method,
|
|
358
|
-
data: {
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
374
|
+
data: Object.assign(Object.assign({}, (type === types_1.SCPrivateMessageType.GROUP
|
|
375
|
+
? { group: isNumber ? threadObj : threadObj.group.id }
|
|
376
|
+
: {
|
|
377
|
+
recipients: openNewMessage || isNew || singleMessageThread
|
|
378
|
+
? ids
|
|
379
|
+
: [isNumber && threadObj ? threadObj : messageReceiver(threadObj, authUserId)]
|
|
380
|
+
})), {
|
|
381
|
+
// recipients: openNewMessage || isNew || singleMessageThread ? ids : [isNumber && threadObj ? threadObj : messageReceiver(threadObj, authUserId)],
|
|
382
|
+
message: message, file_uuid: file && !message ? file : null })
|
|
363
383
|
})
|
|
364
384
|
.then((res) => {
|
|
365
385
|
const isOne = res.data.length <= 1;
|
|
@@ -405,13 +425,13 @@ function PrivateMessageThread(inProps) {
|
|
|
405
425
|
if (!authUserId) {
|
|
406
426
|
return;
|
|
407
427
|
}
|
|
408
|
-
if (
|
|
428
|
+
if (threadObj) {
|
|
409
429
|
fetchThread();
|
|
410
430
|
}
|
|
411
431
|
else {
|
|
412
432
|
reset();
|
|
413
433
|
}
|
|
414
|
-
}, [
|
|
434
|
+
}, [threadObj, authUserId, scUser]);
|
|
415
435
|
/**
|
|
416
436
|
* Notification subscriber
|
|
417
437
|
*/
|
|
@@ -426,7 +446,7 @@ function PrivateMessageThread(inProps) {
|
|
|
426
446
|
if (index !== -1) {
|
|
427
447
|
setMessageObjs((prev) => [...prev, res.notification_obj.message]);
|
|
428
448
|
}
|
|
429
|
-
if (isNumber ?
|
|
449
|
+
if (isNumber ? threadObj === res.thread_id : threadObj.id === res.thread_id) {
|
|
430
450
|
scrollToBottom();
|
|
431
451
|
}
|
|
432
452
|
};
|
|
@@ -453,11 +473,17 @@ function PrivateMessageThread(inProps) {
|
|
|
453
473
|
react_1.default.createElement("ul", null,
|
|
454
474
|
react_1.default.createElement(material_1.ListSubheader, null,
|
|
455
475
|
react_1.default.createElement(material_1.Typography, { align: "center", className: classes.subHeader }, key)),
|
|
456
|
-
formattedMessages[key].map((msg) =>
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
476
|
+
formattedMessages[key].map((msg) => {
|
|
477
|
+
var _a;
|
|
478
|
+
return (react_1.default.createElement(material_1.Box, { className: classes.item, key: msg.id },
|
|
479
|
+
msg.group && ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) !== msg.sender.username && (react_1.default.createElement(material_1.ListItemAvatar, null,
|
|
480
|
+
react_1.default.createElement(material_1.Avatar, { alt: msg.sender.username, src: msg.sender.avatar, className: classes.avatar }))),
|
|
481
|
+
react_1.default.createElement(PrivateMessageThreadItem_1.default, { className: authUserId === msg.sender.id ? classes.sender : classes.receiver, message: msg, key: msg.id, mouseEvents: {
|
|
482
|
+
onMouseEnter: () => handleMouseEnter(msg.id),
|
|
483
|
+
onMouseLeave: () => handleMouseLeave(msg.id)
|
|
484
|
+
}, isHovering: isHovered[msg.id], showMenuIcon: authUserId === msg.sender.id, onMenuIconClick: () => handleOpenDeleteMessageDialog(msg) })));
|
|
485
|
+
}))))))),
|
|
486
|
+
react_1.default.createElement(PrivateMessageEditor_1.default, { className: classes.editor, send: handleSend, autoHide: type !== types_1.SCPrivateMessageType.GROUP && !(scUser === null || scUser === void 0 ? void 0 : scUser.can_send_pm_to), autoHideDeletion: type === types_1.SCPrivateMessageType.USER && ((receiver === null || receiver === void 0 ? void 0 : receiver.deleted) || (scUser === null || scUser === void 0 ? void 0 : scUser.deleted)), onThreadChangeId: isNumber ? threadObj : type === types_1.SCPrivateMessageType.USER ? threadObj.receiver.id : threadObj.group.id, error: error, onErrorRemove: () => setError(false) }),
|
|
461
487
|
openDeleteMessageDialog && (react_1.default.createElement(ConfirmDialog_1.default, { open: openDeleteMessageDialog, title: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.privateMessage.component.delete.message.dialog.msg", defaultMessage: "ui.privateMessage.component.delete.message.dialog.msg" }), btnConfirm: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.privateMessage.component.delete.message.dialog.confirm", defaultMessage: "ui.privateMessage.component.delete.message.dialog.confirm" }), onConfirm: handleDeleteMessage, onClose: handleCloseDeleteMessageDialog }))));
|
|
462
488
|
}
|
|
463
489
|
/**
|
|
@@ -485,6 +511,6 @@ function PrivateMessageThread(inProps) {
|
|
|
485
511
|
/**
|
|
486
512
|
* Renders the component
|
|
487
513
|
*/
|
|
488
|
-
return (react_1.default.createElement(Root, Object.assign({}, rest, { className: (0, classnames_1.default)(classes.root, className) }),
|
|
514
|
+
return (react_1.default.createElement(Root, Object.assign({}, rest, { className: (0, classnames_1.default)(classes.root, className) }), threadObj !== null && !isNew && !singleMessageThread ? renderThread() : renderNewOrNoMessageBox()));
|
|
489
515
|
}
|
|
490
516
|
exports.default = PrivateMessageThread;
|
|
@@ -10,6 +10,7 @@ const types_1 = require("@selfcommunity/types");
|
|
|
10
10
|
const Icon_1 = tslib_1.__importDefault(require("@mui/material/Icon"));
|
|
11
11
|
const classnames_1 = tslib_1.__importDefault(require("classnames"));
|
|
12
12
|
const system_1 = require("@mui/system");
|
|
13
|
+
const react_core_1 = require("@selfcommunity/react-core");
|
|
13
14
|
const useMediaQuery_1 = tslib_1.__importDefault(require("@mui/material/useMediaQuery"));
|
|
14
15
|
const PrivateMessageSettingsIconButton_1 = tslib_1.__importDefault(require("../PrivateMessageSettingsIconButton"));
|
|
15
16
|
const sizeCoverter_1 = require("../../utils/sizeCoverter");
|
|
@@ -21,6 +22,7 @@ const constants_1 = require("./constants");
|
|
|
21
22
|
const thumbnailCoverter_1 = require("../../utils/thumbnailCoverter");
|
|
22
23
|
const classes = {
|
|
23
24
|
root: `${constants_1.PREFIX}-root`,
|
|
25
|
+
username: `${constants_1.PREFIX}-username`,
|
|
24
26
|
text: `${constants_1.PREFIX}-text`,
|
|
25
27
|
img: `${constants_1.PREFIX}-img`,
|
|
26
28
|
document: `${constants_1.PREFIX}-document`,
|
|
@@ -72,6 +74,7 @@ const Root = (0, styles_1.styled)(material_1.ListItem, {
|
|
|
72
74
|
* @param inProps
|
|
73
75
|
*/
|
|
74
76
|
function PrivateMessageThreadItem(inProps) {
|
|
77
|
+
var _a;
|
|
75
78
|
// PROPS
|
|
76
79
|
const props = (0, system_1.useThemeProps)({
|
|
77
80
|
props: inProps,
|
|
@@ -80,6 +83,8 @@ function PrivateMessageThreadItem(inProps) {
|
|
|
80
83
|
const { message = null, className = null, mouseEvents = {}, isHovering = null, showMenuIcon = false, onMenuIconClick = null } = props, rest = tslib_1.__rest(props, ["message", "className", "mouseEvents", "isHovering", "showMenuIcon", "onMenuIconClick"]);
|
|
81
84
|
// INTL
|
|
82
85
|
const intl = (0, react_intl_1.useIntl)();
|
|
86
|
+
// CONTEXT
|
|
87
|
+
const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
|
|
83
88
|
// STATE
|
|
84
89
|
const theme = (0, material_1.useTheme)();
|
|
85
90
|
const isMobile = (0, useMediaQuery_1.default)(theme.breakpoints.down('md'));
|
|
@@ -167,6 +172,7 @@ function PrivateMessageThreadItem(inProps) {
|
|
|
167
172
|
return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, getMouseEvents(mouseEvents.onMouseEnter, mouseEvents.onMouseLeave), rest, { secondaryAction: (isHovering || isMobile) &&
|
|
168
173
|
showMenuIcon &&
|
|
169
174
|
message.status !== types_1.SCPrivateMessageStatusType.HIDDEN && react_1.default.createElement(PrivateMessageSettingsIconButton_1.default, { onMenuItemDeleteClick: handleMenuItemClick }) }),
|
|
175
|
+
message.group && ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) !== message.sender.username && (react_1.default.createElement(material_1.Typography, { color: "secondary", variant: "h4", className: classes.username }, message.sender.username)),
|
|
170
176
|
react_1.default.createElement(react_1.default.Fragment, null,
|
|
171
177
|
hasFile && message.status !== types_1.SCPrivateMessageStatusType.HIDDEN ? (renderMessageFile(message)) : (react_1.default.createElement(material_1.Box, { className: classes.text },
|
|
172
178
|
react_1.default.createElement(material_1.Typography, { component: "span", dangerouslySetInnerHTML: { __html: message.message } }))),
|
|
@@ -75,6 +75,25 @@ function SearchAutocomplete(inProps) {
|
|
|
75
75
|
setOptions([]);
|
|
76
76
|
onClear && onClear();
|
|
77
77
|
};
|
|
78
|
+
const getOptionData = (option) => {
|
|
79
|
+
let data = {};
|
|
80
|
+
if (option.type === types_1.SuggestionType.USER) {
|
|
81
|
+
data.name = option[types_1.SuggestionType.USER]['username'];
|
|
82
|
+
data.image = option[types_1.SuggestionType.USER]['avatar'];
|
|
83
|
+
data.variant = 'circular';
|
|
84
|
+
}
|
|
85
|
+
else if (option.type === types_1.SuggestionType.CATEGORY) {
|
|
86
|
+
data.name = option[types_1.SuggestionType.CATEGORY]['name'];
|
|
87
|
+
data.image = option[types_1.SuggestionType.CATEGORY]['image_medium'];
|
|
88
|
+
data.variant = 'square';
|
|
89
|
+
}
|
|
90
|
+
else if (option.type === types_1.SuggestionType.GROUP) {
|
|
91
|
+
data.name = option[types_1.SuggestionType.GROUP]['name'];
|
|
92
|
+
data.image = option[types_1.SuggestionType.GROUP]['image_big'];
|
|
93
|
+
data.variant = 'circular';
|
|
94
|
+
}
|
|
95
|
+
return data;
|
|
96
|
+
};
|
|
78
97
|
function fetchResults() {
|
|
79
98
|
setIsLoading(true);
|
|
80
99
|
api_services_1.SuggestionService.getSearchSuggestion(value)
|
|
@@ -98,11 +117,9 @@ function SearchAutocomplete(inProps) {
|
|
|
98
117
|
return option;
|
|
99
118
|
}
|
|
100
119
|
return (_a = option[option.type]['username']) !== null && _a !== void 0 ? _a : option[option.type]['name'];
|
|
101
|
-
}, renderOption: (props, option) => (react_1.default.createElement(material_1.Box, Object.assign({ component: "li" }, props),
|
|
102
|
-
react_1.default.createElement(material_1.Avatar, { alt: option
|
|
103
|
-
react_1.default.createElement(material_1.Typography, { ml: 1 }, option
|
|
104
|
-
react_1.default.createElement(material_1.Avatar, { alt: option[types_1.SuggestionType.CATEGORY]['name'], src: option[types_1.SuggestionType.CATEGORY]['image_medium'], variant: "square" }),
|
|
105
|
-
react_1.default.createElement(material_1.Typography, { ml: 1 }, option[types_1.SuggestionType.CATEGORY]['name']))))), renderInput: (params) => (react_1.default.createElement(material_1.TextField, Object.assign({}, params, { placeholder: `${intl.formatMessage(messages.placeholder, {
|
|
120
|
+
}, renderOption: (props, option) => (react_1.default.createElement(material_1.Box, Object.assign({ component: "li" }, props),
|
|
121
|
+
react_1.default.createElement(material_1.Avatar, { alt: getOptionData(option).name, src: getOptionData(option).image, variant: getOptionData(option).variant }),
|
|
122
|
+
react_1.default.createElement(material_1.Typography, { ml: 1 }, getOptionData(option).name))), renderInput: (params) => (react_1.default.createElement(material_1.TextField, Object.assign({}, params, { placeholder: `${intl.formatMessage(messages.placeholder, {
|
|
106
123
|
community: scPreferences.preferences[react_core_1.SCPreferences.TEXT_APPLICATION_NAME].value
|
|
107
124
|
})}`, InputProps: Object.assign(Object.assign({}, params.InputProps), { autoFocus, name: 'search-autocomplete', className: classes.input, startAdornment: react_1.default.createElement(Icon_1.default, { className: classes.icon }, "search"), endAdornment: (react_1.default.createElement(material_1.Fade, { in: value.length > 0 || Boolean(onClear), appear: false },
|
|
108
125
|
react_1.default.createElement(material_1.IconButton, { className: classes.clear, onClick: handleClear, size: "small" },
|
|
@@ -33,6 +33,7 @@ const system_1 = require("@mui/system");
|
|
|
33
33
|
const Contribution_1 = tslib_1.__importDefault(require("../Notification/Contribution"));
|
|
34
34
|
const NotificationItem_1 = tslib_1.__importDefault(require("../../shared/NotificationItem"));
|
|
35
35
|
const constants_1 = require("./constants");
|
|
36
|
+
const Group_1 = tslib_1.__importDefault(require("../Notification/Group"));
|
|
36
37
|
const classes = {
|
|
37
38
|
root: `${constants_1.PREFIX}-root`,
|
|
38
39
|
notificationsWrap: `${constants_1.PREFIX}-notifications-wrap`,
|
|
@@ -254,6 +255,12 @@ function SnippetNotifications(inProps) {
|
|
|
254
255
|
else if (type === types_2.SCNotificationTypologyType.CONTRIBUTION) {
|
|
255
256
|
content = react_1.default.createElement(Contribution_1.default, { notificationObject: n, key: i, template: types_1.SCNotificationObjectTemplateType.SNIPPET });
|
|
256
257
|
}
|
|
258
|
+
else if (n.type === types_2.SCNotificationTypologyType.USER_ADDED_TO_GROUP ||
|
|
259
|
+
n.type === types_2.SCNotificationTypologyType.USER_INVITED_TO_JOIN_GROUP ||
|
|
260
|
+
n.type === types_2.SCNotificationTypologyType.USER_ACCEPTED_TO_JOIN_GROUP ||
|
|
261
|
+
n.type === types_2.SCNotificationTypologyType.USER_REQUESTED_TO_JOIN_GROUP) {
|
|
262
|
+
return react_1.default.createElement(Group_1.default, { notificationObject: n, key: i, template: types_1.SCNotificationObjectTemplateType.SNIPPET });
|
|
263
|
+
}
|
|
257
264
|
if (type && handleNotification) {
|
|
258
265
|
/** Override content */
|
|
259
266
|
content = handleNotification(type, n, content);
|
|
@@ -24,6 +24,7 @@ const Message_1 = tslib_1.__importDefault(require("../BroadcastMessages/Message"
|
|
|
24
24
|
const system_1 = require("@mui/system");
|
|
25
25
|
const Contribution_1 = tslib_1.__importDefault(require("../Notification/Contribution"));
|
|
26
26
|
const constants_1 = require("./constants");
|
|
27
|
+
const Group_1 = tslib_1.__importDefault(require("../Notification/Group"));
|
|
27
28
|
const Root = (0, styles_1.styled)(material_1.Box, {
|
|
28
29
|
name: constants_1.PREFIX,
|
|
29
30
|
slot: 'Root'
|
|
@@ -111,6 +112,12 @@ function UserToastNotifications(inProps) {
|
|
|
111
112
|
else if (type === types_1.SCNotificationTypologyType.CONTRIBUTION) {
|
|
112
113
|
content = react_1.default.createElement(Contribution_1.default, { notificationObject: n.notification_obj, template: types_2.SCNotificationObjectTemplateType.TOAST });
|
|
113
114
|
}
|
|
115
|
+
else if (type === types_1.SCNotificationTypologyType.USER_ADDED_TO_GROUP ||
|
|
116
|
+
type === types_1.SCNotificationTypologyType.USER_INVITED_TO_JOIN_GROUP ||
|
|
117
|
+
type === types_1.SCNotificationTypologyType.USER_ACCEPTED_TO_JOIN_GROUP ||
|
|
118
|
+
type === types_1.SCNotificationTypologyType.USER_REQUESTED_TO_JOIN_GROUP) {
|
|
119
|
+
content = react_1.default.createElement(Group_1.default, { notificationObject: n.notification_obj, template: types_2.SCNotificationObjectTemplateType.TOAST });
|
|
120
|
+
}
|
|
114
121
|
}
|
|
115
122
|
if (n.activity_type && n.activity_type === types_1.SCNotificationTypologyType.NOTIFICATION_BANNER) {
|
|
116
123
|
/** Notification of type: 'notification_banner' */
|
|
@@ -34,6 +34,11 @@ export interface UserProps extends WidgetProps {
|
|
|
34
34
|
* Badge content to show as user avatar badge if show reaction is true.
|
|
35
35
|
*/
|
|
36
36
|
badgeContent?: any;
|
|
37
|
+
/**
|
|
38
|
+
* If true, shows a custom label next to the user username
|
|
39
|
+
* @default false
|
|
40
|
+
*/
|
|
41
|
+
isGroupAdmin?: boolean;
|
|
37
42
|
/**
|
|
38
43
|
* Prop to add actions
|
|
39
44
|
* @default null
|
|
@@ -43,7 +48,7 @@ export interface UserProps extends WidgetProps {
|
|
|
43
48
|
* Props to spread to the button
|
|
44
49
|
* @default {}
|
|
45
50
|
*/
|
|
46
|
-
buttonProps?: ButtonBaseProps;
|
|
51
|
+
buttonProps?: ButtonBaseProps | null;
|
|
47
52
|
/**
|
|
48
53
|
* Any other properties
|
|
49
54
|
*/
|
|
@@ -23,7 +23,8 @@ const messages = (0, react_intl_1.defineMessages)({
|
|
|
23
23
|
const classes = {
|
|
24
24
|
root: `${constants_1.PREFIX}-root`,
|
|
25
25
|
avatar: `${constants_1.PREFIX}-avatar`,
|
|
26
|
-
staffBadgeLabel: `${constants_1.PREFIX}-staff-badge-label
|
|
26
|
+
staffBadgeLabel: `${constants_1.PREFIX}-staff-badge-label`,
|
|
27
|
+
groupAdminBadgeLabel: `${constants_1.PREFIX}-group-admin-badge-label`
|
|
27
28
|
};
|
|
28
29
|
const Root = (0, styles_1.styled)(BaseItemButton_1.default, {
|
|
29
30
|
name: constants_1.PREFIX,
|
|
@@ -66,7 +67,7 @@ function User(inProps) {
|
|
|
66
67
|
props: inProps,
|
|
67
68
|
name: constants_1.PREFIX
|
|
68
69
|
});
|
|
69
|
-
const { userId = null, user = null, handleIgnoreAction, className = null, followConnectUserButtonProps = {}, showFollowers = false, elevation, badgeContent = null, actions = null, buttonProps =
|
|
70
|
+
const { userId = null, user = null, handleIgnoreAction, className = null, followConnectUserButtonProps = {}, showFollowers = false, elevation, badgeContent = null, actions = null, isGroupAdmin = false, buttonProps = null } = props, rest = tslib_1.__rest(props, ["userId", "user", "handleIgnoreAction", "className", "followConnectUserButtonProps", "showFollowers", "elevation", "badgeContent", "actions", "isGroupAdmin", "buttonProps"]);
|
|
70
71
|
// STATE
|
|
71
72
|
const { scUser, setSCUser } = (0, react_core_1.useSCFetchUser)({ id: userId, user });
|
|
72
73
|
// CONTEXT
|
|
@@ -106,9 +107,9 @@ function User(inProps) {
|
|
|
106
107
|
? { onClick: () => setOpenAlert(true) }
|
|
107
108
|
: { component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, scUser) }), image: badgeContent ? (react_1.default.createElement(material_1.Badge, { overlap: "circular", anchorOrigin: { vertical: 'bottom', horizontal: 'right' }, badgeContent: badgeContent },
|
|
108
109
|
react_1.default.createElement(material_1.Avatar, { alt: scUser.username, src: scUser.avatar, className: classes.avatar }))) : (react_1.default.createElement(UserAvatar_1.default, { hide: !hasBadge },
|
|
109
|
-
react_1.default.createElement(material_1.Avatar, { alt: scUser.username, src: scUser.avatar, className: classes.avatar }))), primary: hasBadge && preferences ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
110
|
+
react_1.default.createElement(material_1.Avatar, { alt: scUser.username, src: scUser.avatar, className: classes.avatar }))), primary: (hasBadge && preferences) || isGroupAdmin ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
110
111
|
scUser.username,
|
|
111
|
-
react_1.default.createElement(material_1.Chip, { component: "span", className: classes.staffBadgeLabel, size: "small", label: preferences[react_core_1.SCPreferences.STAFF_STAFF_BADGE_LABEL] }))) : (scUser.username), secondary: showFollowers ? `${intl.formatMessage(messages.userFollowers, { total: scUser.followers_counter })}` : scUser.description, actions: actions !== null && actions !== void 0 ? actions : renderAuthenticatedActions() })),
|
|
112
|
+
react_1.default.createElement(material_1.Chip, { component: "span", className: isGroupAdmin ? classes.groupAdminBadgeLabel : classes.staffBadgeLabel, size: "small", label: isGroupAdmin ? (react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.user.group.admin", id: "ui.user.group.admin" })) : (preferences[react_core_1.SCPreferences.STAFF_STAFF_BADGE_LABEL]) }))) : (scUser.username), secondary: showFollowers ? `${intl.formatMessage(messages.userFollowers, { total: scUser.followers_counter })}` : scUser.description, actions: actions !== null && actions !== void 0 ? actions : renderAuthenticatedActions() })),
|
|
112
113
|
openAlert && react_1.default.createElement(UserDeletedSnackBar_1.default, { open: openAlert, handleClose: () => setOpenAlert(false) })));
|
|
113
114
|
}
|
|
114
115
|
exports.default = User;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* > API documentation for the Community-JS User Profile Categories Followed Widget Skeleton component. Learn about the available props and the CSS API.
|
|
3
|
+
|
|
4
|
+
#### Import
|
|
5
|
+
|
|
6
|
+
```jsx
|
|
7
|
+
import {UserSubscribedGroupsWidgetSkeleton} from '@selfcommunity/react-ui';
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
#### Component Name
|
|
11
|
+
|
|
12
|
+
The name `SCUserCategoriesFollowedWidget-skeleton-root` can be used when providing style overrides in the theme.
|
|
13
|
+
|
|
14
|
+
#### CSS
|
|
15
|
+
|
|
16
|
+
|Rule Name|Global class|Description|
|
|
17
|
+
|---|---|---|
|
|
18
|
+
|root|.SCUserSubscribedGroupsWidget-skeleton-root|Styles applied to the root element.|
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
export default function UserSubscribedGroupsWidgetSkeleton(props: any): JSX.Element;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const react_1 = tslib_1.__importDefault(require("react"));
|
|
5
|
+
const Widget_1 = tslib_1.__importDefault(require("../Widget"));
|
|
6
|
+
const styles_1 = require("@mui/material/styles");
|
|
7
|
+
const material_1 = require("@mui/material");
|
|
8
|
+
const List_1 = tslib_1.__importDefault(require("@mui/material/List"));
|
|
9
|
+
const Skeleton_1 = tslib_1.__importDefault(require("../Group/Skeleton"));
|
|
10
|
+
const PREFIX = 'SCUserSubscribedGroupsWidgetSkeleton';
|
|
11
|
+
const classes = {
|
|
12
|
+
root: `${PREFIX}-skeleton-root`,
|
|
13
|
+
list: `${PREFIX}-list`
|
|
14
|
+
};
|
|
15
|
+
const Root = (0, styles_1.styled)(Widget_1.default, {
|
|
16
|
+
name: PREFIX,
|
|
17
|
+
slot: 'SkeletonRoot'
|
|
18
|
+
})(() => ({}));
|
|
19
|
+
/**
|
|
20
|
+
* > API documentation for the Community-JS User Profile Categories Followed Widget Skeleton component. Learn about the available props and the CSS API.
|
|
21
|
+
|
|
22
|
+
#### Import
|
|
23
|
+
|
|
24
|
+
```jsx
|
|
25
|
+
import {UserSubscribedGroupsWidgetSkeleton} from '@selfcommunity/react-ui';
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
#### Component Name
|
|
29
|
+
|
|
30
|
+
The name `SCUserCategoriesFollowedWidget-skeleton-root` can be used when providing style overrides in the theme.
|
|
31
|
+
|
|
32
|
+
#### CSS
|
|
33
|
+
|
|
34
|
+
|Rule Name|Global class|Description|
|
|
35
|
+
|---|---|---|
|
|
36
|
+
|root|.SCUserSubscribedGroupsWidget-skeleton-root|Styles applied to the root element.|
|
|
37
|
+
*
|
|
38
|
+
*/
|
|
39
|
+
function UserSubscribedGroupsWidgetSkeleton(props) {
|
|
40
|
+
return (react_1.default.createElement(Root, Object.assign({ className: classes.root }, props),
|
|
41
|
+
react_1.default.createElement(material_1.CardContent, null,
|
|
42
|
+
react_1.default.createElement(List_1.default, { className: classes.list }, [...Array(3)].map((category, index) => (react_1.default.createElement(material_1.ListItem, { key: index },
|
|
43
|
+
react_1.default.createElement(Skeleton_1.default, { elevation: 0 })))))),
|
|
44
|
+
");"));
|
|
45
|
+
}
|
|
46
|
+
exports.default = UserSubscribedGroupsWidgetSkeleton;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { CacheStrategies } from '@selfcommunity/utils';
|
|
2
|
+
import { BaseDialogProps } from '../../shared/BaseDialog';
|
|
3
|
+
import { WidgetProps } from '../Widget';
|
|
4
|
+
import { VirtualScrollerItemProps } from '../../types/virtualScroller';
|
|
5
|
+
import { GroupProps } from '../Group';
|
|
6
|
+
export interface UserSubscribedGroupsWidgetProps extends VirtualScrollerItemProps, WidgetProps {
|
|
7
|
+
/**
|
|
8
|
+
* The user id
|
|
9
|
+
* @default null
|
|
10
|
+
*/
|
|
11
|
+
userId: number;
|
|
12
|
+
/**
|
|
13
|
+
* Hides this component
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
16
|
+
autoHide?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Limit the number of groups to show
|
|
19
|
+
* @default false
|
|
20
|
+
*/
|
|
21
|
+
limit?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Props to spread to single group object
|
|
24
|
+
* @default empty object
|
|
25
|
+
*/
|
|
26
|
+
GroupProps?: GroupProps;
|
|
27
|
+
/**
|
|
28
|
+
* Caching strategies
|
|
29
|
+
* @default CacheStrategies.CACHE_FIRST
|
|
30
|
+
*/
|
|
31
|
+
cacheStrategy?: CacheStrategies;
|
|
32
|
+
/**
|
|
33
|
+
* Props to spread to subscribed groups dialog
|
|
34
|
+
* @default {}
|
|
35
|
+
*/
|
|
36
|
+
DialogProps?: BaseDialogProps;
|
|
37
|
+
/**
|
|
38
|
+
* Other props
|
|
39
|
+
*/
|
|
40
|
+
[p: string]: any;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* > API documentation for the Community-JS User Profile Groups Subscribed Widget component. Learn about the available props and the CSS API.
|
|
44
|
+
*
|
|
45
|
+
*
|
|
46
|
+
* This component renders the list of the groups that the given user follows.
|
|
47
|
+
* Take a look at our <strong>demo</strong> component [here](/docs/sdk/community-js/react-ui/Components/UserSubscribedGroups)
|
|
48
|
+
|
|
49
|
+
#### Import
|
|
50
|
+
```jsx
|
|
51
|
+
import {UserSubscribedGroupsWidget} from '@selfcommunity/react-ui';
|
|
52
|
+
```
|
|
53
|
+
#### Component Name
|
|
54
|
+
The name `SCUserSubscribedGroupsWidget` can be used when providing style overrides in the theme.
|
|
55
|
+
|
|
56
|
+
#### CSS
|
|
57
|
+
|
|
58
|
+
|Rule Name|Global class|Description|
|
|
59
|
+
|---|---|---|
|
|
60
|
+
|root|.SCUserSubscribedGroupsWidget-root|Styles applied to the root element.|
|
|
61
|
+
|title|.SCUserSubscribedGroupsWidget-title|Styles applied to the title element.|
|
|
62
|
+
|noResults|.SCUserSubscribedGroupsWidget-no-results|Styles applied to no results section.|
|
|
63
|
+
|showMore|.SCUserSubscribedGroupsWidget-show-more|Styles applied to show more button element.|
|
|
64
|
+
|dialogRoot|.SCUserSubscribedGroupsWidget-dialog-root|Styles applied to the root dialog element.|
|
|
65
|
+
|endMessage|.SCUserSubscribedGroupsWidget-end-message|Styles applied to the end message element.|
|
|
66
|
+
* @param inProps
|
|
67
|
+
*/
|
|
68
|
+
export default function UserSubscribedGroupsWidget(inProps: UserSubscribedGroupsWidgetProps): JSX.Element;
|