@selfcommunity/react-ui 0.7.9-alpha.5 → 0.7.9-alpha.50
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/CategoryHeader/Skeleton.js +3 -2
- 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.js +3 -3
- package/lib/cjs/components/Composer/Composer.js +3 -5
- package/lib/cjs/components/Composer/Content/ContentPost/ContentPost.js +4 -3
- package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +2 -3
- package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +8 -9
- package/lib/cjs/components/EditGroupButton/EditGroupButton.js +4 -0
- package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
- package/lib/cjs/components/FeedObject/FeedObject.js +23 -6
- package/lib/cjs/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
- package/lib/cjs/components/Group/Group.d.ts +3 -0
- package/lib/cjs/components/Group/Group.js +16 -4
- package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
- package/lib/cjs/components/GroupForm/GroupForm.js +31 -9
- package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
- package/lib/cjs/components/GroupHeader/GroupHeader.js +53 -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 +40 -7
- package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +33 -46
- 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 +7 -2
- 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 +145 -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 +31 -10
- package/lib/cjs/components/Groups/Groups.d.ts +19 -16
- package/lib/cjs/components/Groups/Groups.js +89 -85
- package/lib/cjs/components/Groups/Skeleton.d.ts +4 -0
- package/lib/cjs/components/Groups/Skeleton.js +2 -2
- package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
- package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
- package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
- package/lib/cjs/components/Notification/Group/Group.d.ts +15 -0
- package/lib/cjs/components/Notification/Group/Group.js +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 +1 -1
- package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +12 -7
- package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
- package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
- package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +24 -6
- package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
- package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +45 -20
- package/lib/cjs/components/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/constants/PubSub.d.ts +28 -0
- package/lib/cjs/constants/PubSub.js +22 -0
- package/lib/cjs/index.d.ts +5 -2
- package/lib/cjs/index.js +12 -4
- package/lib/esm/components/CategoryHeader/Skeleton.js +3 -2
- 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.js +3 -3
- package/lib/esm/components/Composer/Composer.js +3 -5
- package/lib/esm/components/Composer/Content/ContentPost/ContentPost.js +4 -3
- package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +2 -3
- package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +8 -9
- package/lib/esm/components/EditGroupButton/EditGroupButton.js +5 -1
- package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
- package/lib/esm/components/FeedObject/FeedObject.js +24 -7
- package/lib/esm/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
- package/lib/esm/components/Group/Group.d.ts +3 -0
- package/lib/esm/components/Group/Group.js +18 -6
- package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
- package/lib/esm/components/GroupForm/GroupForm.js +31 -9
- package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
- package/lib/esm/components/GroupHeader/GroupHeader.js +55 -13
- 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 +40 -7
- package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +33 -46
- 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 +8 -3
- 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 +142 -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 +32 -11
- package/lib/esm/components/Groups/Groups.d.ts +19 -16
- package/lib/esm/components/Groups/Groups.js +94 -90
- package/lib/esm/components/Groups/Skeleton.d.ts +4 -0
- package/lib/esm/components/Groups/Skeleton.js +2 -2
- package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
- package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
- package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
- package/lib/esm/components/Notification/Group/Group.d.ts +15 -0
- package/lib/esm/components/Notification/Group/Group.js +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 +1 -1
- package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +13 -8
- package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
- package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
- package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
- package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
- package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +47 -22
- package/lib/esm/components/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/constants/PubSub.d.ts +28 -0
- package/lib/esm/constants/PubSub.js +19 -0
- package/lib/esm/index.d.ts +5 -2
- package/lib/esm/index.js +7 -4
- package/lib/umd/react-ui.js +1 -1
- package/package.json +6 -6
|
@@ -15,10 +15,12 @@ const ChangeGroupPicture_1 = tslib_1.__importDefault(require("../ChangeGroupPict
|
|
|
15
15
|
const ChangeGroupCover_1 = tslib_1.__importDefault(require("../ChangeGroupCover"));
|
|
16
16
|
const Group_1 = require("../../constants/Group");
|
|
17
17
|
const GroupInviteButton_1 = tslib_1.__importDefault(require("../GroupInviteButton"));
|
|
18
|
+
const pubsub_js_1 = tslib_1.__importDefault(require("pubsub-js"));
|
|
18
19
|
const types_1 = require("@selfcommunity/types");
|
|
19
20
|
const Errors_1 = require("../../constants/Errors");
|
|
20
21
|
const api_services_1 = require("@selfcommunity/api-services");
|
|
21
22
|
const utils_1 = require("@selfcommunity/utils");
|
|
23
|
+
const PubSub_1 = require("../../constants/PubSub");
|
|
22
24
|
const messages = (0, react_intl_1.defineMessages)({
|
|
23
25
|
name: {
|
|
24
26
|
id: 'ui.groupForm.name.placeholder',
|
|
@@ -142,6 +144,22 @@ function GroupForm(inProps) {
|
|
|
142
144
|
setError(error);
|
|
143
145
|
}
|
|
144
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Notify when a group info changed
|
|
149
|
+
* @param data
|
|
150
|
+
*/
|
|
151
|
+
function notifyChanges(data) {
|
|
152
|
+
if (data) {
|
|
153
|
+
if (group) {
|
|
154
|
+
// Edit group
|
|
155
|
+
pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.EDIT}`, data);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
// Create group
|
|
159
|
+
pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.CREATE}`, data);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
145
163
|
const handleSubmit = () => {
|
|
146
164
|
setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: true })));
|
|
147
165
|
const formData = new FormData();
|
|
@@ -155,8 +173,10 @@ function GroupForm(inProps) {
|
|
|
155
173
|
if (field.emotionalImageOriginalFile) {
|
|
156
174
|
formData.append('emotional_image_original', field.emotionalImageOriginalFile);
|
|
157
175
|
}
|
|
158
|
-
|
|
159
|
-
|
|
176
|
+
if (!group) {
|
|
177
|
+
for (const key in field.invitedUsers) {
|
|
178
|
+
formData.append(key, field.invitedUsers[key]);
|
|
179
|
+
}
|
|
160
180
|
}
|
|
161
181
|
let groupService;
|
|
162
182
|
if (group) {
|
|
@@ -168,6 +188,7 @@ function GroupForm(inProps) {
|
|
|
168
188
|
groupService
|
|
169
189
|
.then((data) => {
|
|
170
190
|
onSuccess && onSuccess(data);
|
|
191
|
+
notifyChanges(data);
|
|
171
192
|
onClose && onClose();
|
|
172
193
|
setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: false })));
|
|
173
194
|
})
|
|
@@ -215,25 +236,26 @@ function GroupForm(inProps) {
|
|
|
215
236
|
react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isPublic }) },
|
|
216
237
|
react_1.default.createElement(material_1.Icon, null, "private"),
|
|
217
238
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private", defaultMessage: "ui.groupForm.privacy.private" })),
|
|
218
|
-
react_1.default.createElement(material_1.Switch, { className: classes.switch, checked: field.isPublic,
|
|
239
|
+
react_1.default.createElement(material_1.Switch, { className: classes.switch, checked: field.isPublic, onChange: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['isPublic']: !field.isPublic }))), disabled: group && group.privacy === types_1.SCGroupPrivacyType.PRIVATE }),
|
|
219
240
|
react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: field.isPublic }) },
|
|
220
241
|
react_1.default.createElement(material_1.Icon, null, "public"),
|
|
221
242
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.public", defaultMessage: "ui.groupForm.privacy.public" }))),
|
|
222
|
-
react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.privacySectionInfo }, field.isPublic ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.public.info", defaultMessage: "ui.groupForm.privacy.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private.info", defaultMessage: "ui.groupForm.private.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })))),
|
|
223
|
-
react_1.default.createElement(material_1.Box, { className: classes.visibilitySection }, !field.isPublic && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
243
|
+
react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.privacySectionInfo }, field.isPublic ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.public.info", defaultMessage: "ui.groupForm.privacy.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })) : (react_1.default.createElement(react_1.default.Fragment, null, group && group.privacy === types_1.SCGroupPrivacyType.PRIVATE ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private.info.edit", defaultMessage: "ui.groupForm.private.public.info.edit", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private.info", defaultMessage: "ui.groupForm.private.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })))))),
|
|
244
|
+
react_1.default.createElement(material_1.Box, { className: classes.visibilitySection }, ((!field.isPublic && !group) || (group && !field.isPublic)) && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
224
245
|
react_1.default.createElement(material_1.Typography, { variant: "h4" },
|
|
225
246
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.title", defaultMessage: "ui.groupForm.visibility.title", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })),
|
|
226
247
|
react_1.default.createElement(material_1.Stack, { direction: "row", spacing: 1, alignItems: "center" },
|
|
227
248
|
react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isVisible }) },
|
|
228
249
|
react_1.default.createElement(material_1.Icon, null, "visibility_off"),
|
|
229
250
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.hidden", defaultMessage: "ui.groupForm.visibility.hidden" })),
|
|
230
|
-
react_1.default.createElement(material_1.Switch, { className: classes.switch, checked: field.isVisible,
|
|
251
|
+
react_1.default.createElement(material_1.Switch, { className: classes.switch, checked: field.isVisible, onChange: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['isVisible']: !field.isVisible }))) }),
|
|
231
252
|
react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: field.isVisible }) },
|
|
232
253
|
react_1.default.createElement(material_1.Icon, null, "visibility"),
|
|
233
254
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.visible", defaultMessage: "ui.groupForm.visibility.visible" }))),
|
|
234
255
|
react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.visibilitySectionInfo }, !field.isVisible ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.hidden.info", defaultMessage: "ui.groupForm.visibility.hidden.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.visible.info", defaultMessage: "ui.groupForm.visibility.visible.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } }))))))),
|
|
235
|
-
react_1.default.createElement(
|
|
236
|
-
|
|
237
|
-
react_1.default.createElement(
|
|
256
|
+
!group && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
257
|
+
react_1.default.createElement(material_1.Divider, null),
|
|
258
|
+
react_1.default.createElement(material_1.Box, { className: classes.inviteSection },
|
|
259
|
+
react_1.default.createElement(GroupInviteButton_1.default, { handleInvitations: handleInviteSection })))))));
|
|
238
260
|
}
|
|
239
261
|
exports.default = GroupForm;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
1
|
import { SCGroupType } from '@selfcommunity/types';
|
|
3
2
|
import { ChangeGroupCoverProps } from '../ChangeGroupCover';
|
|
4
3
|
import { ChangeGroupPictureProps } from '../ChangeGroupPicture';
|
|
5
4
|
import { GroupMembersButtonProps } from '../GroupMembersButton';
|
|
5
|
+
import { GroupSubscribeButtonProps } from '../GroupSubscribeButton';
|
|
6
6
|
export interface GroupHeaderProps {
|
|
7
7
|
/**
|
|
8
8
|
* Id of group object
|
|
@@ -35,14 +35,15 @@ export interface GroupHeaderProps {
|
|
|
35
35
|
*/
|
|
36
36
|
ChangeCoverProps?: ChangeGroupCoverProps;
|
|
37
37
|
/**
|
|
38
|
-
* Props to spread
|
|
38
|
+
* Props to spread group button followed
|
|
39
39
|
* @default {}
|
|
40
40
|
*/
|
|
41
|
-
|
|
41
|
+
GroupSubscribeButtonProps?: GroupSubscribeButtonProps;
|
|
42
42
|
/**
|
|
43
|
-
*
|
|
43
|
+
* Props to spread to the group memebers button
|
|
44
|
+
* @default {}
|
|
44
45
|
*/
|
|
45
|
-
|
|
46
|
+
GroupMembersButtonProps?: GroupMembersButtonProps;
|
|
46
47
|
/**
|
|
47
48
|
* Any other properties
|
|
48
49
|
*/
|
|
@@ -16,6 +16,10 @@ const Bullet_1 = tslib_1.__importDefault(require("../../shared/Bullet"));
|
|
|
16
16
|
const ChangeGroupPicture_1 = tslib_1.__importDefault(require("../ChangeGroupPicture"));
|
|
17
17
|
const GroupMembersButton_1 = tslib_1.__importDefault(require("../GroupMembersButton"));
|
|
18
18
|
const EditGroupButton_1 = tslib_1.__importDefault(require("../EditGroupButton"));
|
|
19
|
+
const GroupSubscribeButton_1 = tslib_1.__importDefault(require("../GroupSubscribeButton"));
|
|
20
|
+
const GroupInviteButton_1 = tslib_1.__importDefault(require("../GroupInviteButton"));
|
|
21
|
+
const PubSub_1 = require("../../constants/PubSub");
|
|
22
|
+
const pubsub_js_1 = tslib_1.__importDefault(require("pubsub-js"));
|
|
19
23
|
const classes = {
|
|
20
24
|
root: `${constants_1.PREFIX}-root`,
|
|
21
25
|
cover: `${constants_1.PREFIX}-cover`,
|
|
@@ -72,22 +76,24 @@ function GroupHeader(inProps) {
|
|
|
72
76
|
props: inProps,
|
|
73
77
|
name: constants_1.PREFIX
|
|
74
78
|
});
|
|
75
|
-
const { id = null, className = null, group, groupId = null, ChangePictureProps = {}, ChangeCoverProps = {},
|
|
79
|
+
const { id = null, className = null, group, groupId = null, ChangePictureProps = {}, ChangeCoverProps = {}, GroupSubscribeButtonProps = {}, GroupMembersButtonProps = {} } = props, rest = tslib_1.__rest(props, ["id", "className", "group", "groupId", "ChangePictureProps", "ChangeCoverProps", "GroupSubscribeButtonProps", "GroupMembersButtonProps"]);
|
|
76
80
|
// PREFERENCES
|
|
77
81
|
const scPreferences = (0, react_core_1.useSCPreferences)();
|
|
78
82
|
// CONTEXT
|
|
79
83
|
const scUserContext = (0, react_core_1.useSCUser)();
|
|
80
84
|
// HOOKS
|
|
81
85
|
const { scGroup, setSCGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
|
|
86
|
+
// REFS
|
|
87
|
+
const updatesSubscription = (0, react_1.useRef)(null);
|
|
82
88
|
// CONST
|
|
83
|
-
const
|
|
89
|
+
const isGroupAdmin = (0, react_1.useMemo)(() => { var _a; return scUserContext.user && ((_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id) === scUserContext.user.id; }, [scUserContext.user, (_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id]);
|
|
84
90
|
/**
|
|
85
91
|
* Handles Change Avatar
|
|
86
92
|
* @param avatar
|
|
87
93
|
*/
|
|
88
94
|
function handleChangeAvatar(avatar) {
|
|
89
|
-
if (
|
|
90
|
-
setSCGroup(Object.assign({}, scGroup, {
|
|
95
|
+
if (isGroupAdmin) {
|
|
96
|
+
setSCGroup(Object.assign({}, scGroup, { image_big: avatar }));
|
|
91
97
|
}
|
|
92
98
|
}
|
|
93
99
|
/**
|
|
@@ -95,10 +101,44 @@ function GroupHeader(inProps) {
|
|
|
95
101
|
* @param cover
|
|
96
102
|
*/
|
|
97
103
|
function handleChangeCover(cover) {
|
|
98
|
-
if (
|
|
104
|
+
if (isGroupAdmin) {
|
|
99
105
|
setSCGroup(Object.assign({}, scGroup, { emotional_image: cover }));
|
|
100
106
|
}
|
|
101
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Handles callback subscribe/unsubscribe group
|
|
110
|
+
*/
|
|
111
|
+
const handleSubscribe = (group, status) => {
|
|
112
|
+
setSCGroup(Object.assign(Object.assign({}, group), { subscribers_counter: group.subscribers_counter + (status ? 1 : -1) }));
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Subscriber for pubsub callback
|
|
116
|
+
*/
|
|
117
|
+
const onChangeGroupMembersHandler = (0, react_1.useCallback)((msg, data) => {
|
|
118
|
+
var _a;
|
|
119
|
+
if (data && ((_a = data === null || data === void 0 ? void 0 : data.group) === null || _a === void 0 ? void 0 : _a.id) === (scGroup === null || scGroup === void 0 ? void 0 : scGroup.id)) {
|
|
120
|
+
let _group = Object.assign({}, scGroup);
|
|
121
|
+
if (msg === `${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.ADD_MEMBER}`) {
|
|
122
|
+
_group.subscribers_counter = _group.subscribers_counter + 1;
|
|
123
|
+
}
|
|
124
|
+
else if (msg === `${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.REMOVE_MEMBER}`) {
|
|
125
|
+
_group.subscribers_counter = Math.max(_group.subscribers_counter - 1, 0);
|
|
126
|
+
}
|
|
127
|
+
console.log(_group);
|
|
128
|
+
setSCGroup(_group);
|
|
129
|
+
}
|
|
130
|
+
}, [scGroup, setSCGroup]);
|
|
131
|
+
/**
|
|
132
|
+
* On mount, subscribe to receive groups updates (only edit)
|
|
133
|
+
*/
|
|
134
|
+
(0, react_1.useEffect)(() => {
|
|
135
|
+
if (scGroup) {
|
|
136
|
+
updatesSubscription.current = pubsub_js_1.default.subscribe(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.MEMBERS}`, onChangeGroupMembersHandler);
|
|
137
|
+
}
|
|
138
|
+
return () => {
|
|
139
|
+
updatesSubscription.current && pubsub_js_1.default.unsubscribe(updatesSubscription.current);
|
|
140
|
+
};
|
|
141
|
+
}, [scGroup]);
|
|
102
142
|
// RENDER
|
|
103
143
|
if (!scGroup) {
|
|
104
144
|
return react_1.default.createElement(Skeleton_1.default, null);
|
|
@@ -110,13 +150,13 @@ function GroupHeader(inProps) {
|
|
|
110
150
|
react_1.default.createElement(material_1.Paper, { style: _backgroundCover, classes: { root: classes.cover } },
|
|
111
151
|
react_1.default.createElement(material_1.Box, { className: classes.avatar },
|
|
112
152
|
react_1.default.createElement(material_1.Avatar, null,
|
|
113
|
-
react_1.default.createElement("img", { alt: "group", src: scGroup.
|
|
114
|
-
|
|
153
|
+
react_1.default.createElement("img", { alt: "group", src: scGroup.image_big ? scGroup.image_big : '' }))),
|
|
154
|
+
isGroupAdmin && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
115
155
|
react_1.default.createElement(ChangeGroupPicture_1.default, Object.assign({ groupId: scGroup.id, onChange: handleChangeAvatar, className: classes.changePicture }, ChangePictureProps)),
|
|
116
156
|
react_1.default.createElement("div", { className: classes.changeCover },
|
|
117
157
|
react_1.default.createElement(ChangeGroupCover_1.default, Object.assign({ groupId: scGroup.id, onChange: handleChangeCover }, ChangeCoverProps)))))),
|
|
118
158
|
react_1.default.createElement(material_1.Box, { className: classes.info },
|
|
119
|
-
|
|
159
|
+
isGroupAdmin && react_1.default.createElement(EditGroupButton_1.default, { group: scGroup, groupId: scGroup.id, onEditSuccess: (data) => setSCGroup(data) }),
|
|
120
160
|
react_1.default.createElement(material_1.Typography, { variant: "h5", className: classes.name }, scGroup.name),
|
|
121
161
|
react_1.default.createElement(material_1.Box, { className: classes.visibility },
|
|
122
162
|
scGroup.privacy === types_1.SCGroupPrivacyType.PUBLIC ? (react_1.default.createElement(material_1.Typography, { className: classes.visibilityItem },
|
|
@@ -130,10 +170,12 @@ function GroupHeader(inProps) {
|
|
|
130
170
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupHeader.visibility.visible", defaultMessage: "ui.groupHeader.visibility.visible" }))) : (react_1.default.createElement(material_1.Typography, { className: classes.visibilityItem },
|
|
131
171
|
react_1.default.createElement(material_1.Icon, null, "visibility_off"),
|
|
132
172
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupHeader.visibility.hidden", defaultMessage: "ui.groupHeader.visibility.hidden" })))),
|
|
133
|
-
react_1.default.createElement(
|
|
173
|
+
react_1.default.createElement(react_1.default.Fragment, null, ((scGroup && scGroup.privacy === types_1.SCGroupPrivacyType.PUBLIC) ||
|
|
174
|
+
scGroup.subscription_status === types_1.SCGroupSubscriptionStatusType.SUBSCRIBED ||
|
|
175
|
+
isGroupAdmin) && (react_1.default.createElement(material_1.Box, { className: classes.members },
|
|
134
176
|
react_1.default.createElement(material_1.Typography, { className: classes.membersCounter, component: "div" },
|
|
135
177
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupHeader.members", defaultMessage: "ui.groupHeader.members", values: { total: scGroup.subscribers_counter } })),
|
|
136
|
-
react_1.default.createElement(GroupMembersButton_1.default, Object.assign({ groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, group: scGroup }, GroupMembersButtonProps))),
|
|
137
|
-
|
|
178
|
+
react_1.default.createElement(GroupMembersButton_1.default, Object.assign({ key: scGroup.subscribers_counter, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, group: scGroup, autoHide: !isGroupAdmin }, GroupMembersButtonProps))))),
|
|
179
|
+
isGroupAdmin ? (react_1.default.createElement(GroupInviteButton_1.default, { group: scGroup, groupId: scGroup.id })) : (react_1.default.createElement(GroupSubscribeButton_1.default, Object.assign({ group: scGroup, onSubscribe: handleSubscribe }, GroupSubscribeButtonProps))))));
|
|
138
180
|
}
|
|
139
181
|
exports.default = GroupHeader;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* > API documentation for the Community-JS Group
|
|
2
|
+
* > API documentation for the Community-JS Group Header Skeleton component. Learn about the available props and the CSS API.
|
|
3
3
|
|
|
4
4
|
#### Import
|
|
5
5
|
|
|
@@ -18,9 +18,7 @@
|
|
|
18
18
|
|root|.SCGroupHeader-skeleton-root|Styles applied to the root element.|
|
|
19
19
|
|avatar|.SCGroupHeader-avatar|Styles applied to the avatar element.|
|
|
20
20
|
|cover|.SCGroupHeader-cover|Styles applied to the cover element.|
|
|
21
|
-
|
|
|
22
|
-
|section|.SCGroupHeader-section|Styles applied to the info section.|
|
|
23
|
-
|username|.SCGroupHeader-username|Styles applied to the username element.|
|
|
21
|
+
|info|.SCGroupHeader-info|Styles applied to the info info.|
|
|
24
22
|
*
|
|
25
23
|
*/
|
|
26
24
|
declare function GroupHeaderSkeleton(): JSX.Element;
|
|
@@ -10,16 +10,14 @@ const classes = {
|
|
|
10
10
|
root: `${constants_1.PREFIX}-skeleton-root`,
|
|
11
11
|
cover: `${constants_1.PREFIX}-cover`,
|
|
12
12
|
avatar: `${constants_1.PREFIX}-avatar`,
|
|
13
|
-
|
|
14
|
-
section: `${constants_1.PREFIX}-section`,
|
|
15
|
-
username: `${constants_1.PREFIX}-username`
|
|
13
|
+
info: `${constants_1.PREFIX}-info`
|
|
16
14
|
};
|
|
17
15
|
const Root = (0, styles_1.styled)(material_1.Box, {
|
|
18
16
|
name: constants_1.PREFIX,
|
|
19
17
|
slot: 'SkeletonRoot'
|
|
20
18
|
})(() => ({}));
|
|
21
19
|
/**
|
|
22
|
-
* > API documentation for the Community-JS Group
|
|
20
|
+
* > API documentation for the Community-JS Group Header Skeleton component. Learn about the available props and the CSS API.
|
|
23
21
|
|
|
24
22
|
#### Import
|
|
25
23
|
|
|
@@ -38,9 +36,7 @@ const Root = (0, styles_1.styled)(material_1.Box, {
|
|
|
38
36
|
|root|.SCGroupHeader-skeleton-root|Styles applied to the root element.|
|
|
39
37
|
|avatar|.SCGroupHeader-avatar|Styles applied to the avatar element.|
|
|
40
38
|
|cover|.SCGroupHeader-cover|Styles applied to the cover element.|
|
|
41
|
-
|
|
|
42
|
-
|section|.SCGroupHeader-section|Styles applied to the info section.|
|
|
43
|
-
|username|.SCGroupHeader-username|Styles applied to the username element.|
|
|
39
|
+
|info|.SCGroupHeader-info|Styles applied to the info info.|
|
|
44
40
|
*
|
|
45
41
|
*/
|
|
46
42
|
function GroupHeaderSkeleton() {
|
|
@@ -49,8 +45,12 @@ function GroupHeaderSkeleton() {
|
|
|
49
45
|
react_1.default.createElement(Skeleton_1.default, { className: classes.cover, animation: "wave", variant: "rectangular" }),
|
|
50
46
|
react_1.default.createElement(material_1.Box, { className: classes.avatar },
|
|
51
47
|
react_1.default.createElement(Skeleton_1.default, { animation: "wave", variant: "circular", width: theme.selfcommunity.group.avatar.sizeLarge, height: theme.selfcommunity.group.avatar.sizeLarge })),
|
|
52
|
-
react_1.default.createElement(material_1.Box, { className: classes.
|
|
53
|
-
react_1.default.createElement(material_1.Typography, { variant: "h5"
|
|
54
|
-
react_1.default.createElement(Skeleton_1.default, { animation: "wave", sx: { height: 30, width:
|
|
48
|
+
react_1.default.createElement(material_1.Box, { className: classes.info },
|
|
49
|
+
react_1.default.createElement(material_1.Typography, { variant: "h5" },
|
|
50
|
+
react_1.default.createElement(Skeleton_1.default, { animation: "wave", sx: { height: 30, width: 200 } })),
|
|
51
|
+
react_1.default.createElement(material_1.Typography, null,
|
|
52
|
+
react_1.default.createElement(Skeleton_1.default, { animation: "wave", sx: { height: 20, width: 150 } })),
|
|
53
|
+
react_1.default.createElement(material_1.Typography, null,
|
|
54
|
+
react_1.default.createElement(Skeleton_1.default, { animation: "wave", sx: { height: 20, width: 100 } })))));
|
|
55
55
|
}
|
|
56
56
|
exports.default = GroupHeaderSkeleton;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
|
-
const react_1 = tslib_1.
|
|
4
|
+
const react_1 = tslib_1.__importStar(require("react"));
|
|
5
5
|
const styles_1 = require("@mui/material/styles");
|
|
6
6
|
const material_1 = require("@mui/material");
|
|
7
7
|
const classnames_1 = tslib_1.__importDefault(require("classnames"));
|
|
@@ -10,7 +10,10 @@ const system_1 = require("@mui/system");
|
|
|
10
10
|
const constants_1 = require("./constants");
|
|
11
11
|
const react_intl_1 = require("react-intl");
|
|
12
12
|
const types_1 = require("@selfcommunity/types");
|
|
13
|
+
const pubsub_js_1 = tslib_1.__importDefault(require("pubsub-js"));
|
|
13
14
|
const react_core_1 = require("@selfcommunity/react-core");
|
|
15
|
+
const Skeleton_1 = tslib_1.__importDefault(require("./Skeleton"));
|
|
16
|
+
const PubSub_1 = require("../../constants/PubSub");
|
|
14
17
|
const classes = {
|
|
15
18
|
root: `${constants_1.PREFIX}-root`,
|
|
16
19
|
title: `${constants_1.PREFIX}-title`,
|
|
@@ -19,6 +22,7 @@ const classes = {
|
|
|
19
22
|
privacyTitle: `${constants_1.PREFIX}-privacy-title`,
|
|
20
23
|
visibility: `${constants_1.PREFIX}-visibility`,
|
|
21
24
|
visibilityTitle: `${constants_1.PREFIX}-visibility-title`,
|
|
25
|
+
admin: `${constants_1.PREFIX}-admin`,
|
|
22
26
|
date: `${constants_1.PREFIX}-date`
|
|
23
27
|
};
|
|
24
28
|
const Root = (0, styles_1.styled)(Widget_1.default, {
|
|
@@ -61,9 +65,36 @@ function GroupInfoWidget(inProps) {
|
|
|
61
65
|
});
|
|
62
66
|
const { className, group, groupId, onHeightChange, onStateChange } = props, rest = tslib_1.__rest(props, ["className", "group", "groupId", "onHeightChange", "onStateChange"]);
|
|
63
67
|
// HOOKS
|
|
64
|
-
const { scGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
|
|
68
|
+
const { scGroup, setSCGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
|
|
65
69
|
// INTL
|
|
66
70
|
const intl = (0, react_intl_1.useIntl)();
|
|
71
|
+
// REFS
|
|
72
|
+
const updatesSubscription = (0, react_1.useRef)(null);
|
|
73
|
+
/**
|
|
74
|
+
* Subscriber for pubsub callback
|
|
75
|
+
*/
|
|
76
|
+
const onChangeGroupHandler = (0, react_1.useCallback)((_msg, data) => {
|
|
77
|
+
if (data && scGroup.id === data.id) {
|
|
78
|
+
setSCGroup(data);
|
|
79
|
+
}
|
|
80
|
+
}, [scGroup, setSCGroup]);
|
|
81
|
+
/**
|
|
82
|
+
* On mount, subscribe to receive groups updates (only edit)
|
|
83
|
+
*/
|
|
84
|
+
(0, react_1.useEffect)(() => {
|
|
85
|
+
if (scGroup) {
|
|
86
|
+
updatesSubscription.current = pubsub_js_1.default.subscribe(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.EDIT}`, onChangeGroupHandler);
|
|
87
|
+
}
|
|
88
|
+
return () => {
|
|
89
|
+
updatesSubscription.current && pubsub_js_1.default.unsubscribe(updatesSubscription.current);
|
|
90
|
+
};
|
|
91
|
+
}, [scGroup]);
|
|
92
|
+
/**
|
|
93
|
+
* Loading group
|
|
94
|
+
*/
|
|
95
|
+
if (!scGroup) {
|
|
96
|
+
return react_1.default.createElement(Skeleton_1.default, null);
|
|
97
|
+
}
|
|
67
98
|
/**
|
|
68
99
|
* Renders root object
|
|
69
100
|
*/
|
|
@@ -75,14 +106,14 @@ function GroupInfoWidget(inProps) {
|
|
|
75
106
|
react_1.default.createElement(material_1.Typography, { component: "div", className: classes.privacy }, scGroup.privacy === types_1.SCGroupPrivacyType.PUBLIC ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
76
107
|
react_1.default.createElement(material_1.Typography, { className: classes.privacyTitle },
|
|
77
108
|
react_1.default.createElement(material_1.Icon, null, "public"),
|
|
78
|
-
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.
|
|
109
|
+
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.privacy.public", defaultMessage: "ui.groupInfoWidget.privacy.public" })),
|
|
79
110
|
react_1.default.createElement(material_1.Typography, { variant: "body2" },
|
|
80
|
-
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.
|
|
111
|
+
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.privacy.public.info", defaultMessage: "ui.groupInfoWidget.privacy.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })))) : (react_1.default.createElement(react_1.default.Fragment, null,
|
|
81
112
|
react_1.default.createElement(material_1.Typography, { className: classes.privacyTitle },
|
|
82
113
|
react_1.default.createElement(material_1.Icon, null, "private"),
|
|
83
|
-
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.
|
|
114
|
+
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.privacy.private", defaultMessage: "ui.groupInfoWidget.privacy.private" })),
|
|
84
115
|
react_1.default.createElement(material_1.Typography, { variant: "body2" },
|
|
85
|
-
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.
|
|
116
|
+
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.privacy.private.info", defaultMessage: "ui.groupInfoWidget.private.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } }))))),
|
|
86
117
|
scGroup.privacy === types_1.SCGroupPrivacyType.PRIVATE && (react_1.default.createElement(material_1.Typography, { component: "div", className: classes.visibility }, scGroup.visible ? (react_1.default.createElement(react_1.default.Fragment, null,
|
|
87
118
|
react_1.default.createElement(material_1.Typography, { className: classes.visibilityTitle },
|
|
88
119
|
react_1.default.createElement(material_1.Icon, null, "visibility"),
|
|
@@ -95,6 +126,8 @@ function GroupInfoWidget(inProps) {
|
|
|
95
126
|
react_1.default.createElement(material_1.Typography, { variant: "body2" },
|
|
96
127
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.hidden.info", defaultMessage: "ui.groupForm.visibility.hidden.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })))))),
|
|
97
128
|
react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.date },
|
|
98
|
-
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.date", defaultMessage: "ui.groupInfoWidget.date", values: { date: intl.formatDate(scGroup.created_at, { day: 'numeric', year: 'numeric', month: 'long' }) } }))
|
|
129
|
+
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.date", defaultMessage: "ui.groupInfoWidget.date", values: { date: intl.formatDate(scGroup.created_at, { day: 'numeric', year: 'numeric', month: 'long' }) } })),
|
|
130
|
+
react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.admin },
|
|
131
|
+
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.admin", defaultMessage: "ui.groupInfoWidget.admin", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks), admin: scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by.username } })))));
|
|
99
132
|
}
|
|
100
133
|
exports.default = GroupInfoWidget;
|
|
@@ -15,6 +15,8 @@ const Autocomplete_1 = tslib_1.__importDefault(require("@mui/material/Autocomple
|
|
|
15
15
|
const User_1 = tslib_1.__importDefault(require("../User"));
|
|
16
16
|
const Errors_1 = require("../../constants/Errors");
|
|
17
17
|
const utils_1 = require("@selfcommunity/utils");
|
|
18
|
+
const PubSub_1 = require("../../constants/PubSub");
|
|
19
|
+
const pubsub_js_1 = tslib_1.__importDefault(require("pubsub-js"));
|
|
18
20
|
const messages = (0, react_intl_1.defineMessages)({
|
|
19
21
|
placeholder: {
|
|
20
22
|
id: 'ui.groupInviteButton.searchBar.placeholder',
|
|
@@ -86,16 +88,25 @@ function GroupInviteButton(inProps) {
|
|
|
86
88
|
const [open, setOpen] = (0, react_1.useState)(false);
|
|
87
89
|
const [isSending, setIsSending] = (0, react_1.useState)(false);
|
|
88
90
|
const [value, setValue] = (0, react_1.useState)('');
|
|
89
|
-
const [suggested, setSuggested] = (0, react_1.useState)([]);
|
|
90
91
|
const [list, setList] = (0, react_1.useState)([]);
|
|
91
92
|
const [loading, setLoading] = (0, react_1.useState)(false);
|
|
92
93
|
const [invited, setInvited] = (0, react_1.useState)([]);
|
|
94
|
+
/**
|
|
95
|
+
* Notify UI when a member is invited to a group
|
|
96
|
+
* @param group
|
|
97
|
+
* @param usersInvited
|
|
98
|
+
*/
|
|
99
|
+
function notifyChanges(group, usersInvited) {
|
|
100
|
+
if (group && usersInvited) {
|
|
101
|
+
pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.INVITE_MEMBER}`, usersInvited);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
93
104
|
function convertToInvitedUsersObject(data) {
|
|
94
|
-
const
|
|
105
|
+
const invite_users = {};
|
|
95
106
|
data.forEach((user, index) => {
|
|
96
|
-
|
|
107
|
+
invite_users[`invite_users[${index}]`] = user.id;
|
|
97
108
|
});
|
|
98
|
-
return
|
|
109
|
+
return invite_users;
|
|
99
110
|
}
|
|
100
111
|
/**
|
|
101
112
|
* Memoized users invited ids
|
|
@@ -110,27 +121,22 @@ function GroupInviteButton(inProps) {
|
|
|
110
121
|
}, [invited]);
|
|
111
122
|
// HOOKS
|
|
112
123
|
const { scGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
|
|
113
|
-
const
|
|
124
|
+
const isGroupAdmin = (0, react_1.useMemo)(() => { var _a; return scUserContext.user && ((_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id) === scUserContext.user.id; }, [scUserContext.user, (_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _a === void 0 ? void 0 : _a.id]);
|
|
114
125
|
// INTL
|
|
115
126
|
const intl = (0, react_intl_1.useIntl)();
|
|
116
127
|
function fetchResults() {
|
|
117
128
|
setLoading(true);
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
.
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
function fetchGeneralResults() {
|
|
129
|
-
setLoading(true);
|
|
130
|
-
api_services_1.GroupService.getGroupsSuggestedUsers(value)
|
|
129
|
+
let service;
|
|
130
|
+
if (scGroup) {
|
|
131
|
+
service = api_services_1.GroupService.getGroupSuggestedUsers(scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
service = api_services_1.GroupService.getGroupsSuggestedUsers(value);
|
|
135
|
+
}
|
|
136
|
+
service
|
|
131
137
|
.then((data) => {
|
|
132
138
|
setLoading(false);
|
|
133
|
-
|
|
139
|
+
setList(data.results);
|
|
134
140
|
})
|
|
135
141
|
.catch((error) => {
|
|
136
142
|
setLoading(false);
|
|
@@ -138,28 +144,8 @@ function GroupInviteButton(inProps) {
|
|
|
138
144
|
});
|
|
139
145
|
}
|
|
140
146
|
(0, react_1.useEffect)(() => {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
setLoading(false);
|
|
144
|
-
setList(data.results);
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
api_services_1.GroupService.getGroupsSuggestedUsers(value).then((data) => {
|
|
149
|
-
setLoading(false);
|
|
150
|
-
setList(data.results);
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
}, [scGroup === null || scGroup === void 0 ? void 0 : scGroup.id]);
|
|
154
|
-
/**
|
|
155
|
-
* If a value is entered in new message field, it fetches user suggested
|
|
156
|
-
*/
|
|
157
|
-
(0, react_1.useEffect)(() => {
|
|
158
|
-
if (value && !handleInvitations) {
|
|
159
|
-
fetchResults();
|
|
160
|
-
}
|
|
161
|
-
fetchGeneralResults();
|
|
162
|
-
}, [value, handleInvitations]);
|
|
147
|
+
fetchResults();
|
|
148
|
+
}, [scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value]);
|
|
163
149
|
/**
|
|
164
150
|
* Handles dialog close
|
|
165
151
|
*/
|
|
@@ -182,6 +168,7 @@ function GroupInviteButton(inProps) {
|
|
|
182
168
|
setIsSending(false);
|
|
183
169
|
setOpen(false);
|
|
184
170
|
setInvited([]);
|
|
171
|
+
notifyChanges(scGroup, invited);
|
|
185
172
|
})
|
|
186
173
|
.catch((error) => {
|
|
187
174
|
setOpen(false);
|
|
@@ -195,7 +182,7 @@ function GroupInviteButton(inProps) {
|
|
|
195
182
|
switch (reason) {
|
|
196
183
|
case 'input':
|
|
197
184
|
setValue(value);
|
|
198
|
-
!value &&
|
|
185
|
+
!value && setList([]);
|
|
199
186
|
break;
|
|
200
187
|
case 'reset':
|
|
201
188
|
setValue(value);
|
|
@@ -226,9 +213,9 @@ function GroupInviteButton(inProps) {
|
|
|
226
213
|
setList((prev) => [...prev, option]);
|
|
227
214
|
};
|
|
228
215
|
/**
|
|
229
|
-
* If
|
|
216
|
+
* If in group edit mode and logged-in user is not also the group manager, the component is hidden.
|
|
230
217
|
// */
|
|
231
|
-
if (!
|
|
218
|
+
if (group && !isGroupAdmin) {
|
|
232
219
|
return null;
|
|
233
220
|
}
|
|
234
221
|
/**
|
|
@@ -242,10 +229,10 @@ function GroupInviteButton(inProps) {
|
|
|
242
229
|
react_1.default.createElement(material_1.Icon, { fontSize: "medium" }, "arrow_back")),
|
|
243
230
|
react_1.default.createElement(material_1.Typography, { className: classes.dialogTitle },
|
|
244
231
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInviteButton.dialog.title", defaultMessage: "ui.groupInviteButton.dialog.title" })),
|
|
245
|
-
react_1.default.createElement(lab_1.LoadingButton, { size: "small", color: "secondary", variant: "contained", onClick: handleSendInvitations, loading: isSending },
|
|
232
|
+
react_1.default.createElement(lab_1.LoadingButton, { size: "small", color: "secondary", variant: "contained", onClick: handleSendInvitations, loading: isSending, disabled: !invited.length },
|
|
246
233
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInviteButton.dialog.button.end", defaultMessage: "ui.groupInviteButton.dialog.button.end" }))) },
|
|
247
234
|
react_1.default.createElement(material_1.Box, { className: classes.dialogContent },
|
|
248
|
-
react_1.default.createElement(Autocomplete_1.default, { className: classes.autocomplete, loading: loading, size: "small", multiple: true, freeSolo: true, disableClearable: true, options:
|
|
235
|
+
react_1.default.createElement(Autocomplete_1.default, { className: classes.autocomplete, loading: loading, size: "small", multiple: true, freeSolo: true, disableClearable: true, options: list, onChange: handleChange, onInputChange: handleInputChange, inputValue: value, value: invited, getOptionLabel: (option) => (option ? option.username : '...'), isOptionEqualToValue: (option, value) => (option ? value.id === option.id : false), renderTags: () => null, renderOption: (props, option) => (react_1.default.createElement(material_1.Box, Object.assign({ component: "li" }, props),
|
|
249
236
|
react_1.default.createElement(material_1.Avatar, { alt: option.username, src: option.avatar }),
|
|
250
237
|
react_1.default.createElement(material_1.Typography, { ml: 1 }, option.username))), renderInput: (params) => (react_1.default.createElement(material_1.TextField, Object.assign({}, params, { variant: "outlined", placeholder: `${intl.formatMessage(messages.placeholder)}`, InputProps: Object.assign(Object.assign({}, params.InputProps), { className: classes.input, startAdornment: (react_1.default.createElement(react_1.default.Fragment, null,
|
|
251
238
|
react_1.default.createElement(material_1.InputAdornment, { position: "start" },
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { WidgetProps } from '../Widget';
|
|
2
|
+
import { SCGroupType } from '@selfcommunity/types';
|
|
3
|
+
import { CacheStrategies } from '@selfcommunity/utils';
|
|
4
|
+
import { BaseDialogProps } from '../../shared/BaseDialog';
|
|
5
|
+
import { VirtualScrollerItemProps } from '../../types/virtualScroller';
|
|
6
|
+
import { UserProps } from '../User';
|
|
7
|
+
export interface GroupInvitedWidgetProps extends VirtualScrollerItemProps, WidgetProps {
|
|
8
|
+
/**
|
|
9
|
+
* Group Object
|
|
10
|
+
* @default null
|
|
11
|
+
*/
|
|
12
|
+
group?: SCGroupType;
|
|
13
|
+
/**
|
|
14
|
+
* Id of the group
|
|
15
|
+
* @default null
|
|
16
|
+
*/
|
|
17
|
+
groupId?: number | string;
|
|
18
|
+
/**
|
|
19
|
+
* Limit the number of users to show
|
|
20
|
+
* @default false
|
|
21
|
+
*/
|
|
22
|
+
limit?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Caching strategies
|
|
25
|
+
* @default CacheStrategies.CACHE_FIRST
|
|
26
|
+
*/
|
|
27
|
+
cacheStrategy?: CacheStrategies;
|
|
28
|
+
/**
|
|
29
|
+
* Props to spread to single user object
|
|
30
|
+
* @default empty object
|
|
31
|
+
*/
|
|
32
|
+
UserProps?: UserProps;
|
|
33
|
+
/**
|
|
34
|
+
* Props to spread to followers users dialog
|
|
35
|
+
* @default {}
|
|
36
|
+
*/
|
|
37
|
+
DialogProps?: BaseDialogProps;
|
|
38
|
+
/**
|
|
39
|
+
* Other props
|
|
40
|
+
*/
|
|
41
|
+
[p: string]: any;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* > API documentation for the Community-JS Group Invited Widget component. Learn about the available props and the CSS API.
|
|
45
|
+
*
|
|
46
|
+
*
|
|
47
|
+
* This component renders the list of the follows of the given group.
|
|
48
|
+
* Take a look at our <strong>demo</strong> component [here](/docs/sdk/community-js/react-ui/Components/GroupRequests)
|
|
49
|
+
|
|
50
|
+
#### Import
|
|
51
|
+
|
|
52
|
+
```jsx
|
|
53
|
+
import {GroupInvitedWidget} from '@selfcommunity/react-ui';
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
#### Component Name
|
|
57
|
+
|
|
58
|
+
The name `SCGroupInvitedWidget` can be used when providing style overrides in the theme.
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
#### CSS
|
|
62
|
+
|
|
63
|
+
|Rule Name|Global class|Description|
|
|
64
|
+
|---|---|---|
|
|
65
|
+
|root|.SCGroupInvitedWidget-root|Styles applied to the root element.|
|
|
66
|
+
|title|.SCGroupInvitedWidget-title|Styles applied to the title element.|
|
|
67
|
+
|noResults|.SCGroupInvitedWidget-no-results|Styles applied to no results section.|
|
|
68
|
+
|showMore|.SCGroupInvitedWidget-show-more|Styles applied to show more button element.|
|
|
69
|
+
|dialogRoot|.SCGroupInvitedWidget-dialog-root|Styles applied to the dialog root element.|
|
|
70
|
+
|endMessage|.SCGroupInvitedWidget-end-message|Styles applied to the end message element.|
|
|
71
|
+
|
|
72
|
+
* @param inProps
|
|
73
|
+
*/
|
|
74
|
+
export default function GroupInvitedWidget(inProps: GroupInvitedWidgetProps): JSX.Element;
|