@selfcommunity/react-ui 0.7.9-alpha.2 → 0.7.9-alpha.21

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.
Files changed (155) hide show
  1. package/lib/cjs/components/BottomNavigation/BottomNavigation.js +3 -1
  2. package/lib/cjs/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  3. package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  4. package/lib/cjs/components/Composer/Attributes/Attributes.d.ts +1 -1
  5. package/lib/cjs/components/Composer/Attributes/Attributes.js +9 -2
  6. package/lib/cjs/components/Composer/Composer.d.ts +2 -1
  7. package/lib/cjs/components/Composer/Composer.js +39 -12
  8. package/lib/cjs/components/Composer/Content/ContentDiscussion/ContentDiscussion.js +7 -3
  9. package/lib/cjs/components/Composer/Content/ContentPost/ContentPost.js +4 -3
  10. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +7 -1
  11. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +46 -12
  12. package/lib/cjs/components/CreateGroupButton/CreateGroupButton.d.ts +2 -2
  13. package/lib/cjs/components/CreateGroupButton/CreateGroupButton.js +5 -6
  14. package/lib/cjs/components/CustomAdv/CustomAdv.d.ts +4 -0
  15. package/lib/cjs/components/{CreateGroup/CreateGroup.d.ts → EditGroupButton/EditGroupButton.d.ts} +11 -16
  16. package/lib/cjs/components/EditGroupButton/EditGroupButton.js +61 -0
  17. package/lib/cjs/components/EditGroupButton/index.d.ts +3 -0
  18. package/lib/cjs/components/EditGroupButton/index.js +5 -0
  19. package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
  20. package/lib/cjs/components/FeedObject/FeedObject.js +23 -6
  21. package/lib/cjs/components/Group/Group.d.ts +4 -3
  22. package/lib/cjs/components/Group/Group.js +5 -4
  23. package/lib/cjs/components/Group/Skeleton.js +1 -1
  24. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.d.ts +49 -0
  25. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +101 -0
  26. package/lib/cjs/components/GroupAutocomplete/index.d.ts +3 -0
  27. package/lib/cjs/components/GroupAutocomplete/index.js +5 -0
  28. package/lib/cjs/components/GroupForm/GroupForm.d.ts +70 -0
  29. package/lib/cjs/components/GroupForm/GroupForm.js +239 -0
  30. package/lib/cjs/components/GroupForm/constants.d.ts +1 -0
  31. package/lib/cjs/components/{CreateGroup → GroupForm}/constants.js +1 -1
  32. package/lib/cjs/components/GroupForm/index.d.ts +3 -0
  33. package/lib/cjs/components/GroupForm/index.js +5 -0
  34. package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
  35. package/lib/cjs/components/GroupHeader/GroupHeader.js +21 -11
  36. package/lib/cjs/components/GroupHeader/Skeleton.d.ts +2 -4
  37. package/lib/cjs/components/GroupHeader/Skeleton.js +10 -10
  38. package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +8 -8
  39. package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +9 -6
  40. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  41. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +3 -2
  42. package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +37 -14
  43. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +0 -5
  44. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +17 -7
  45. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  46. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +132 -0
  47. package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
  48. package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
  49. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  50. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +26 -9
  51. package/lib/cjs/components/Groups/Groups.d.ts +65 -0
  52. package/lib/cjs/components/Groups/Groups.js +135 -0
  53. package/lib/cjs/components/Groups/Skeleton.d.ts +34 -0
  54. package/lib/cjs/components/Groups/Skeleton.js +45 -0
  55. package/lib/cjs/components/Groups/constants.d.ts +1 -0
  56. package/lib/cjs/components/Groups/constants.js +4 -0
  57. package/lib/cjs/components/Groups/index.d.ts +4 -0
  58. package/lib/cjs/components/Groups/index.js +8 -0
  59. package/lib/cjs/components/InlineComposerWidget/InlineComposerWidget.d.ts +2 -1
  60. package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  61. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.js +5 -1
  62. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
  63. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
  64. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  65. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +10 -7
  66. package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  67. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  68. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +24 -6
  69. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  70. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +45 -20
  71. package/lib/cjs/index.d.ts +7 -3
  72. package/lib/cjs/index.js +14 -4
  73. package/lib/esm/components/BottomNavigation/BottomNavigation.js +3 -1
  74. package/lib/esm/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  75. package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  76. package/lib/esm/components/Composer/Attributes/Attributes.d.ts +1 -1
  77. package/lib/esm/components/Composer/Attributes/Attributes.js +9 -2
  78. package/lib/esm/components/Composer/Composer.d.ts +2 -1
  79. package/lib/esm/components/Composer/Composer.js +39 -12
  80. package/lib/esm/components/Composer/Content/ContentDiscussion/ContentDiscussion.js +7 -3
  81. package/lib/esm/components/Composer/Content/ContentPost/ContentPost.js +4 -3
  82. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +7 -1
  83. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +45 -12
  84. package/lib/esm/components/CreateGroupButton/CreateGroupButton.d.ts +2 -2
  85. package/lib/esm/components/CreateGroupButton/CreateGroupButton.js +5 -6
  86. package/lib/esm/components/CustomAdv/CustomAdv.d.ts +4 -0
  87. package/lib/esm/components/{CreateGroup/CreateGroup.d.ts → EditGroupButton/EditGroupButton.d.ts} +11 -16
  88. package/lib/esm/components/EditGroupButton/EditGroupButton.js +58 -0
  89. package/lib/esm/components/EditGroupButton/index.d.ts +3 -0
  90. package/lib/esm/components/EditGroupButton/index.js +2 -0
  91. package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
  92. package/lib/esm/components/FeedObject/FeedObject.js +24 -7
  93. package/lib/esm/components/Group/Group.d.ts +4 -3
  94. package/lib/esm/components/Group/Group.js +5 -4
  95. package/lib/esm/components/Group/Skeleton.js +1 -1
  96. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.d.ts +49 -0
  97. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +99 -0
  98. package/lib/esm/components/GroupAutocomplete/index.d.ts +3 -0
  99. package/lib/esm/components/GroupAutocomplete/index.js +2 -0
  100. package/lib/esm/components/GroupForm/GroupForm.d.ts +70 -0
  101. package/lib/esm/components/GroupForm/GroupForm.js +236 -0
  102. package/lib/esm/components/GroupForm/constants.d.ts +1 -0
  103. package/lib/esm/components/GroupForm/constants.js +1 -0
  104. package/lib/esm/components/GroupForm/index.d.ts +3 -0
  105. package/lib/esm/components/GroupForm/index.js +2 -0
  106. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
  107. package/lib/esm/components/GroupHeader/GroupHeader.js +21 -11
  108. package/lib/esm/components/GroupHeader/Skeleton.d.ts +2 -4
  109. package/lib/esm/components/GroupHeader/Skeleton.js +10 -10
  110. package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +8 -8
  111. package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +9 -6
  112. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  113. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +4 -3
  114. package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +39 -16
  115. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +0 -5
  116. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +17 -7
  117. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  118. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +129 -0
  119. package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
  120. package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
  121. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  122. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +27 -10
  123. package/lib/esm/components/Groups/Groups.d.ts +65 -0
  124. package/lib/esm/components/Groups/Groups.js +132 -0
  125. package/lib/esm/components/Groups/Skeleton.d.ts +34 -0
  126. package/lib/esm/components/Groups/Skeleton.js +42 -0
  127. package/lib/esm/components/Groups/constants.d.ts +1 -0
  128. package/lib/esm/components/Groups/constants.js +1 -0
  129. package/lib/esm/components/Groups/index.d.ts +4 -0
  130. package/lib/esm/components/Groups/index.js +4 -0
  131. package/lib/esm/components/InlineComposerWidget/InlineComposerWidget.d.ts +2 -1
  132. package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  133. package/lib/esm/components/NavigationToolbar/NavigationToolbar.js +5 -1
  134. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
  135. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
  136. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  137. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +11 -8
  138. package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  139. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  140. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
  141. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  142. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +47 -22
  143. package/lib/esm/index.d.ts +7 -3
  144. package/lib/esm/index.js +8 -4
  145. package/lib/umd/react-ui.js +1 -1
  146. package/package.json +6 -6
  147. package/lib/cjs/components/CreateGroup/CreateGroup.js +0 -187
  148. package/lib/cjs/components/CreateGroup/constants.d.ts +0 -1
  149. package/lib/cjs/components/CreateGroup/index.d.ts +0 -3
  150. package/lib/cjs/components/CreateGroup/index.js +0 -5
  151. package/lib/esm/components/CreateGroup/CreateGroup.js +0 -184
  152. package/lib/esm/components/CreateGroup/constants.d.ts +0 -1
  153. package/lib/esm/components/CreateGroup/constants.js +0 -1
  154. package/lib/esm/components/CreateGroup/index.d.ts +0 -3
  155. package/lib/esm/components/CreateGroup/index.js +0 -2
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importStar(require("react"));
5
+ const system_1 = require("@mui/system");
6
+ const styles_1 = require("@mui/material/styles");
7
+ const material_1 = require("@mui/material");
8
+ const react_intl_1 = require("react-intl");
9
+ const react_core_1 = require("@selfcommunity/react-core");
10
+ const classnames_1 = tslib_1.__importDefault(require("classnames"));
11
+ const constants_1 = require("./constants");
12
+ const BaseDialog_1 = tslib_1.__importDefault(require("../../shared/BaseDialog"));
13
+ const lab_1 = require("@mui/lab");
14
+ const ChangeGroupPicture_1 = tslib_1.__importDefault(require("../ChangeGroupPicture"));
15
+ const ChangeGroupCover_1 = tslib_1.__importDefault(require("../ChangeGroupCover"));
16
+ const Group_1 = require("../../constants/Group");
17
+ const GroupInviteButton_1 = tslib_1.__importDefault(require("../GroupInviteButton"));
18
+ const types_1 = require("@selfcommunity/types");
19
+ const Errors_1 = require("../../constants/Errors");
20
+ const api_services_1 = require("@selfcommunity/api-services");
21
+ const utils_1 = require("@selfcommunity/utils");
22
+ const messages = (0, react_intl_1.defineMessages)({
23
+ name: {
24
+ id: 'ui.groupForm.name.placeholder',
25
+ defaultMessage: 'ui.groupForm.name.placeholder'
26
+ },
27
+ description: {
28
+ id: 'ui.groupForm.description.placeholder',
29
+ defaultMessage: 'ui.groupForm.description.placeholder'
30
+ }
31
+ });
32
+ const classes = {
33
+ root: `${constants_1.PREFIX}-root`,
34
+ active: `${constants_1.PREFIX}-active`,
35
+ title: `${constants_1.PREFIX}-title`,
36
+ header: `${constants_1.PREFIX}-header`,
37
+ cover: `${constants_1.PREFIX}-cover`,
38
+ avatar: `${constants_1.PREFIX}-avatar`,
39
+ form: `${constants_1.PREFIX}-form`,
40
+ switch: `${constants_1.PREFIX}-switch`,
41
+ switchLabel: `${constants_1.PREFIX}-switch-label`,
42
+ name: `${constants_1.PREFIX}-name`,
43
+ description: `${constants_1.PREFIX}-description`,
44
+ content: `${constants_1.PREFIX}-content`,
45
+ privacySection: `${constants_1.PREFIX}-privacy-section`,
46
+ privacySectionInfo: `${constants_1.PREFIX}-privacy-section-info`,
47
+ visibilitySection: `${constants_1.PREFIX}-visibility-section`,
48
+ visibilitySectionInfo: `${constants_1.PREFIX}-visibility-section-info`,
49
+ inviteSection: `${constants_1.PREFIX}-invite-section`,
50
+ error: `${constants_1.PREFIX}-error`
51
+ };
52
+ const Root = (0, styles_1.styled)(BaseDialog_1.default, {
53
+ name: constants_1.PREFIX,
54
+ slot: 'Root'
55
+ })(() => ({}));
56
+ /**
57
+ *> API documentation for the Community-JS Group Form component. Learn about the available props and the CSS API.
58
+ *
59
+ #### Import
60
+ ```jsx
61
+ import {GroupForm} from '@selfcommunity/react-ui';
62
+ ```
63
+
64
+ #### Component Name
65
+ The name `SCGroupForm` can be used when providing style overrides in the theme.
66
+
67
+ #### CSS
68
+
69
+ |Rule Name|Global class|Description|
70
+ |---|---|---|
71
+ |root|.SCGroupForm-root|Styles applied to the root element.|
72
+ |active|.SCGroupForm-active|Styles applied to the active element.|
73
+ |title|.SCGroupForm-title|Styles applied to the title element.|
74
+ |header|.SCGroupForm-header|Styles applied to the header element.|
75
+ |cover|.SCGroupForm-cover|Styles applied to the cover field.|
76
+ |avatar|.SCGroupForm-avatar|Styles applied to the avatar field.|
77
+ |form|.SCGroupForm-form|Styles applied to the form element.|
78
+ |switch|.SCGroupForm-switch|Styles applied to the switch element.|
79
+ |switchLabel|.SCGroupForm-switch-label|Styles applied to the switchLabel element.|
80
+ |name|.SCGroupForm-name|Styles applied to the name field.|
81
+ |description|.SCGroupForm-description|Styles applied to the description field.|
82
+ |content|.SCGroupForm-content|Styles applied to the element.|
83
+ |privacySection|.SCGroupForm-privacy-section|Styles applied to the privacy section.|
84
+ |privacySectionInfo|.SCGroupForm-privacy-section-info|Styles applied to the privacy info section.|
85
+ |visibilitySection|.SCGroupForm-visibility-section|Styles applied to the visibility section.|
86
+ |visibilitySectionInfo|.SCGroupForm-visibility-section-info|Styles applied to the visibility section info.|
87
+ |inviteSection|.SCGroupForm-invite-section|Styles applied to the invite section.|
88
+ |error|.SCGroupForm-error|Styles applied to the error elements.|
89
+
90
+ * @param inProps
91
+ */
92
+ function GroupForm(inProps) {
93
+ //PROPS
94
+ const props = (0, system_1.useThemeProps)({
95
+ props: inProps,
96
+ name: constants_1.PREFIX
97
+ });
98
+ const { className, open = true, onClose, onSuccess, group = null } = props, rest = tslib_1.__rest(props, ["className", "open", "onClose", "onSuccess", "group"]);
99
+ const initialFieldState = {
100
+ imageOriginal: group ? group.image_medium : '',
101
+ imageOriginalFile: '',
102
+ emotionalImageOriginal: group ? group.emotional_image : '',
103
+ emotionalImageOriginalFile: '',
104
+ name: group ? group.name : '',
105
+ description: group ? group.description : '',
106
+ isPublic: group && group.privacy === types_1.SCGroupPrivacyType.PUBLIC,
107
+ isVisible: group ? group.visible : true,
108
+ invitedUsers: null,
109
+ isSubmitting: false
110
+ };
111
+ // STATE
112
+ const [field, setField] = (0, react_1.useState)(initialFieldState);
113
+ const [error, setError] = (0, react_1.useState)({});
114
+ // INTL
115
+ const intl = (0, react_intl_1.useIntl)();
116
+ // PREFERENCES
117
+ const scPreferences = (0, react_core_1.useSCPreferences)();
118
+ const _backgroundCover = Object.assign({}, (field.emotionalImageOriginal
119
+ ? { background: `url('${field.emotionalImageOriginal}') center / cover` }
120
+ : { background: `url('${scPreferences.preferences[react_core_1.SCPreferences.IMAGES_USER_DEFAULT_COVER].value}') center / cover` }));
121
+ function handleChangeAvatar(avatar) {
122
+ setField((prev) => (Object.assign(Object.assign({}, prev), { ['imageOriginalFile']: avatar })));
123
+ const reader = new FileReader();
124
+ reader.onloadend = () => {
125
+ setField((prev) => (Object.assign(Object.assign({}, prev), { ['imageOriginal']: reader.result })));
126
+ };
127
+ reader.readAsDataURL(avatar);
128
+ if (error.imageOriginalError) {
129
+ delete error.imageOriginalError;
130
+ setError(error);
131
+ }
132
+ }
133
+ function handleChangeCover(cover) {
134
+ setField((prev) => (Object.assign(Object.assign({}, prev), { ['emotionalImageOriginalFile']: cover })));
135
+ const reader = new FileReader();
136
+ reader.onloadend = () => {
137
+ setField((prev) => (Object.assign(Object.assign({}, prev), { ['emotionalImageOriginal']: reader.result })));
138
+ };
139
+ reader.readAsDataURL(cover);
140
+ if (error.emotionalImageOriginalError) {
141
+ delete error.emotionalImageOriginalError;
142
+ setError(error);
143
+ }
144
+ }
145
+ const handleSubmit = () => {
146
+ setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: true })));
147
+ const formData = new FormData();
148
+ formData.append('name', field.name);
149
+ formData.append('description', field.description);
150
+ formData.append('privacy', field.isPublic ? types_1.SCGroupPrivacyType.PUBLIC : types_1.SCGroupPrivacyType.PRIVATE);
151
+ formData.append('visible', field.isVisible);
152
+ if (field.imageOriginalFile) {
153
+ formData.append('image_original', field.imageOriginalFile);
154
+ }
155
+ if (field.emotionalImageOriginalFile) {
156
+ formData.append('emotional_image_original', field.emotionalImageOriginalFile);
157
+ }
158
+ for (const key in field.invitedUsers) {
159
+ formData.append(key, field.invitedUsers[key]);
160
+ }
161
+ let groupService;
162
+ if (group) {
163
+ groupService = api_services_1.GroupService.updateGroup(group.id, formData, { headers: { 'Content-Type': 'multipart/form-data' } });
164
+ }
165
+ else {
166
+ groupService = api_services_1.GroupService.createGroup(formData, { headers: { 'Content-Type': 'multipart/form-data' } });
167
+ }
168
+ groupService
169
+ .then((data) => {
170
+ onSuccess && onSuccess(data);
171
+ onClose && onClose();
172
+ setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: false })));
173
+ })
174
+ .catch((e) => {
175
+ setError(Object.assign(Object.assign({}, error), (0, api_services_1.formatHttpErrorCode)(e)));
176
+ setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: false })));
177
+ utils_1.Logger.error(Errors_1.SCOPE_SC_UI, e);
178
+ });
179
+ };
180
+ const handleInviteSection = (data) => {
181
+ setField((prev) => (Object.assign(Object.assign({}, prev), { ['invitedUsers']: data })));
182
+ };
183
+ const handleChange = (event) => {
184
+ const { name, value } = event.target;
185
+ setField((prev) => (Object.assign(Object.assign({}, prev), { [name]: value })));
186
+ if (error[`${name}Error`]) {
187
+ delete error[`${name}Error`];
188
+ setError(error);
189
+ }
190
+ };
191
+ /**
192
+ * Renders root object
193
+ */
194
+ return (react_1.default.createElement(Root, Object.assign({ DialogContentProps: { dividers: false }, title: group ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.title.edit", defaultMessage: "ui.groupForm.title.edit" })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.title", defaultMessage: "ui.groupForm.title" })), open: open, onClose: onClose, className: (0, classnames_1.default)(classes.root, className), actions: react_1.default.createElement(lab_1.LoadingButton, { loading: field.isSubmitting, disabled: !field.name || Object.keys(error).length !== 0, variant: "contained", onClick: handleSubmit, color: "secondary" }, group ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.button.edit", defaultMessage: "ui.groupForm.button.edit" })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.button.create", defaultMessage: "ui.groupForm.button.create" }))) }, rest),
195
+ react_1.default.createElement(react_1.default.Fragment, null,
196
+ react_1.default.createElement(react_1.default.Fragment, null,
197
+ react_1.default.createElement(material_1.Paper, { style: _backgroundCover, classes: { root: classes.cover } },
198
+ react_1.default.createElement(material_1.Box, { className: classes.avatar },
199
+ react_1.default.createElement(material_1.Avatar, null, field.imageOriginal ? react_1.default.createElement("img", { src: field.imageOriginal, alt: "avatar" }) : react_1.default.createElement(material_1.Icon, null, "icon_image"))),
200
+ react_1.default.createElement(react_1.default.Fragment, null,
201
+ react_1.default.createElement(ChangeGroupPicture_1.default, { isCreationMode: true, onChange: handleChangeAvatar }),
202
+ react_1.default.createElement(ChangeGroupCover_1.default, { isCreationMode: true, onChange: handleChangeCover }))),
203
+ react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.header, { [classes.error]: error.emotionalImageOriginalError || error.imageOriginalError }), align: "center" }, error.emotionalImageOriginalError || error.imageOriginalError ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.header.error", defaultMessage: "ui.groupForm.header.error" })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.header", defaultMessage: "ui.groupForm.header" })))),
204
+ react_1.default.createElement(material_1.FormGroup, { className: classes.form },
205
+ react_1.default.createElement(material_1.TextField, { required: true, className: classes.name, placeholder: `${intl.formatMessage(messages.name)}`, margin: "normal", value: field.name, name: "name", onChange: handleChange, InputProps: {
206
+ endAdornment: react_1.default.createElement(material_1.Typography, { variant: "body2" }, Group_1.GROUP_TITLE_MAX_LENGTH - field.name.length)
207
+ } }),
208
+ 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)
210
+ } }),
211
+ (!group || (group && group.privacy !== types_1.SCGroupPrivacyType.PRIVATE)) && (react_1.default.createElement(material_1.Box, { className: classes.privacySection },
212
+ react_1.default.createElement(material_1.Typography, { variant: "h4" },
213
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.title", defaultMessage: "ui.groupForm.privacy.title", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })),
214
+ react_1.default.createElement(material_1.Stack, { direction: "row", spacing: 1, alignItems: "center" },
215
+ react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isPublic }) },
216
+ react_1.default.createElement(material_1.Icon, null, "private"),
217
+ 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, onClick: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['isPublic']: !field.isPublic }))) }),
219
+ react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: field.isPublic }) },
220
+ react_1.default.createElement(material_1.Icon, null, "public"),
221
+ 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 && !group) || (group && !field.isPublic)) && (react_1.default.createElement(react_1.default.Fragment, null,
224
+ react_1.default.createElement(material_1.Typography, { variant: "h4" },
225
+ 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
+ react_1.default.createElement(material_1.Stack, { direction: "row", spacing: 1, alignItems: "center" },
227
+ react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isVisible }) },
228
+ react_1.default.createElement(material_1.Icon, null, "visibility_off"),
229
+ 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, onClick: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['isVisible']: !field.isVisible }))) }),
231
+ react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: field.isVisible }) },
232
+ react_1.default.createElement(material_1.Icon, null, "visibility"),
233
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.visible", defaultMessage: "ui.groupForm.visibility.visible" }))),
234
+ 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(material_1.Divider, null),
236
+ react_1.default.createElement(material_1.Box, { className: classes.inviteSection },
237
+ react_1.default.createElement(GroupInviteButton_1.default, { handleInvitations: handleInviteSection })))));
238
+ }
239
+ exports.default = GroupForm;
@@ -0,0 +1 @@
1
+ export declare const PREFIX = "SCGroupForm";
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PREFIX = void 0;
4
- exports.PREFIX = 'SCCreateGroup';
4
+ exports.PREFIX = 'SCGroupForm';
@@ -0,0 +1,3 @@
1
+ import GroupForm, { GroupFormProps } from './GroupForm';
2
+ export default GroupForm;
3
+ export { GroupFormProps };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const GroupForm_1 = tslib_1.__importDefault(require("./GroupForm"));
5
+ exports.default = GroupForm_1.default;
@@ -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 to the group memebers button
38
+ * Props to spread group button followed
39
39
  * @default {}
40
40
  */
41
- GroupMembersButtonProps?: GroupMembersButtonProps;
41
+ GroupSubscribeButtonProps?: GroupSubscribeButtonProps;
42
42
  /**
43
- *
43
+ * Props to spread to the group memebers button
44
+ * @default {}
44
45
  */
45
- actions?: React.ReactNode;
46
+ GroupMembersButtonProps?: GroupMembersButtonProps;
46
47
  /**
47
48
  * Any other properties
48
49
  */
@@ -15,6 +15,9 @@ const react_intl_1 = require("react-intl");
15
15
  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
+ 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"));
18
21
  const classes = {
19
22
  root: `${constants_1.PREFIX}-root`,
20
23
  cover: `${constants_1.PREFIX}-cover`,
@@ -65,13 +68,13 @@ const Root = (0, styles_1.styled)(material_1.Box, {
65
68
  * @param inProps
66
69
  */
67
70
  function GroupHeader(inProps) {
68
- var _a, _b;
71
+ var _a;
69
72
  // PROPS
70
73
  const props = (0, system_1.useThemeProps)({
71
74
  props: inProps,
72
75
  name: constants_1.PREFIX
73
76
  });
74
- const { id = null, className = null, group, groupId = null, ChangePictureProps = {}, ChangeCoverProps = {}, GroupMembersButtonProps = {}, actions } = props, rest = tslib_1.__rest(props, ["id", "className", "group", "groupId", "ChangePictureProps", "ChangeCoverProps", "GroupMembersButtonProps", "actions"]);
77
+ 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"]);
75
78
  // PREFERENCES
76
79
  const scPreferences = (0, react_core_1.useSCPreferences)();
77
80
  // CONTEXT
@@ -79,14 +82,14 @@ function GroupHeader(inProps) {
79
82
  // HOOKS
80
83
  const { scGroup, setSCGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
81
84
  // CONST
82
- const canEdit = (0, react_1.useMemo)(() => { var _a, _b; return scUserContext.user && (((_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.created_by) === null || _a === void 0 ? void 0 : _a.id) || ((_b = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _b === void 0 ? void 0 : _b.id)) === scUserContext.user.id; }, [scUserContext.user, (_a = scGroup === null || scGroup === void 0 ? void 0 : scGroup.created_by) === null || _a === void 0 ? void 0 : _a.id, (_b = scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by) === null || _b === void 0 ? void 0 : _b.id]);
85
+ 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]);
83
86
  /**
84
87
  * Handles Change Avatar
85
88
  * @param avatar
86
89
  */
87
90
  function handleChangeAvatar(avatar) {
88
- if (canEdit) {
89
- setSCGroup(Object.assign({}, scGroup, { image_bigger: avatar }));
91
+ if (isGroupAdmin) {
92
+ setSCGroup(Object.assign({}, scGroup, { image_big: avatar }));
90
93
  }
91
94
  }
92
95
  /**
@@ -94,10 +97,16 @@ function GroupHeader(inProps) {
94
97
  * @param cover
95
98
  */
96
99
  function handleChangeCover(cover) {
97
- if (canEdit) {
100
+ if (isGroupAdmin) {
98
101
  setSCGroup(Object.assign({}, scGroup, { emotional_image: cover }));
99
102
  }
100
103
  }
104
+ /**
105
+ * Handles callback subscribe/unsubscribe group
106
+ */
107
+ const handleSubscribe = (group, status) => {
108
+ setSCGroup(Object.assign(Object.assign({}, group), { subscribers_counter: group.subscribers_counter + (status ? 1 : -1) }));
109
+ };
101
110
  // RENDER
102
111
  if (!scGroup) {
103
112
  return react_1.default.createElement(Skeleton_1.default, null);
@@ -109,12 +118,13 @@ function GroupHeader(inProps) {
109
118
  react_1.default.createElement(material_1.Paper, { style: _backgroundCover, classes: { root: classes.cover } },
110
119
  react_1.default.createElement(material_1.Box, { className: classes.avatar },
111
120
  react_1.default.createElement(material_1.Avatar, null,
112
- react_1.default.createElement("img", { alt: "group", src: scGroup.image_bigger ? scGroup.image_bigger : '' }))),
113
- canEdit && (react_1.default.createElement(react_1.default.Fragment, null,
121
+ react_1.default.createElement("img", { alt: "group", src: scGroup.image_big ? scGroup.image_big : '' }))),
122
+ isGroupAdmin && (react_1.default.createElement(react_1.default.Fragment, null,
114
123
  react_1.default.createElement(ChangeGroupPicture_1.default, Object.assign({ groupId: scGroup.id, onChange: handleChangeAvatar, className: classes.changePicture }, ChangePictureProps)),
115
124
  react_1.default.createElement("div", { className: classes.changeCover },
116
125
  react_1.default.createElement(ChangeGroupCover_1.default, Object.assign({ groupId: scGroup.id, onChange: handleChangeCover }, ChangeCoverProps)))))),
117
126
  react_1.default.createElement(material_1.Box, { className: classes.info },
127
+ isGroupAdmin && react_1.default.createElement(EditGroupButton_1.default, { group: scGroup, groupId: scGroup.id, onEditSuccess: (data) => setSCGroup(data) }),
118
128
  react_1.default.createElement(material_1.Typography, { variant: "h5", className: classes.name }, scGroup.name),
119
129
  react_1.default.createElement(material_1.Box, { className: classes.visibility },
120
130
  scGroup.privacy === types_1.SCGroupPrivacyType.PUBLIC ? (react_1.default.createElement(material_1.Typography, { className: classes.visibilityItem },
@@ -128,10 +138,10 @@ function GroupHeader(inProps) {
128
138
  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 },
129
139
  react_1.default.createElement(material_1.Icon, null, "visibility_off"),
130
140
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupHeader.visibility.hidden", defaultMessage: "ui.groupHeader.visibility.hidden" })))),
131
- react_1.default.createElement(material_1.Box, { className: classes.members },
141
+ react_1.default.createElement(react_1.default.Fragment, null, ((scGroup && scGroup.privacy === types_1.SCGroupPrivacyType.PUBLIC) || isGroupAdmin) && (react_1.default.createElement(material_1.Box, { className: classes.members },
132
142
  react_1.default.createElement(material_1.Typography, { className: classes.membersCounter, component: "div" },
133
143
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupHeader.members", defaultMessage: "ui.groupHeader.members", values: { total: scGroup.subscribers_counter } })),
134
- react_1.default.createElement(GroupMembersButton_1.default, Object.assign({ groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, group: scGroup }, GroupMembersButtonProps))),
135
- actions && actions)));
144
+ react_1.default.createElement(GroupMembersButton_1.default, Object.assign({ groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, group: scGroup, autoHide: !isGroupAdmin }, GroupMembersButtonProps))))),
145
+ 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))))));
136
146
  }
137
147
  exports.default = GroupHeader;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * > API documentation for the Community-JS Group Headerr Skeleton component. Learn about the available props and the CSS API.
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
- |actions|.SCGroupHeader-actions|Styles applied to the actions section.|
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
- actions: `${constants_1.PREFIX}-actions`,
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 Headerr Skeleton component. Learn about the available props and the CSS API.
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
- |actions|.SCGroupHeader-actions|Styles applied to the actions section.|
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.section },
53
- react_1.default.createElement(material_1.Typography, { variant: "h5", className: classes.username },
54
- react_1.default.createElement(Skeleton_1.default, { animation: "wave", sx: { height: 30, width: 100 } })))));
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;
@@ -75,25 +75,25 @@ function GroupInfoWidget(inProps) {
75
75
  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
76
  react_1.default.createElement(material_1.Typography, { className: classes.privacyTitle },
77
77
  react_1.default.createElement(material_1.Icon, null, "public"),
78
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.createGroup.privacy.public", defaultMessage: "ui.createGroup.privacy.public" })),
78
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.public", defaultMessage: "ui.groupForm.privacy.public" })),
79
79
  react_1.default.createElement(material_1.Typography, { variant: "body2" },
80
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.createGroup.privacy.public.info", defaultMessage: "ui.createGroup.privacy.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })))) : (react_1.default.createElement(react_1.default.Fragment, null,
80
+ 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,
81
81
  react_1.default.createElement(material_1.Typography, { className: classes.privacyTitle },
82
82
  react_1.default.createElement(material_1.Icon, null, "private"),
83
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.createGroup.privacy.private", defaultMessage: "ui.createGroup.privacy.private" })),
83
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private", defaultMessage: "ui.groupForm.privacy.private" })),
84
84
  react_1.default.createElement(material_1.Typography, { variant: "body2" },
85
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.createGroup.privacy.private.info", defaultMessage: "ui.createGroup.private.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } }))))),
85
+ 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) } }))))),
86
86
  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
87
  react_1.default.createElement(material_1.Typography, { className: classes.visibilityTitle },
88
88
  react_1.default.createElement(material_1.Icon, null, "visibility"),
89
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.createGroup.visibility.visible", defaultMessage: "ui.createGroup.visibility.visible" })),
89
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.visible", defaultMessage: "ui.groupForm.visibility.visible" })),
90
90
  react_1.default.createElement(material_1.Typography, { variant: "body2" },
91
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.createGroup.visibility.visible.info", defaultMessage: "ui.createGroup.visibility.visible.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })))) : (react_1.default.createElement(react_1.default.Fragment, null,
91
+ 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) } })))) : (react_1.default.createElement(react_1.default.Fragment, null,
92
92
  react_1.default.createElement(material_1.Typography, { className: classes.visibilityTitle },
93
93
  react_1.default.createElement(material_1.Icon, null, "visibility_off"),
94
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.createGroup.visibility.hidden", defaultMessage: "ui.createGroup.visibility.hidden" })),
94
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.hidden", defaultMessage: "ui.groupForm.visibility.hidden" })),
95
95
  react_1.default.createElement(material_1.Typography, { variant: "body2" },
96
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.createGroup.visibility.hidden.info", defaultMessage: "ui.createGroup.visibility.hidden.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })))))),
96
+ 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
97
  react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.date },
98
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' }) } })))));
99
99
  }
@@ -73,6 +73,7 @@ const DialogRoot = (0, styles_1.styled)(BaseDialog_1.default, {
73
73
  * @param inProps
74
74
  */
75
75
  function GroupInviteButton(inProps) {
76
+ var _a;
76
77
  //PROPS
77
78
  const props = (0, system_1.useThemeProps)({
78
79
  props: inProps,
@@ -107,10 +108,9 @@ function GroupInviteButton(inProps) {
107
108
  }
108
109
  return [invited];
109
110
  }, [invited]);
110
- // CONST
111
- const authUserId = scUserContext.user ? scUserContext.user.id : null;
112
111
  // HOOKS
113
112
  const { scGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
113
+ 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
114
  // INTL
115
115
  const intl = (0, react_intl_1.useIntl)();
116
116
  function fetchResults() {
@@ -180,8 +180,11 @@ function GroupInviteButton(inProps) {
180
180
  api_services_1.GroupService.inviteOrAcceptGroupRequest(scGroup.id, data)
181
181
  .then(() => {
182
182
  setIsSending(false);
183
+ setOpen(false);
184
+ setInvited([]);
183
185
  })
184
186
  .catch((error) => {
187
+ setOpen(false);
185
188
  setLoading(false);
186
189
  utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
187
190
  });
@@ -223,23 +226,23 @@ function GroupInviteButton(inProps) {
223
226
  setList((prev) => [...prev, option]);
224
227
  };
225
228
  /**
226
- * If there's no authUserId, component is hidden.
229
+ * If in group edit mode and logged-in user is not also the group manager, the component is hidden.
227
230
  // */
228
- if (!authUserId) {
231
+ if (group && !isGroupAdmin) {
229
232
  return null;
230
233
  }
231
234
  /**
232
235
  * Renders root object
233
236
  */
234
237
  return (react_1.default.createElement(react_1.default.Fragment, null,
235
- react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className), onClick: handleClose, size: "small", variant: "outlined", startIcon: react_1.default.createElement(material_1.Icon, { fontSize: "small" }, "add") }, rest),
238
+ react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className), onClick: handleClose, variant: scGroup ? 'contained' : 'outlined', color: scGroup ? 'secondary' : 'inherit', startIcon: react_1.default.createElement(material_1.Icon, { fontSize: "small" }, "add") }, rest),
236
239
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInviteButton", defaultMessage: "ui.groupInviteButton" })),
237
240
  open && (react_1.default.createElement(DialogRoot, { DialogContentProps: { dividers: false }, open: true, className: classes.dialogRoot, title: react_1.default.createElement(react_1.default.Fragment, null,
238
241
  react_1.default.createElement(material_1.IconButton, { onClick: handleClose },
239
242
  react_1.default.createElement(material_1.Icon, { fontSize: "medium" }, "arrow_back")),
240
243
  react_1.default.createElement(material_1.Typography, { className: classes.dialogTitle },
241
244
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInviteButton.dialog.title", defaultMessage: "ui.groupInviteButton.dialog.title" })),
242
- react_1.default.createElement(lab_1.LoadingButton, { size: "small", color: "secondary", variant: "contained", onClick: handleSendInvitations, loading: isSending },
245
+ react_1.default.createElement(lab_1.LoadingButton, { size: "small", color: "secondary", variant: "contained", onClick: handleSendInvitations, loading: isSending, disabled: !invited.length },
243
246
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInviteButton.dialog.button.end", defaultMessage: "ui.groupInviteButton.dialog.button.end" }))) },
244
247
  react_1.default.createElement(material_1.Box, { className: classes.dialogContent },
245
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),
@@ -17,6 +17,11 @@ export interface GroupMembersButtonProps extends Pick<ButtonProps, Exclude<keyof
17
17
  * @default {}
18
18
  */
19
19
  DialogProps?: BaseDialogProps;
20
+ /**
21
+ * Hides this component
22
+ * @default false
23
+ */
24
+ autoHide?: boolean;
20
25
  /**
21
26
  * Any other properties
22
27
  */
@@ -10,6 +10,7 @@ const InfiniteScroll_1 = tslib_1.__importDefault(require("../../shared/InfiniteS
10
10
  const User_1 = tslib_1.__importStar(require("../User"));
11
11
  const api_services_1 = require("@selfcommunity/api-services");
12
12
  const react_core_1 = require("@selfcommunity/react-core");
13
+ const types_1 = require("@selfcommunity/types");
13
14
  const AvatarGroupSkeleton_1 = tslib_1.__importDefault(require("../Skeleton/AvatarGroupSkeleton"));
14
15
  const classnames_1 = tslib_1.__importDefault(require("classnames"));
15
16
  const system_1 = require("@mui/system");
@@ -60,7 +61,7 @@ function GroupMembersButton(inProps) {
60
61
  props: inProps,
61
62
  name: PREFIX
62
63
  });
63
- const { className, groupId, group, DialogProps = {} } = props, rest = tslib_1.__rest(props, ["className", "groupId", "group", "DialogProps"]);
64
+ const { className, groupId, group, DialogProps = {}, autoHide = false } = props, rest = tslib_1.__rest(props, ["className", "groupId", "group", "DialogProps", "autoHide"]);
64
65
  // STATE
65
66
  const [loading, setLoading] = (0, react_1.useState)(true);
66
67
  const [next, setNext] = (0, react_1.useState)(null);
@@ -71,7 +72,7 @@ function GroupMembersButton(inProps) {
71
72
  const { scGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
72
73
  // FETCH FIRST FOLLOWERS
73
74
  (0, use_deep_compare_effect_1.useDeepCompareEffectNoCheck)(() => {
74
- if (!scGroup) {
75
+ if (!scGroup || (scGroup && scGroup.privacy !== types_1.SCGroupPrivacyType.PUBLIC && autoHide)) {
75
76
  return;
76
77
  }
77
78
  if (members.length === 0) {