@selfcommunity/react-ui 0.7.9-alpha.6 → 0.7.9-alpha.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/components/BottomNavigation/BottomNavigation.js +2 -2
- 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 -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/FeedObject/Contributors/Contributors.js +1 -1
- 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 +8 -0
- package/lib/cjs/components/Group/Group.js +40 -5
- package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
- package/lib/cjs/components/GroupForm/GroupForm.js +33 -10
- 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 +40 -7
- package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +33 -11
- 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 +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 +30 -11
- package/lib/cjs/components/Groups/Groups.d.ts +19 -16
- package/lib/cjs/components/Groups/Groups.js +85 -86
- 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/NavigationToolbar/NavigationToolbar.js +1 -1
- package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +5 -0
- package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +11 -4
- 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/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 -2
- package/lib/cjs/index.js +15 -4
- package/lib/esm/components/BottomNavigation/BottomNavigation.js +2 -2
- 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 -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/FeedObject/Contributors/Contributors.js +1 -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 +8 -0
- package/lib/esm/components/Group/Group.js +44 -9
- package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
- package/lib/esm/components/GroupForm/GroupForm.js +33 -10
- 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 +40 -7
- package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +33 -11
- 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 +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 +30 -11
- package/lib/esm/components/Groups/Groups.d.ts +19 -16
- package/lib/esm/components/Groups/Groups.js +90 -91
- 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/NavigationToolbar/NavigationToolbar.js +1 -1
- package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +5 -0
- package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +13 -6
- 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/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 -2
- package/lib/esm/index.js +8 -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',
|
|
@@ -90,6 +92,7 @@ const Root = (0, styles_1.styled)(BaseDialog_1.default, {
|
|
|
90
92
|
* @param inProps
|
|
91
93
|
*/
|
|
92
94
|
function GroupForm(inProps) {
|
|
95
|
+
var _a;
|
|
93
96
|
//PROPS
|
|
94
97
|
const props = (0, system_1.useThemeProps)({
|
|
95
98
|
props: inProps,
|
|
@@ -142,6 +145,22 @@ function GroupForm(inProps) {
|
|
|
142
145
|
setError(error);
|
|
143
146
|
}
|
|
144
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Notify when a group info changed
|
|
150
|
+
* @param data
|
|
151
|
+
*/
|
|
152
|
+
function notifyChanges(data) {
|
|
153
|
+
if (data) {
|
|
154
|
+
if (group) {
|
|
155
|
+
// Edit group
|
|
156
|
+
pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.EDIT}`, data);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// Create group
|
|
160
|
+
pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.CREATE}`, data);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
145
164
|
const handleSubmit = () => {
|
|
146
165
|
setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: true })));
|
|
147
166
|
const formData = new FormData();
|
|
@@ -155,8 +174,10 @@ function GroupForm(inProps) {
|
|
|
155
174
|
if (field.emotionalImageOriginalFile) {
|
|
156
175
|
formData.append('emotional_image_original', field.emotionalImageOriginalFile);
|
|
157
176
|
}
|
|
158
|
-
|
|
159
|
-
|
|
177
|
+
if (!group) {
|
|
178
|
+
for (const key in field.invitedUsers) {
|
|
179
|
+
formData.append(key, field.invitedUsers[key]);
|
|
180
|
+
}
|
|
160
181
|
}
|
|
161
182
|
let groupService;
|
|
162
183
|
if (group) {
|
|
@@ -168,6 +189,7 @@ function GroupForm(inProps) {
|
|
|
168
189
|
groupService
|
|
169
190
|
.then((data) => {
|
|
170
191
|
onSuccess && onSuccess(data);
|
|
192
|
+
notifyChanges(data);
|
|
171
193
|
onClose && onClose();
|
|
172
194
|
setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: false })));
|
|
173
195
|
})
|
|
@@ -206,7 +228,7 @@ function GroupForm(inProps) {
|
|
|
206
228
|
endAdornment: react_1.default.createElement(material_1.Typography, { variant: "body2" }, Group_1.GROUP_TITLE_MAX_LENGTH - field.name.length)
|
|
207
229
|
} }),
|
|
208
230
|
react_1.default.createElement(material_1.TextField, { multiline: true, className: classes.description, placeholder: `${intl.formatMessage(messages.description)}`, margin: "normal", value: field.description, name: "description", onChange: handleChange, InputProps: {
|
|
209
|
-
endAdornment: react_1.default.createElement(material_1.Typography, { variant: "body2" }, Group_1.GROUP_DESCRIPTION_MAX_LENGTH - field.description.length)
|
|
231
|
+
endAdornment: (react_1.default.createElement(material_1.Typography, { variant: "body2" }, ((_a = field.description) === null || _a === void 0 ? void 0 : _a.length) ? Group_1.GROUP_DESCRIPTION_MAX_LENGTH - field.description.length : Group_1.GROUP_DESCRIPTION_MAX_LENGTH))
|
|
210
232
|
} }),
|
|
211
233
|
react_1.default.createElement(material_1.Box, { className: classes.privacySection },
|
|
212
234
|
react_1.default.createElement(material_1.Typography, { variant: "h4" },
|
|
@@ -215,25 +237,26 @@ function GroupForm(inProps) {
|
|
|
215
237
|
react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isPublic }) },
|
|
216
238
|
react_1.default.createElement(material_1.Icon, null, "private"),
|
|
217
239
|
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,
|
|
240
|
+
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
241
|
react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: field.isPublic }) },
|
|
220
242
|
react_1.default.createElement(material_1.Icon, null, "public"),
|
|
221
243
|
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,
|
|
244
|
+
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) } })))))),
|
|
245
|
+
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
246
|
react_1.default.createElement(material_1.Typography, { variant: "h4" },
|
|
225
247
|
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
248
|
react_1.default.createElement(material_1.Stack, { direction: "row", spacing: 1, alignItems: "center" },
|
|
227
249
|
react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isVisible }) },
|
|
228
250
|
react_1.default.createElement(material_1.Icon, null, "visibility_off"),
|
|
229
251
|
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,
|
|
252
|
+
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
253
|
react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: field.isVisible }) },
|
|
232
254
|
react_1.default.createElement(material_1.Icon, null, "visibility"),
|
|
233
255
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.visible", defaultMessage: "ui.groupForm.visibility.visible" }))),
|
|
234
256
|
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(
|
|
257
|
+
!group && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
258
|
+
react_1.default.createElement(material_1.Divider, null),
|
|
259
|
+
react_1.default.createElement(material_1.Box, { className: classes.inviteSection },
|
|
260
|
+
react_1.default.createElement(GroupInviteButton_1.default, { handleInvitations: handleInviteSection })))))));
|
|
238
261
|
}
|
|
239
262
|
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,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',
|
|
@@ -90,12 +92,22 @@ function GroupInviteButton(inProps) {
|
|
|
90
92
|
const [list, setList] = (0, react_1.useState)([]);
|
|
91
93
|
const [loading, setLoading] = (0, react_1.useState)(false);
|
|
92
94
|
const [invited, setInvited] = (0, react_1.useState)([]);
|
|
95
|
+
/**
|
|
96
|
+
* Notify UI when a member is invited to a group
|
|
97
|
+
* @param group
|
|
98
|
+
* @param usersInvited
|
|
99
|
+
*/
|
|
100
|
+
function notifyChanges(group, usersInvited) {
|
|
101
|
+
if (group && usersInvited) {
|
|
102
|
+
pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCEventType.INVITE_MEMBER}`, usersInvited);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
93
105
|
function convertToInvitedUsersObject(data) {
|
|
94
|
-
const
|
|
106
|
+
const invite_users = {};
|
|
95
107
|
data.forEach((user, index) => {
|
|
96
|
-
|
|
108
|
+
invite_users[`invite_users[${index}]`] = user.id;
|
|
97
109
|
});
|
|
98
|
-
return
|
|
110
|
+
return invite_users;
|
|
99
111
|
}
|
|
100
112
|
/**
|
|
101
113
|
* Memoized users invited ids
|
|
@@ -110,7 +122,7 @@ function GroupInviteButton(inProps) {
|
|
|
110
122
|
}, [invited]);
|
|
111
123
|
// HOOKS
|
|
112
124
|
const { scGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
|
|
113
|
-
const
|
|
125
|
+
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
126
|
// INTL
|
|
115
127
|
const intl = (0, react_intl_1.useIntl)();
|
|
116
128
|
function fetchResults() {
|
|
@@ -155,11 +167,13 @@ function GroupInviteButton(inProps) {
|
|
|
155
167
|
* If a value is entered in new message field, it fetches user suggested
|
|
156
168
|
*/
|
|
157
169
|
(0, react_1.useEffect)(() => {
|
|
158
|
-
if (
|
|
170
|
+
if (scGroup) {
|
|
159
171
|
fetchResults();
|
|
160
172
|
}
|
|
161
|
-
|
|
162
|
-
|
|
173
|
+
else {
|
|
174
|
+
fetchGeneralResults();
|
|
175
|
+
}
|
|
176
|
+
}, [value, scGroup]);
|
|
163
177
|
/**
|
|
164
178
|
* Handles dialog close
|
|
165
179
|
*/
|
|
@@ -182,6 +196,7 @@ function GroupInviteButton(inProps) {
|
|
|
182
196
|
setIsSending(false);
|
|
183
197
|
setOpen(false);
|
|
184
198
|
setInvited([]);
|
|
199
|
+
notifyChanges(scGroup, invited);
|
|
185
200
|
})
|
|
186
201
|
.catch((error) => {
|
|
187
202
|
setOpen(false);
|
|
@@ -225,10 +240,17 @@ function GroupInviteButton(inProps) {
|
|
|
225
240
|
setInvited(invited.filter((v) => v !== option));
|
|
226
241
|
setList((prev) => [...prev, option]);
|
|
227
242
|
};
|
|
243
|
+
const filterOptions = (options, { inputValue }) => {
|
|
244
|
+
return options.filter((option) => {
|
|
245
|
+
const usernameMatch = option.username.toLowerCase().includes(inputValue.toLowerCase());
|
|
246
|
+
const nameMatch = option.real_name.toLowerCase().includes(inputValue.toLowerCase());
|
|
247
|
+
return usernameMatch || nameMatch;
|
|
248
|
+
});
|
|
249
|
+
};
|
|
228
250
|
/**
|
|
229
|
-
* If
|
|
251
|
+
* If in group edit mode and logged-in user is not also the group manager, the component is hidden.
|
|
230
252
|
// */
|
|
231
|
-
if (!
|
|
253
|
+
if (group && !isGroupAdmin) {
|
|
232
254
|
return null;
|
|
233
255
|
}
|
|
234
256
|
/**
|
|
@@ -242,10 +264,10 @@ function GroupInviteButton(inProps) {
|
|
|
242
264
|
react_1.default.createElement(material_1.Icon, { fontSize: "medium" }, "arrow_back")),
|
|
243
265
|
react_1.default.createElement(material_1.Typography, { className: classes.dialogTitle },
|
|
244
266
|
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 },
|
|
267
|
+
react_1.default.createElement(lab_1.LoadingButton, { size: "small", color: "secondary", variant: "contained", onClick: handleSendInvitations, loading: isSending, disabled: !invited.length },
|
|
246
268
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInviteButton.dialog.button.end", defaultMessage: "ui.groupInviteButton.dialog.button.end" }))) },
|
|
247
269
|
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: suggested, 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),
|
|
270
|
+
react_1.default.createElement(Autocomplete_1.default, { className: classes.autocomplete, loading: loading, size: "small", multiple: true, freeSolo: true, disableClearable: true, options: suggested, onChange: handleChange, onInputChange: handleInputChange, inputValue: value, filterOptions: filterOptions, 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
271
|
react_1.default.createElement(material_1.Avatar, { alt: option.username, src: option.avatar }),
|
|
250
272
|
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
273
|
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;
|