@selfcommunity/react-ui 0.7.9-alpha.8 → 0.7.9-alpha.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/lib/cjs/components/AccountRecover/AccountRecover.js +6 -1
  2. package/lib/cjs/components/BottomNavigation/BottomNavigation.js +4 -3
  3. package/lib/cjs/components/CategoryHeader/Skeleton.js +3 -2
  4. package/lib/cjs/components/ChangeGroupCover/ChangeGroupCover.js +6 -6
  5. package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +19 -16
  6. package/lib/cjs/components/Composer/Attributes/Attributes.js +3 -3
  7. package/lib/cjs/components/Composer/Composer.js +3 -3
  8. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -1
  9. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +9 -19
  10. package/lib/cjs/components/Editor/Editor.js +2 -0
  11. package/lib/cjs/components/Editor/nodes/ImageNode.js +6 -0
  12. package/lib/cjs/components/Editor/plugins/ImagePlugin.js +4 -0
  13. package/lib/cjs/components/Editor/plugins/ToolbarPlugin.js +17 -3
  14. package/lib/cjs/components/FeedObject/Actions/Share/Share.js +18 -16
  15. package/lib/cjs/components/FeedObject/Contributors/Contributors.js +1 -1
  16. package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
  17. package/lib/cjs/components/FeedObject/FeedObject.js +27 -8
  18. package/lib/cjs/components/FeedObject/Poll/Poll.js +20 -20
  19. package/lib/cjs/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  20. package/lib/cjs/components/Footer/Footer.js +1 -1
  21. package/lib/cjs/components/Group/Group.d.ts +8 -0
  22. package/lib/cjs/components/Group/Group.js +17 -5
  23. package/lib/cjs/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
  24. package/lib/cjs/components/GroupForm/GroupForm.js +64 -13
  25. package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
  26. package/lib/cjs/components/GroupHeader/GroupHeader.js +53 -11
  27. package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +63 -9
  28. package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +31 -9
  29. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  30. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.js +221 -0
  31. package/lib/cjs/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  32. package/lib/cjs/components/GroupInvitedWidget/Skeleton.js +38 -0
  33. package/lib/cjs/components/GroupInvitedWidget/constants.d.ts +1 -0
  34. package/lib/cjs/components/GroupInvitedWidget/constants.js +4 -0
  35. package/lib/cjs/components/GroupInvitedWidget/index.d.ts +4 -0
  36. package/lib/cjs/components/GroupInvitedWidget/index.js +8 -0
  37. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  38. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +8 -3
  39. package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +25 -4
  40. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  41. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  42. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  43. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +151 -0
  44. package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
  45. package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
  46. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  47. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +30 -11
  48. package/lib/cjs/components/Groups/Groups.d.ts +15 -8
  49. package/lib/cjs/components/Groups/Groups.js +86 -32
  50. package/lib/cjs/components/Groups/Skeleton.d.ts +4 -0
  51. package/lib/cjs/components/Groups/Skeleton.js +2 -2
  52. package/lib/cjs/components/InlineComposerWidget/InlineComposerWidget.js +7 -0
  53. package/lib/cjs/components/NavigationSettingsIconButton/NavigationSettingsIconButton.js +4 -4
  54. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.js +9 -2
  55. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +1 -0
  56. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +9 -1
  57. package/lib/cjs/components/Notification/Group/Group.d.ts +15 -0
  58. package/lib/cjs/components/Notification/Group/Group.js +78 -0
  59. package/lib/cjs/components/Notification/Group/index.d.ts +3 -0
  60. package/lib/cjs/components/Notification/Group/index.js +5 -0
  61. package/lib/cjs/components/Notification/Notification.js +31 -1
  62. package/lib/cjs/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  63. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +7 -1
  64. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +16 -8
  65. package/lib/cjs/components/PrivateMessageSettingsIconButton/PrivateMessageSettingsIconButton.js +1 -1
  66. package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  67. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +9 -4
  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 +46 -20
  71. package/lib/cjs/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +6 -0
  72. package/lib/cjs/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  73. package/lib/cjs/components/SnippetNotifications/SnippetNotifications.js +7 -0
  74. package/lib/cjs/components/ToastNotifications/ToastNotifications.js +7 -0
  75. package/lib/cjs/components/User/User.d.ts +6 -1
  76. package/lib/cjs/components/User/User.js +5 -4
  77. package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
  78. package/lib/cjs/components/UserSubscribedGroupsWidget/Skeleton.js +46 -0
  79. package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
  80. package/lib/cjs/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +183 -0
  81. package/lib/cjs/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
  82. package/lib/cjs/components/UserSubscribedGroupsWidget/constants.js +4 -0
  83. package/lib/cjs/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
  84. package/lib/cjs/components/UserSubscribedGroupsWidget/index.js +8 -0
  85. package/lib/cjs/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
  86. package/lib/cjs/constants/PubSub.d.ts +28 -0
  87. package/lib/cjs/constants/PubSub.js +22 -0
  88. package/lib/cjs/index.d.ts +6 -3
  89. package/lib/cjs/index.js +13 -4
  90. package/lib/cjs/types/index.d.ts +2 -1
  91. package/lib/esm/components/AccountRecover/AccountRecover.js +6 -1
  92. package/lib/esm/components/BottomNavigation/BottomNavigation.js +5 -4
  93. package/lib/esm/components/CategoryHeader/Skeleton.js +3 -2
  94. package/lib/esm/components/ChangeGroupCover/ChangeGroupCover.js +6 -6
  95. package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +19 -16
  96. package/lib/esm/components/Composer/Attributes/Attributes.js +3 -3
  97. package/lib/esm/components/Composer/Composer.js +3 -3
  98. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -1
  99. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +9 -19
  100. package/lib/esm/components/Editor/Editor.js +2 -0
  101. package/lib/esm/components/Editor/nodes/ImageNode.js +6 -0
  102. package/lib/esm/components/Editor/plugins/ImagePlugin.js +4 -0
  103. package/lib/esm/components/Editor/plugins/ToolbarPlugin.js +19 -5
  104. package/lib/esm/components/FeedObject/Actions/Share/Share.js +19 -17
  105. package/lib/esm/components/FeedObject/Contributors/Contributors.js +1 -1
  106. package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
  107. package/lib/esm/components/FeedObject/FeedObject.js +28 -9
  108. package/lib/esm/components/FeedObject/Poll/Poll.js +20 -20
  109. package/lib/esm/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  110. package/lib/esm/components/Footer/Footer.js +2 -2
  111. package/lib/esm/components/Group/Group.d.ts +8 -0
  112. package/lib/esm/components/Group/Group.js +21 -9
  113. package/lib/esm/components/GroupAutocomplete/GroupAutocomplete.js +1 -1
  114. package/lib/esm/components/GroupForm/GroupForm.js +64 -13
  115. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
  116. package/lib/esm/components/GroupHeader/GroupHeader.js +55 -13
  117. package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +63 -9
  118. package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +31 -9
  119. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  120. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.js +218 -0
  121. package/lib/esm/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  122. package/lib/esm/components/GroupInvitedWidget/Skeleton.js +34 -0
  123. package/lib/esm/components/GroupInvitedWidget/constants.d.ts +1 -0
  124. package/lib/esm/components/GroupInvitedWidget/constants.js +1 -0
  125. package/lib/esm/components/GroupInvitedWidget/index.d.ts +4 -0
  126. package/lib/esm/components/GroupInvitedWidget/index.js +4 -0
  127. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  128. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +9 -4
  129. package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +26 -5
  130. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  131. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  132. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  133. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +148 -0
  134. package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
  135. package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
  136. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  137. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +30 -11
  138. package/lib/esm/components/Groups/Groups.d.ts +15 -8
  139. package/lib/esm/components/Groups/Groups.js +91 -37
  140. package/lib/esm/components/Groups/Skeleton.d.ts +4 -0
  141. package/lib/esm/components/Groups/Skeleton.js +2 -2
  142. package/lib/esm/components/InlineComposerWidget/InlineComposerWidget.js +9 -2
  143. package/lib/esm/components/NavigationSettingsIconButton/NavigationSettingsIconButton.js +4 -4
  144. package/lib/esm/components/NavigationToolbar/NavigationToolbar.js +10 -3
  145. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +1 -0
  146. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +11 -3
  147. package/lib/esm/components/Notification/Group/Group.d.ts +15 -0
  148. package/lib/esm/components/Notification/Group/Group.js +75 -0
  149. package/lib/esm/components/Notification/Group/index.d.ts +3 -0
  150. package/lib/esm/components/Notification/Group/index.js +2 -0
  151. package/lib/esm/components/Notification/Notification.js +31 -1
  152. package/lib/esm/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  153. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +7 -1
  154. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +17 -9
  155. package/lib/esm/components/PrivateMessageSettingsIconButton/PrivateMessageSettingsIconButton.js +1 -1
  156. package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  157. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +9 -4
  158. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
  159. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  160. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +48 -22
  161. package/lib/esm/components/PrivateMessageThreadItem/PrivateMessageThreadItem.js +7 -1
  162. package/lib/esm/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  163. package/lib/esm/components/SnippetNotifications/SnippetNotifications.js +7 -0
  164. package/lib/esm/components/ToastNotifications/ToastNotifications.js +7 -0
  165. package/lib/esm/components/User/User.d.ts +6 -1
  166. package/lib/esm/components/User/User.js +5 -4
  167. package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.d.ts +21 -0
  168. package/lib/esm/components/UserSubscribedGroupsWidget/Skeleton.js +42 -0
  169. package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.d.ts +68 -0
  170. package/lib/esm/components/UserSubscribedGroupsWidget/UserSubscribedGroupsWidget.js +180 -0
  171. package/lib/esm/components/UserSubscribedGroupsWidget/constants.d.ts +1 -0
  172. package/lib/esm/components/UserSubscribedGroupsWidget/constants.js +1 -0
  173. package/lib/esm/components/UserSubscribedGroupsWidget/index.d.ts +4 -0
  174. package/lib/esm/components/UserSubscribedGroupsWidget/index.js +4 -0
  175. package/lib/esm/components/VoteAudienceButton/VoteAudienceButton.js +1 -1
  176. package/lib/esm/constants/PubSub.d.ts +28 -0
  177. package/lib/esm/constants/PubSub.js +19 -0
  178. package/lib/esm/index.d.ts +6 -3
  179. package/lib/esm/index.js +6 -3
  180. package/lib/esm/types/index.d.ts +2 -1
  181. package/lib/umd/311.js +2 -0
  182. package/lib/umd/react-ui.js +1 -1
  183. package/package.json +9 -9
  184. package/lib/umd/871.js +0 -2
  185. /package/lib/umd/{871.js.LICENSE.txt → 311.js.LICENSE.txt} +0 -0
@@ -69,36 +69,36 @@ function PollObject(props) {
69
69
  * Handles choice upvote
70
70
  */
71
71
  const handleVote = (id) => {
72
+ const prevChoices = [...choices];
73
+ let updatedChoices;
72
74
  if (multipleChoices) {
73
- setChoices((prevChoices) => {
74
- return prevChoices.map((choice) => Object.assign({}, choice, {
75
- voted: choice.id === id ? true : choice.voted,
76
- vote_count: choice.id === id ? choice.vote_count + 1 : choice.vote_count
77
- }));
78
- });
75
+ updatedChoices = prevChoices.map((choice) => Object.assign({}, choice, {
76
+ voted: choice.id === id ? true : choice.voted,
77
+ vote_count: choice.id === id ? choice.vote_count + 1 : choice.vote_count
78
+ }));
79
79
  setVotes((prevVotes) => prevVotes + 1);
80
80
  }
81
81
  else {
82
- setChoices((prevChoices) => {
83
- const updatedChoices = prevChoices.map((choice) => {
84
- return Object.assign(Object.assign({}, choice), { voted: choice.id === id, vote_count: choice.id === id ? choice.vote_count + 1 : choice.vote_count > 0 && choice.voted ? choice.vote_count - 1 : choice.vote_count });
85
- });
86
- const newVotes = updatedChoices.reduce((totalVotes, choice) => totalVotes + choice.vote_count, 0);
87
- setVotes(newVotes);
88
- return updatedChoices;
89
- });
82
+ updatedChoices = prevChoices.map((choice) => Object.assign({}, choice, {
83
+ voted: choice.id === id,
84
+ vote_count: choice.id === id ? choice.vote_count + 1 : choice.vote_count > 0 && choice.voted ? choice.vote_count - 1 : choice.vote_count
85
+ }));
86
+ setVotes(updatedChoices.reduce((totalVotes, choice) => totalVotes + choice.vote_count, 0));
90
87
  }
88
+ setChoices(updatedChoices);
89
+ onChange(updatedChoices);
91
90
  };
92
91
  /**
93
92
  * Handles choice unvote
94
93
  */
95
94
  const handleUnVote = (id) => {
96
- setChoices((prevChoices) => {
97
- return prevChoices.map((choice) => Object.assign({}, choice, {
98
- voted: choice.id === id ? false : choice.voted,
99
- vote_count: choice.id === id && choice.vote_count > 0 ? choice.vote_count - 1 : choice.vote_count
100
- }));
101
- });
95
+ const prevChoices = [...choices];
96
+ const updatedChoices = prevChoices.map((choice) => Object.assign({}, choice, {
97
+ voted: choice.id === id ? false : choice.voted,
98
+ vote_count: choice.id === id && choice.vote_count > 0 ? choice.vote_count - 1 : choice.vote_count
99
+ }));
100
+ setChoices(updatedChoices);
101
+ onChange(updatedChoices);
102
102
  setVotes((prevVotes) => prevVotes - 1);
103
103
  };
104
104
  /**
@@ -57,7 +57,7 @@ function FeedUpdatesWidget(inProps) {
57
57
  const [updates, setUpdates] = (0, react_1.useState)(false);
58
58
  // REFS
59
59
  const updatesSubscription = (0, react_1.useRef)(null);
60
- // Subscripber for pubsub callback
60
+ // Subscriber for pubsub callback
61
61
  const subscriber = (msg, data) => {
62
62
  if (subscriptionChannelUpdatesCallback(msg, data)) {
63
63
  setUpdates(true);
@@ -96,7 +96,7 @@ function Footer(inProps) {
96
96
  }
97
97
  return (react_1.default.createElement(Root, Object.assign({}, rest, { className: (0, classnames_1.default)(classes.root, className) }),
98
98
  startActions,
99
- react_1.default.createElement(material_1.Box, { className: classes.itemList }, _menu.items.map((item, index) => (react_1.default.createElement(material_1.Button, { component: react_core_1.Link, key: item.id, className: classes.item, to: item.url, variant: "text" }, item.label)))),
99
+ react_1.default.createElement(material_1.Box, { className: classes.itemList }, (0, utils_1.sortByAttr)(_menu.items, 'order').map((item, index) => (react_1.default.createElement(material_1.Button, { component: react_core_1.Link, key: item.id, className: classes.item, to: item.url, variant: "text" }, item.label)))),
100
100
  endActions,
101
101
  react_1.default.createElement(material_1.Typography, { textAlign: "center", className: classes.copyright, variant: "body2", dangerouslySetInnerHTML: { __html: copyright } })));
102
102
  }
@@ -27,6 +27,11 @@ export interface GroupProps extends WidgetProps {
27
27
  * @default false
28
28
  */
29
29
  hideActions?: boolean;
30
+ /**
31
+ * Prop to redirect the user to the group page
32
+ * @default false
33
+ */
34
+ actionRedirect?: boolean;
30
35
  /**
31
36
  * Props to spread to the button
32
37
  * @default {}
@@ -61,6 +66,9 @@ export interface GroupProps extends WidgetProps {
61
66
  |---|---|---|
62
67
  |root|.SCGroup-root|Styles applied to the root element.|
63
68
  |avatar|.SCGroup-avatar|Styles applied to the avatar element.|
69
+ |actions|.SCGroup-actions|Styles applied to the actions section.|
70
+ |icon|.SCGroup-icon|Styles applied to the group privacy icon element.|
71
+
64
72
 
65
73
  *
66
74
  * @param inProps
@@ -4,6 +4,7 @@ const tslib_1 = require("tslib");
4
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
+ const types_1 = require("@selfcommunity/types");
7
8
  const react_core_1 = require("@selfcommunity/react-core");
8
9
  const react_intl_1 = require("react-intl");
9
10
  const classnames_1 = tslib_1.__importDefault(require("classnames"));
@@ -22,7 +23,8 @@ const messages = (0, react_intl_1.defineMessages)({
22
23
  const classes = {
23
24
  root: `${constants_1.PREFIX}-root`,
24
25
  avatar: `${constants_1.PREFIX}-avatar`,
25
- actions: `${constants_1.PREFIX}-actions`
26
+ actions: `${constants_1.PREFIX}-actions`,
27
+ icon: `${constants_1.PREFIX}-icon`
26
28
  };
27
29
  const Root = (0, styles_1.styled)(BaseItemButton_1.default, {
28
30
  name: constants_1.PREFIX,
@@ -53,21 +55,28 @@ const Root = (0, styles_1.styled)(BaseItemButton_1.default, {
53
55
  |---|---|---|
54
56
  |root|.SCGroup-root|Styles applied to the root element.|
55
57
  |avatar|.SCGroup-avatar|Styles applied to the avatar element.|
58
+ |actions|.SCGroup-actions|Styles applied to the actions section.|
59
+ |icon|.SCGroup-icon|Styles applied to the group privacy icon element.|
60
+
56
61
 
57
62
  *
58
63
  * @param inProps
59
64
  */
60
65
  function Group(inProps) {
66
+ var _a;
61
67
  // PROPS
62
68
  const props = (0, system_1.useThemeProps)({
63
69
  props: inProps,
64
70
  name: constants_1.PREFIX
65
71
  });
66
- const { groupId = null, group = null, className = null, elevation, hideActions = false, groupSubscribeButtonProps = {}, visible = true } = props, rest = tslib_1.__rest(props, ["groupId", "group", "className", "elevation", "hideActions", "groupSubscribeButtonProps", "visible"]);
72
+ const { groupId = null, group = null, className = null, elevation, hideActions = false, actionRedirect = false, groupSubscribeButtonProps = {} } = props, rest = tslib_1.__rest(props, ["groupId", "group", "className", "elevation", "hideActions", "actionRedirect", "groupSubscribeButtonProps"]);
67
73
  // STATE
68
74
  const { scGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
69
75
  // CONTEXT
70
76
  const scRoutingContext = (0, react_core_1.useSCRouting)();
77
+ const scUserContext = (0, react_core_1.useSCUser)();
78
+ // CONST
79
+ 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]);
71
80
  const [openAlert, setOpenAlert] = (0, react_1.useState)(false);
72
81
  // INTL
73
82
  const intl = (0, react_intl_1.useIntl)();
@@ -77,8 +86,8 @@ function Group(inProps) {
77
86
  */
78
87
  function renderAuthenticatedActions() {
79
88
  return (react_1.default.createElement(material_1.Stack, { className: classes.actions, direction: "row", alignItems: "center", justifyContent: "center", spacing: 2 },
80
- react_1.default.createElement(material_1.Icon, null, !visible ? 'private' : 'public'),
81
- react_1.default.createElement(GroupSubscribeButton_1.default, Object.assign({ group: group, groupId: groupId }, groupSubscribeButtonProps))));
89
+ isGroupAdmin && react_1.default.createElement(material_1.Icon, null, "face"),
90
+ actionRedirect ? (react_1.default.createElement(material_1.Button, { size: "small", variant: "outlined", component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, scGroup) }, scGroup.subscription_status === types_1.SCGroupSubscriptionStatusType.SUBSCRIBED ? (react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.group.status.enter", id: "ui.group.status.enter" })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.group.status.discover", id: "ui.group.status.discover" })))) : (react_1.default.createElement(GroupSubscribeButton_1.default, Object.assign({ group: group, groupId: groupId }, groupSubscribeButtonProps)))));
82
91
  }
83
92
  /**
84
93
  * Renders group object
@@ -90,7 +99,10 @@ function Group(inProps) {
90
99
  * Renders root object
91
100
  */
92
101
  return (react_1.default.createElement(react_1.default.Fragment, null,
93
- react_1.default.createElement(Root, Object.assign({ elevation: elevation }, rest, { className: (0, classnames_1.default)(classes.root, className), ButtonBaseProps: { component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, scGroup) }, image: react_1.default.createElement(material_1.Avatar, { alt: scGroup.name, src: scGroup.image_medium, className: classes.avatar }), primary: scGroup.name, secondary: `${intl.formatMessage(messages.groupMembers, { total: scGroup.subscribers_counter })}`, actions: hideActions ? null : renderAuthenticatedActions() })),
102
+ react_1.default.createElement(Root, Object.assign({ elevation: elevation }, rest, { className: (0, classnames_1.default)(classes.root, className), ButtonBaseProps: { component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, scGroup) }, image: react_1.default.createElement(material_1.Avatar, { alt: scGroup.name, src: scGroup.image_medium, className: classes.avatar }), primary: react_1.default.createElement(react_1.default.Fragment, null,
103
+ scGroup.name,
104
+ " ",
105
+ react_1.default.createElement(material_1.Icon, { className: classes.icon }, (group === null || group === void 0 ? void 0 : group.privacy) === types_1.SCGroupPrivacyType.PRIVATE ? 'private' : 'public')), secondary: `${intl.formatMessage(messages.groupMembers, { total: scGroup.subscribers_counter })}`, actions: hideActions ? null : renderAuthenticatedActions() })),
94
106
  openAlert && react_1.default.createElement(UserDeletedSnackBar_1.default, { open: openAlert, handleClose: () => setOpenAlert(false) })));
95
107
  }
96
108
  exports.default = Group;
@@ -80,7 +80,7 @@ const GroupAutocomplete = (inProps) => {
80
80
  setValue(value);
81
81
  };
82
82
  // Render
83
- return (react_1.default.createElement(Root, Object.assign({ freeSolo: true, className: classes.root, open: open, onOpen: handleOpen, onClose: handleClose, options: groups || [], getOptionLabel: (option) => option.name || '', value: value, selectOnFocus: true, clearOnBlur: true, blurOnSelect: true, handleHomeEndKeys: true, clearIcon: null, disabled: disabled || isLoading, noOptionsText: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupAutocomplete.empty", defaultMessage: "ui.groupAutocomplete.empty" }), onChange: handleChange, isOptionEqualToValue: (option, value) => value.id === option.id,
83
+ return (react_1.default.createElement(Root, Object.assign({ className: classes.root, open: open, onOpen: handleOpen, onClose: handleClose, options: groups || [], getOptionLabel: (option) => option.name || '', value: value, selectOnFocus: true, clearOnBlur: true, blurOnSelect: true, handleHomeEndKeys: true, clearIcon: null, disabled: disabled || isLoading, noOptionsText: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupAutocomplete.empty", defaultMessage: "ui.groupAutocomplete.empty" }), onChange: handleChange, isOptionEqualToValue: (option, value) => value.id === option.id,
84
84
  // renderTags={(value, getTagProps) => {
85
85
  // return value.map((option: any, index) => (
86
86
  // <Chip key={option.id} id={option.id} label={option.name} color={option.color} {...getTagProps({index})} />
@@ -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
- for (const key in field.invitedUsers) {
159
- formData.append(key, field.invitedUsers[key]);
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,34 +228,63 @@ 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" },
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) } })),
235
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.title", defaultMessage: "ui.groupForm.privacy.title", values: {
236
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
237
+ // @ts-ignore
238
+ b: (chunks) => react_1.default.createElement("strong", null, chunks)
239
+ } })),
214
240
  react_1.default.createElement(material_1.Stack, { direction: "row", spacing: 1, alignItems: "center" },
215
241
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isPublic }) },
216
242
  react_1.default.createElement(material_1.Icon, null, "private"),
217
243
  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 }))) }),
244
+ 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
245
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: field.isPublic }) },
220
246
  react_1.default.createElement(material_1.Icon, null, "public"),
221
247
  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,
248
+ 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: {
249
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
250
+ // @ts-ignore
251
+ b: (chunks) => react_1.default.createElement("strong", null, chunks)
252
+ } })) : (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: {
253
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
254
+ // @ts-ignore
255
+ b: (chunks) => react_1.default.createElement("strong", null, chunks)
256
+ } })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private.info", defaultMessage: "ui.groupForm.private.public.info", values: {
257
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
258
+ // @ts-ignore
259
+ b: (chunks) => react_1.default.createElement("strong", null, chunks)
260
+ } })))))),
261
+ 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
262
  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) } })),
263
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.title", defaultMessage: "ui.groupForm.visibility.title", values: {
264
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
265
+ // @ts-ignore
266
+ b: (chunks) => react_1.default.createElement("strong", null, chunks)
267
+ } })),
226
268
  react_1.default.createElement(material_1.Stack, { direction: "row", spacing: 1, alignItems: "center" },
227
269
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isVisible }) },
228
270
  react_1.default.createElement(material_1.Icon, null, "visibility_off"),
229
271
  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 }))) }),
272
+ 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
273
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: field.isVisible }) },
232
274
  react_1.default.createElement(material_1.Icon, null, "visibility"),
233
275
  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 })))));
276
+ 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: {
277
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
278
+ // @ts-ignore
279
+ b: (chunks) => react_1.default.createElement("strong", null, chunks)
280
+ } })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.visible.info", defaultMessage: "ui.groupForm.visibility.visible.info", values: {
281
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
282
+ // @ts-ignore
283
+ b: (chunks) => react_1.default.createElement("strong", null, chunks)
284
+ } }))))))),
285
+ !group && (react_1.default.createElement(react_1.default.Fragment, null,
286
+ react_1.default.createElement(material_1.Divider, null),
287
+ react_1.default.createElement(material_1.Box, { className: classes.inviteSection },
288
+ react_1.default.createElement(GroupInviteButton_1.default, { handleInvitations: handleInviteSection })))))));
238
289
  }
239
290
  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 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
  */
@@ -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 = {}, GroupMembersButtonProps = {}, actions } = props, rest = tslib_1.__rest(props, ["id", "className", "group", "groupId", "ChangePictureProps", "ChangeCoverProps", "GroupMembersButtonProps", "actions"]);
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 canEdit = (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]);
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 (canEdit) {
90
- setSCGroup(Object.assign({}, scGroup, { image_bigger: avatar }));
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 (canEdit) {
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.image_bigger ? scGroup.image_bigger : '' }))),
114
- canEdit && (react_1.default.createElement(react_1.default.Fragment, null,
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
- canEdit && react_1.default.createElement(EditGroupButton_1.default, { group: scGroup, groupId: scGroup.id, onEditSuccess: (data) => setSCGroup(data) }),
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(material_1.Box, { className: classes.members },
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
- actions && actions)));
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.__importDefault(require("react"));
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,26 +106,49 @@ 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.groupForm.privacy.public", defaultMessage: "ui.groupForm.privacy.public" })),
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.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,
111
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.privacy.public.info", defaultMessage: "ui.groupInfoWidget.privacy.public.info", values: {
112
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
113
+ // @ts-ignore
114
+ b: (chunks) => react_1.default.createElement("strong", null, chunks)
115
+ } })))) : (react_1.default.createElement(react_1.default.Fragment, null,
81
116
  react_1.default.createElement(material_1.Typography, { className: classes.privacyTitle },
82
117
  react_1.default.createElement(material_1.Icon, null, "private"),
83
- react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private", defaultMessage: "ui.groupForm.privacy.private" })),
118
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.privacy.private", defaultMessage: "ui.groupInfoWidget.privacy.private" })),
84
119
  react_1.default.createElement(material_1.Typography, { variant: "body2" },
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) } }))))),
120
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.privacy.private.info", defaultMessage: "ui.groupInfoWidget.private.public.info", values: {
121
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
122
+ // @ts-ignore
123
+ b: (chunks) => react_1.default.createElement("strong", null, chunks)
124
+ } }))))),
86
125
  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
126
  react_1.default.createElement(material_1.Typography, { className: classes.visibilityTitle },
88
127
  react_1.default.createElement(material_1.Icon, null, "visibility"),
89
128
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.visible", defaultMessage: "ui.groupForm.visibility.visible" })),
90
129
  react_1.default.createElement(material_1.Typography, { variant: "body2" },
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,
130
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.visible.info", defaultMessage: "ui.groupForm.visibility.visible.info", values: {
131
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
132
+ // @ts-ignore
133
+ b: (chunks) => react_1.default.createElement("strong", null, chunks)
134
+ } })))) : (react_1.default.createElement(react_1.default.Fragment, null,
92
135
  react_1.default.createElement(material_1.Typography, { className: classes.visibilityTitle },
93
136
  react_1.default.createElement(material_1.Icon, null, "visibility_off"),
94
137
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.hidden", defaultMessage: "ui.groupForm.visibility.hidden" })),
95
138
  react_1.default.createElement(material_1.Typography, { variant: "body2" },
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) } })))))),
139
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.hidden.info", defaultMessage: "ui.groupForm.visibility.hidden.info", values: {
140
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
141
+ // @ts-ignore
142
+ b: (chunks) => react_1.default.createElement("strong", null, chunks)
143
+ } })))))),
97
144
  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' }) } })))));
145
+ 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' }) } })),
146
+ react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.admin },
147
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInfoWidget.admin", defaultMessage: "ui.groupInfoWidget.admin", values: {
148
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
149
+ // @ts-ignore
150
+ b: (chunks) => react_1.default.createElement("strong", null, chunks),
151
+ admin: scGroup === null || scGroup === void 0 ? void 0 : scGroup.managed_by.username
152
+ } })))));
99
153
  }
100
154
  exports.default = GroupInfoWidget;