@selfcommunity/react-ui 0.7.9-alpha.4 → 0.7.9-alpha.41

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 (132) hide show
  1. package/lib/cjs/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  2. package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  3. package/lib/cjs/components/Composer/Attributes/Attributes.js +3 -3
  4. package/lib/cjs/components/Composer/Composer.js +3 -5
  5. package/lib/cjs/components/Composer/Content/ContentPost/ContentPost.js +4 -3
  6. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -2
  7. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +18 -6
  8. package/lib/cjs/components/EditGroupButton/EditGroupButton.js +4 -0
  9. package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
  10. package/lib/cjs/components/FeedObject/FeedObject.js +23 -6
  11. package/lib/cjs/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  12. package/lib/cjs/components/Group/Group.js +9 -3
  13. package/lib/cjs/components/GroupForm/GroupForm.js +31 -9
  14. package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -5
  15. package/lib/cjs/components/GroupHeader/GroupHeader.js +52 -11
  16. package/lib/cjs/components/GroupHeader/Skeleton.d.ts +2 -4
  17. package/lib/cjs/components/GroupHeader/Skeleton.js +10 -10
  18. package/lib/cjs/components/GroupInfoWidget/GroupInfoWidget.js +40 -7
  19. package/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +8 -7
  20. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  21. package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.js +197 -0
  22. package/lib/cjs/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  23. package/lib/cjs/components/GroupInvitedWidget/Skeleton.js +38 -0
  24. package/lib/cjs/components/GroupInvitedWidget/constants.d.ts +1 -0
  25. package/lib/cjs/components/GroupInvitedWidget/constants.js +4 -0
  26. package/lib/cjs/components/GroupInvitedWidget/index.d.ts +4 -0
  27. package/lib/cjs/components/GroupInvitedWidget/index.js +8 -0
  28. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  29. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +7 -2
  30. package/lib/cjs/components/GroupMembersWidget/GroupMembersWidget.js +25 -4
  31. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  32. package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  33. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  34. package/lib/cjs/components/GroupSettingsIconButton/GroupSettingsIconButton.js +145 -0
  35. package/lib/cjs/components/GroupSettingsIconButton/index.d.ts +3 -0
  36. package/lib/cjs/components/GroupSettingsIconButton/index.js +5 -0
  37. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  38. package/lib/cjs/components/GroupSubscribeButton/GroupSubscribeButton.js +31 -10
  39. package/lib/cjs/components/Groups/Groups.d.ts +28 -13
  40. package/lib/cjs/components/Groups/Groups.js +71 -89
  41. package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  42. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
  43. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
  44. package/lib/cjs/components/Notification/Group/Group.d.ts +15 -0
  45. package/lib/cjs/components/Notification/Group/Group.js +78 -0
  46. package/lib/cjs/components/Notification/Group/index.d.ts +3 -0
  47. package/lib/cjs/components/Notification/Group/index.js +5 -0
  48. package/lib/cjs/components/Notification/Notification.js +31 -1
  49. package/lib/cjs/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  50. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  51. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +10 -7
  52. package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  53. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  54. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +24 -6
  55. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  56. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +45 -20
  57. package/lib/cjs/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  58. package/lib/cjs/components/SnippetNotifications/SnippetNotifications.js +7 -0
  59. package/lib/cjs/components/ToastNotifications/ToastNotifications.js +7 -0
  60. package/lib/cjs/components/User/User.d.ts +5 -0
  61. package/lib/cjs/components/User/User.js +5 -4
  62. package/lib/cjs/constants/PubSub.d.ts +27 -0
  63. package/lib/cjs/constants/PubSub.js +21 -0
  64. package/lib/cjs/index.d.ts +5 -2
  65. package/lib/cjs/index.js +12 -4
  66. package/lib/esm/components/ChangeGroupCover/ChangeGroupCover.js +24 -1
  67. package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +32 -11
  68. package/lib/esm/components/Composer/Attributes/Attributes.js +3 -3
  69. package/lib/esm/components/Composer/Composer.js +3 -5
  70. package/lib/esm/components/Composer/Content/ContentPost/ContentPost.js +4 -3
  71. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.d.ts +1 -2
  72. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +18 -6
  73. package/lib/esm/components/EditGroupButton/EditGroupButton.js +5 -1
  74. package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
  75. package/lib/esm/components/FeedObject/FeedObject.js +24 -7
  76. package/lib/esm/components/FeedUpdatesWidget/FeedUpdatesWidget.js +1 -1
  77. package/lib/esm/components/Group/Group.js +11 -5
  78. package/lib/esm/components/GroupForm/GroupForm.js +31 -9
  79. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -5
  80. package/lib/esm/components/GroupHeader/GroupHeader.js +54 -13
  81. package/lib/esm/components/GroupHeader/Skeleton.d.ts +2 -4
  82. package/lib/esm/components/GroupHeader/Skeleton.js +10 -10
  83. package/lib/esm/components/GroupInfoWidget/GroupInfoWidget.js +40 -7
  84. package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +8 -7
  85. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.d.ts +74 -0
  86. package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.js +194 -0
  87. package/lib/esm/components/GroupInvitedWidget/Skeleton.d.ts +22 -0
  88. package/lib/esm/components/GroupInvitedWidget/Skeleton.js +34 -0
  89. package/lib/esm/components/GroupInvitedWidget/constants.d.ts +1 -0
  90. package/lib/esm/components/GroupInvitedWidget/constants.js +1 -0
  91. package/lib/esm/components/GroupInvitedWidget/index.d.ts +4 -0
  92. package/lib/esm/components/GroupInvitedWidget/index.js +4 -0
  93. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +5 -0
  94. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +8 -3
  95. package/lib/esm/components/GroupMembersWidget/GroupMembersWidget.js +26 -5
  96. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -5
  97. package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +18 -7
  98. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.d.ts +48 -0
  99. package/lib/esm/components/GroupSettingsIconButton/GroupSettingsIconButton.js +142 -0
  100. package/lib/esm/components/GroupSettingsIconButton/index.d.ts +3 -0
  101. package/lib/esm/components/GroupSettingsIconButton/index.js +2 -0
  102. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.d.ts +8 -3
  103. package/lib/esm/components/GroupSubscribeButton/GroupSubscribeButton.js +32 -11
  104. package/lib/esm/components/Groups/Groups.d.ts +28 -13
  105. package/lib/esm/components/Groups/Groups.js +76 -94
  106. package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.js +1 -1
  107. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.d.ts +4 -0
  108. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +2 -3
  109. package/lib/esm/components/Notification/Group/Group.d.ts +15 -0
  110. package/lib/esm/components/Notification/Group/Group.js +75 -0
  111. package/lib/esm/components/Notification/Group/index.d.ts +3 -0
  112. package/lib/esm/components/Notification/Group/index.js +2 -0
  113. package/lib/esm/components/Notification/Notification.js +31 -1
  114. package/lib/esm/components/Notification/PrivateMessage/PrivateMessage.js +16 -5
  115. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  116. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +11 -8
  117. package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  118. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  119. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +26 -8
  120. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  121. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +47 -22
  122. package/lib/esm/components/SearchAutocomplete/SearchAutocomplete.js +22 -5
  123. package/lib/esm/components/SnippetNotifications/SnippetNotifications.js +7 -0
  124. package/lib/esm/components/ToastNotifications/ToastNotifications.js +7 -0
  125. package/lib/esm/components/User/User.d.ts +5 -0
  126. package/lib/esm/components/User/User.js +5 -4
  127. package/lib/esm/constants/PubSub.d.ts +27 -0
  128. package/lib/esm/constants/PubSub.js +18 -0
  129. package/lib/esm/index.d.ts +5 -2
  130. package/lib/esm/index.js +7 -4
  131. package/lib/umd/react-ui.js +1 -1
  132. package/package.json +6 -6
@@ -23,6 +23,10 @@ const messages = defineMessages({
23
23
  errorLoadImage: {
24
24
  id: 'ui.changeGroupCover.button.change.alertErrorImage',
25
25
  defaultMessage: 'ui.changeGroupCover.button.change.alertErrorImage'
26
+ },
27
+ errorImageSize: {
28
+ id: 'ui.changeGroupCover.alert',
29
+ defaultMessage: 'ui.changeGroupCover.alert'
26
30
  }
27
31
  });
28
32
  /**
@@ -73,7 +77,26 @@ export default function ChangeGroupCover(inProps) {
73
77
  */
74
78
  const handleUpload = (event) => {
75
79
  fileInput = event.target.files[0];
76
- isCreationMode ? onChange && onChange(fileInput) : handleSave();
80
+ if (fileInput) {
81
+ const reader = new FileReader();
82
+ reader.onload = (e) => {
83
+ const img = new Image();
84
+ img.onload = () => {
85
+ if (img.width < 1920) {
86
+ setAlert(intl.formatMessage(messages.errorImageSize));
87
+ }
88
+ else {
89
+ isCreationMode ? onChange && onChange(fileInput) : handleSave();
90
+ }
91
+ };
92
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
93
+ // @ts-ignore
94
+ img.src = e.target.result;
95
+ };
96
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
97
+ // @ts-ignore
98
+ reader.readAsDataURL(fileInput);
99
+ }
77
100
  };
78
101
  /**
79
102
  * Handles cover saving after upload action
@@ -14,8 +14,8 @@ import { defineMessages, useIntl } from 'react-intl';
14
14
  import { LoadingButton } from '@mui/lab';
15
15
  const messages = defineMessages({
16
16
  errorLoadImage: {
17
- id: 'ui.changeGroupCover.button.change.alertErrorImage',
18
- defaultMessage: 'ui.changeGroupCover.button.change.alertErrorImage'
17
+ id: 'ui.changeGroupPicture.alert',
18
+ defaultMessage: 'ui.changeGroupPicture.alert'
19
19
  }
20
20
  });
21
21
  const classes = {
@@ -57,12 +57,12 @@ export default function ChangeGroupPicture(inProps) {
57
57
  name: PREFIX
58
58
  });
59
59
  const { groupId, onChange, autoHide, className, isCreationMode = false } = props, rest = __rest(props, ["groupId", "onChange", "autoHide", "className", "isCreationMode"]);
60
+ //CONTEXT
61
+ const scUserContext = useContext(SCUserContext);
60
62
  //STATE
63
+ let fileInput = useRef(null);
61
64
  const [loading, setLoading] = useState(false);
62
65
  const [alert, setAlert] = useState(null);
63
- let fileInput = useRef(null);
64
- //CONTEXT
65
- const scUserContext = useContext(SCUserContext);
66
66
  // INTL
67
67
  const intl = useIntl();
68
68
  // Anonymous
@@ -73,26 +73,47 @@ export default function ChangeGroupPicture(inProps) {
73
73
  * Handles avatar upload
74
74
  * @param event
75
75
  */
76
- function handleUpload(event) {
76
+ const handleUpload = (event) => {
77
77
  fileInput = event.target.files[0];
78
- isCreationMode ? onChange && onChange(fileInput) : handleSave();
79
- }
78
+ if (fileInput) {
79
+ const reader = new FileReader();
80
+ reader.onload = (e) => {
81
+ const img = new Image();
82
+ img.onload = () => {
83
+ if (img.width < 600 && img.height < 600) {
84
+ setAlert(intl.formatMessage(messages.errorLoadImage));
85
+ }
86
+ else {
87
+ isCreationMode ? onChange && onChange(fileInput) : handleSave();
88
+ }
89
+ };
90
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
91
+ // @ts-ignore
92
+ img.src = e.target.result;
93
+ };
94
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
95
+ // @ts-ignore
96
+ reader.readAsDataURL(fileInput);
97
+ }
98
+ };
80
99
  /**
81
100
  * Performs save avatar after upload
82
101
  */
83
102
  function handleSave() {
84
103
  setLoading(true);
85
104
  const formData = new FormData();
105
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
106
+ // @ts-ignore
86
107
  formData.append('image_original', fileInput);
87
108
  GroupService.changeGroupAvatarOrCover(groupId, formData, { headers: { 'Content-Type': 'multipart/form-data' } })
88
109
  .then((data) => {
110
+ onChange && onChange(data.image_big);
89
111
  setLoading(false);
90
- onChange && onChange(data.image_bigger);
91
112
  })
92
113
  .catch((error) => {
93
- setAlert(intl.formatMessage(messages.errorLoadImage));
94
- setLoading(false);
95
114
  Logger.error(SCOPE_SC_UI, error);
115
+ setLoading(false);
116
+ setAlert(intl.formatMessage(messages.errorLoadImage));
96
117
  });
97
118
  }
98
119
  /**
@@ -13,7 +13,7 @@ const Root = styled(Box, {
13
13
  slot: 'AttributesRoot'
14
14
  })(() => ({}));
15
15
  export default (props) => {
16
- var _a, _b;
16
+ var _a, _b, _c;
17
17
  // PROPS
18
18
  const { className = null, value = null, onChange = null, onClick = null } = props;
19
19
  // HANDLERS
@@ -44,8 +44,8 @@ export default (props) => {
44
44
  return (React.createElement(Root, { className: classNames(classes.root, className) },
45
45
  ((_a = value === null || value === void 0 ? void 0 : value.categories) === null || _a === void 0 ? void 0 : _a.length) > 0 &&
46
46
  (value === null || value === void 0 ? void 0 : value.categories.map((c) => (React.createElement(Chip, { key: c.id, label: c.name, onDelete: handleDeleteCategory(c.id), icon: React.createElement(Icon, null, "category"), onClick: handleClickCategory })))),
47
- (value === null || value === void 0 ? void 0 : value.group) && (React.createElement(Chip, { key: value === null || value === void 0 ? void 0 : value.group.id, label: value === null || value === void 0 ? void 0 : value.group.name, onDelete: handleDeleteGroup, icon: React.createElement(Icon, null, "groups"), onClick: handleClickGroup })),
48
- ((_b = value === null || value === void 0 ? void 0 : value.addressing) === null || _b === void 0 ? void 0 : _b.length) > 0 &&
47
+ (value === null || value === void 0 ? void 0 : value.group) && (React.createElement(Chip, { key: value === null || value === void 0 ? void 0 : value.group.id, label: value === null || value === void 0 ? void 0 : value.group.name, onDelete: handleDeleteGroup, icon: React.createElement(Icon, null, "groups"), onClick: handleClickGroup, disabled: !((_b = value === null || value === void 0 ? void 0 : value.group) === null || _b === void 0 ? void 0 : _b.subscription_status) })),
48
+ ((_c = value === null || value === void 0 ? void 0 : value.addressing) === null || _c === void 0 ? void 0 : _c.length) > 0 &&
49
49
  (value === null || value === void 0 ? void 0 : value.addressing.map((t) => (React.createElement(TagChip, { key: t.id, tag: t, onDelete: handleDeleteTag(t.id), icon: React.createElement(Icon, null, "label"), onClick: handleClickTag })))),
50
50
  (value === null || value === void 0 ? void 0 : value.location) && (React.createElement(Chip, { icon: React.createElement(Icon, null, "add_location_alt"), label: value === null || value === void 0 ? void 0 : value.location.location, onDelete: handleDeleteLocation, onClick: handleClickLocation }))));
51
51
  };
@@ -27,7 +27,6 @@ import Attributes from './Attributes';
27
27
  import { PREFIX } from './constants';
28
28
  import ComposerSkeleton from './Skeleton';
29
29
  import CloseLayer from './Layer/CloseLayer';
30
- import { AudienceTypes } from './Layer/AudienceLayer/AudienceLayer';
31
30
  const DialogTransition = forwardRef(function Transition(props, ref) {
32
31
  return React.createElement(Fade, Object.assign({ ref: ref }, props));
33
32
  });
@@ -306,7 +305,7 @@ export default function Composer(inProps) {
306
305
  }
307
306
  }), [handleAddLayer, handleRemoveLayer, handleChangeCategories, categories]);
308
307
  const handleChangeAudience = useCallback((value) => {
309
- if (group) {
308
+ if (group || typeof value === 'object') {
310
309
  dispatch({ type: 'group', value });
311
310
  }
312
311
  else {
@@ -320,8 +319,7 @@ export default function Composer(inProps) {
320
319
  ComponentProps: {
321
320
  onClose: handleRemoveLayer,
322
321
  onSave: handleChangeAudience,
323
- defaultValue: group ? group : addressing,
324
- defaultType: group ? AudienceTypes.AUDIENCE_GROUP : addressing ? AudienceTypes.AUDIENCE_TAG : AudienceTypes.AUDIENCE_ALL
322
+ defaultValue: group || typeof addressing === 'object' ? group : addressing
325
323
  }
326
324
  }), [handleAddLayer, handleRemoveLayer, handleChangeAudience, addressing, group]);
327
325
  const handleChangeLocation = useCallback((value) => {
@@ -553,7 +551,7 @@ export default function Composer(inProps) {
553
551
  }),
554
552
  React.createElement(IconButton, { disabled: isSubmitting, onClick: handleAddCategoryLayer },
555
553
  React.createElement(Icon, null, "category")),
556
- React.createElement(IconButton, { disabled: isSubmitting || !features.includes(SCFeatureName.TAGGING), onClick: handleAddAudienceLayer }, addressing === null || addressing.length === 0 ? React.createElement(Icon, null, "public") : React.createElement(Icon, null, "label")),
554
+ React.createElement(IconButton, { disabled: isSubmitting || !features.includes(SCFeatureName.TAGGING) || Boolean(feedObject === null || feedObject === void 0 ? void 0 : feedObject.group), onClick: handleAddAudienceLayer }, (!group && addressing === null) || (addressing === null || addressing === void 0 ? void 0 : addressing.length) === 0 ? React.createElement(Icon, null, "public") : group ? React.createElement(Icon, null, "groups") : React.createElement(Icon, null, "label")),
557
555
  preferences[SCPreferences.ADDONS_POST_GEOLOCATION_ENABLED].value && (React.createElement(IconButton, { disabled: isSubmitting, onClick: handleAddLocationLayer, color: location !== null ? 'primary' : 'default' },
558
556
  React.createElement(Icon, null, "add_location_alt"))))),
559
557
  layer && (React.createElement(LayerTransitionRoot, { className: classes.layerTransitionRoot, in: true, container: dialogRef.current, direction: "left" },
@@ -22,7 +22,8 @@ const DEFAULT_POST = {
22
22
  categories: [],
23
23
  medias: [],
24
24
  html: '',
25
- addressing: []
25
+ addressing: [],
26
+ group: null
26
27
  };
27
28
  export default (props) => {
28
29
  // PROPS
@@ -40,7 +41,7 @@ export default (props) => {
40
41
  }, [value]);
41
42
  // RENDER
42
43
  return (React.createElement(Root, { className: classNames(classes.root, className) },
43
- generalError && React.createElement(Typography, { className: classes.generalError },
44
- React.createElement(FormattedMessage, { id: `ui.composer.error.${generalError}`, defaultMessage: `ui.composer.error.${generalError}` })),
44
+ generalError && (React.createElement(Typography, { className: classes.generalError },
45
+ React.createElement(FormattedMessage, { id: `ui.composer.error.${generalError}`, defaultMessage: `ui.composer.error.${generalError}` }))),
45
46
  React.createElement(Editor, Object.assign({ ref: editorRef }, EditorProps, { editable: !disabled, className: classes.editor, onChange: handleChangeHtml, defaultValue: value.html }))));
46
47
  };
@@ -10,9 +10,8 @@ export declare enum AudienceTypes {
10
10
  AUDIENCE_GROUP = "group"
11
11
  }
12
12
  export interface AudienceLayerProps extends Omit<BoxProps, 'defaultValue'>, ComposerLayerProps {
13
- defaultType: AudienceTypes;
14
13
  defaultValue: SCTagType[] | SCGroupType;
15
14
  TextFieldProps?: TextFieldProps;
16
15
  }
17
- declare const AudienceLayer: React.ForwardRefExoticComponent<Pick<AudienceLayerProps, "p" | "slot" | "style" | "title" | "key" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "border" | "borderTop" | "borderRight" | "borderBottom" | "borderLeft" | "borderColor" | "borderRadius" | "display" | "displayPrint" | "overflow" | "textOverflow" | "visibility" | "whiteSpace" | "flexBasis" | "flexDirection" | "flexWrap" | "justifyContent" | "alignItems" | "alignContent" | "order" | "flex" | "flexGrow" | "flexShrink" | "alignSelf" | "justifyItems" | "justifySelf" | "gap" | "columnGap" | "rowGap" | "gridColumn" | "gridRow" | "gridAutoFlow" | "gridAutoColumns" | "gridAutoRows" | "gridTemplateColumns" | "gridTemplateRows" | "gridTemplateAreas" | "gridArea" | "bgcolor" | "zIndex" | "position" | "top" | "right" | "bottom" | "left" | "boxShadow" | "width" | "maxWidth" | "minWidth" | "height" | "maxHeight" | "minHeight" | "boxSizing" | "m" | "mt" | "mr" | "mb" | "ml" | "mx" | "my" | "pt" | "pr" | "pb" | "pl" | "px" | "py" | "margin" | "marginTop" | "marginRight" | "marginBottom" | "marginLeft" | "marginX" | "marginY" | "marginInline" | "marginInlineStart" | "marginInlineEnd" | "marginBlock" | "marginBlockStart" | "marginBlockEnd" | "padding" | "paddingTop" | "paddingRight" | "paddingBottom" | "paddingLeft" | "paddingX" | "paddingY" | "paddingInline" | "paddingInlineStart" | "paddingInlineEnd" | "paddingBlock" | "paddingBlockStart" | "paddingBlockEnd" | "typography" | "fontFamily" | "fontSize" | "fontStyle" | "fontWeight" | "letterSpacing" | "lineHeight" | "textAlign" | "textTransform" | "component" | "sx" | "classes" | "onClose" | "TextFieldProps" | "defaultType" | "onSave"> & React.RefAttributes<unknown>>;
16
+ declare const AudienceLayer: React.ForwardRefExoticComponent<Pick<AudienceLayerProps, "p" | "slot" | "style" | "title" | "key" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "border" | "borderTop" | "borderRight" | "borderBottom" | "borderLeft" | "borderColor" | "borderRadius" | "display" | "displayPrint" | "overflow" | "textOverflow" | "visibility" | "whiteSpace" | "flexBasis" | "flexDirection" | "flexWrap" | "justifyContent" | "alignItems" | "alignContent" | "order" | "flex" | "flexGrow" | "flexShrink" | "alignSelf" | "justifyItems" | "justifySelf" | "gap" | "columnGap" | "rowGap" | "gridColumn" | "gridRow" | "gridAutoFlow" | "gridAutoColumns" | "gridAutoRows" | "gridTemplateColumns" | "gridTemplateRows" | "gridTemplateAreas" | "gridArea" | "bgcolor" | "zIndex" | "position" | "top" | "right" | "bottom" | "left" | "boxShadow" | "width" | "maxWidth" | "minWidth" | "height" | "maxHeight" | "minHeight" | "boxSizing" | "m" | "mt" | "mr" | "mb" | "ml" | "mx" | "my" | "pt" | "pr" | "pb" | "pl" | "px" | "py" | "margin" | "marginTop" | "marginRight" | "marginBottom" | "marginLeft" | "marginX" | "marginY" | "marginInline" | "marginInlineStart" | "marginInlineEnd" | "marginBlock" | "marginBlockStart" | "marginBlockEnd" | "padding" | "paddingTop" | "paddingRight" | "paddingBottom" | "paddingLeft" | "paddingX" | "paddingY" | "paddingInline" | "paddingInlineStart" | "paddingInlineEnd" | "paddingBlock" | "paddingBlockStart" | "paddingBlockEnd" | "typography" | "fontFamily" | "fontSize" | "fontStyle" | "fontWeight" | "letterSpacing" | "lineHeight" | "textAlign" | "textTransform" | "component" | "sx" | "classes" | "onClose" | "TextFieldProps" | "onSave"> & React.RefAttributes<unknown>>;
18
17
  export default AudienceLayer;
@@ -32,10 +32,10 @@ const Root = styled(Box, {
32
32
  })(() => ({}));
33
33
  const AudienceLayer = React.forwardRef((props, ref) => {
34
34
  // Props
35
- const { className, onClose, onSave, defaultType = AudienceTypes.AUDIENCE_TAG, defaultValue = AudienceTypes.AUDIENCE_TAG ? [] : null, TextFieldProps = {
35
+ const { className, onClose, onSave, defaultValue = AudienceTypes.AUDIENCE_TAG ? [] : null, TextFieldProps = {
36
36
  variant: 'outlined',
37
37
  label: React.createElement(FormattedMessage, { id: "ui.composer.layer.audience.tags.label", defaultMessage: "ui.composer.layer.audience.tags.label" })
38
- } } = props, rest = __rest(props, ["className", "onClose", "onSave", "defaultType", "defaultValue", "TextFieldProps"]);
38
+ } } = props, rest = __rest(props, ["className", "onClose", "onSave", "defaultValue", "TextFieldProps"]);
39
39
  // STATE
40
40
  const [autocompleteOpen, setAutocompleteOpen] = useState(false);
41
41
  const [audience, setAudience] = useState(
@@ -43,7 +43,7 @@ const AudienceLayer = React.forwardRef((props, ref) => {
43
43
  // @ts-ignore
44
44
  defaultValue === null || defaultValue.length === 0
45
45
  ? AudienceTypes.AUDIENCE_ALL
46
- : defaultType === AudienceTypes.AUDIENCE_GROUP
46
+ : defaultValue && typeof defaultValue === 'object'
47
47
  ? AudienceTypes.AUDIENCE_GROUP
48
48
  : AudienceTypes.AUDIENCE_TAG);
49
49
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -55,7 +55,7 @@ const AudienceLayer = React.forwardRef((props, ref) => {
55
55
  const handleSave = useCallback(
56
56
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
57
57
  // @ts-ignore
58
- () => (defaultType === AudienceTypes.AUDIENCE_GROUP ? onSave(value) : onSave((value === null || value === void 0 ? void 0 : value.length) && (value === null || value === void 0 ? void 0 : value.length) > 0 ? value : null)), [value, onSave]);
58
+ () => (audience === AudienceTypes.AUDIENCE_GROUP ? onSave(value) : onSave((value === null || value === void 0 ? void 0 : value.length) && (value === null || value === void 0 ? void 0 : value.length) > 0 ? value : null)), [value, onSave, audience]);
59
59
  const handleChange = useCallback((event, tags) => setValue(tags), []);
60
60
  const handleGroupChange = useCallback((group) => setValue(group), []);
61
61
  const handleChangeAudience = useCallback((event, data) => setAudience(data), []);
@@ -72,8 +72,20 @@ const AudienceLayer = React.forwardRef((props, ref) => {
72
72
  React.createElement(DialogContent, { className: classes.content },
73
73
  React.createElement(Tabs, { value: audience, onChange: handleChangeAudience, "aria-label": "audience type" },
74
74
  React.createElement(Tab, { value: AudienceTypes.AUDIENCE_ALL, icon: React.createElement(Icon, null, "public"), label: React.createElement(FormattedMessage, { id: "ui.composer.layer.audience.all", defaultMessage: "ui.composer.layer.audience.all" }) }),
75
- React.createElement(Tab, { disabled: defaultType === AudienceTypes.AUDIENCE_TAG, value: AudienceTypes.AUDIENCE_GROUP, icon: React.createElement(Icon, null, "groups"), label: React.createElement(FormattedMessage, { id: "ui.composer.layer.audience.group", defaultMessage: "ui.composer.layer.audience.group" }) }),
76
- React.createElement(Tab, { disabled: defaultType === AudienceTypes.AUDIENCE_GROUP, value: AudienceTypes.AUDIENCE_TAG, icon: React.createElement(Icon, null, "label"), label: React.createElement(FormattedMessage, { id: "ui.composer.layer.audience.tag", defaultMessage: "ui.composer.layer.audience.tag" }) })),
75
+ React.createElement(Tab
76
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
77
+ // @ts-ignore
78
+ , {
79
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
80
+ // @ts-ignore
81
+ disabled: defaultValue && typeof defaultValue !== 'object', value: AudienceTypes.AUDIENCE_GROUP, icon: React.createElement(Icon, null, "groups"), label: React.createElement(FormattedMessage, { id: "ui.composer.layer.audience.group", defaultMessage: "ui.composer.layer.audience.group" }) }),
82
+ React.createElement(Tab
83
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
84
+ // @ts-ignore
85
+ , {
86
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
87
+ // @ts-ignore
88
+ disabled: value && typeof defaultValue === 'object', value: AudienceTypes.AUDIENCE_TAG, icon: React.createElement(Icon, null, "label"), label: React.createElement(FormattedMessage, { id: "ui.composer.layer.audience.tag", defaultMessage: "ui.composer.layer.audience.tag" }) })),
77
89
  React.createElement(Typography, { className: classes.message },
78
90
  audience === AudienceTypes.AUDIENCE_ALL && (React.createElement(FormattedMessage, { id: "ui.composer.layer.audience.all.message", defaultMessage: "ui.composer.audience.layer.all.message" })),
79
91
  audience === AudienceTypes.AUDIENCE_GROUP && (React.createElement(FormattedMessage, { id: "ui.composer.layer.audience.group.message", defaultMessage: "ui.composer.audience.layer.group.message" })),
@@ -3,7 +3,7 @@ import React from 'react';
3
3
  import { useThemeProps } from '@mui/system';
4
4
  import { styled } from '@mui/material/styles';
5
5
  import { FormattedMessage } from 'react-intl';
6
- import { useSCFetchGroup } from '@selfcommunity/react-core';
6
+ import { useSCFetchGroup, useSCUser } from '@selfcommunity/react-core';
7
7
  import classNames from 'classnames';
8
8
  import CreateGroupButton from '../CreateGroupButton';
9
9
  const PREFIX = 'SCEditGroupButton';
@@ -42,10 +42,14 @@ export default function EditGroupButton(inProps) {
42
42
  });
43
43
  const { className, groupId, group, onEditSuccess } = props, rest = __rest(props, ["className", "groupId", "group", "onEditSuccess"]);
44
44
  const { scGroup, setSCGroup } = useSCFetchGroup({ id: groupId, group });
45
+ const scUserContext = useSCUser();
45
46
  const handleSuccess = (data) => {
46
47
  setSCGroup(data);
47
48
  onEditSuccess && onEditSuccess(data);
48
49
  };
50
+ if (!scUserContext.user) {
51
+ return null;
52
+ }
49
53
  /**
50
54
  * Renders root object
51
55
  */
@@ -188,6 +188,7 @@ export interface FeedObjectProps extends CardProps, VirtualScrollerItemProps {
188
188
  |deleted|.SCFeedObject-deleted|Styles applied to the feed obj when is deleted (visible only for admin and moderator).|
189
189
  |header|.SCFeedObject-header|Styles applied to the header of the card.|
190
190
  |category|.SCFeedObject-category|Styles applied to the category element.|
191
+ |group|.SCFeedObject-group|Styles applied to the group element.|
191
192
  |avatar|.SCFeedObject-avatar|Styles applied to the avatar element.|
192
193
  |username|.SCFeedObject-username|Styles applied to the username element.|
193
194
  |activityAt|.SCFeedObject-activity-at|Styles applied to the activity at section.|
@@ -2,7 +2,7 @@ import { __rest } from "tslib";
2
2
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
3
3
  import { styled } from '@mui/material/styles';
4
4
  import CardContent from '@mui/material/CardContent';
5
- import { Avatar, Box, Button, CardActions, CardHeader, Collapse, Stack, Tooltip, Typography } from '@mui/material';
5
+ import { Avatar, Box, Button, CardActions, CardHeader, Chip, Collapse, Stack, Tooltip, Typography } from '@mui/material';
6
6
  import FeedObjectSkeleton from './Skeleton';
7
7
  import DateTimeAgo from '../../shared/DateTimeAgo';
8
8
  import Bullet from '../../shared/Bullet';
@@ -40,6 +40,10 @@ const messages = defineMessages({
40
40
  visibleToAll: {
41
41
  id: 'ui.feedObject.visibleToAll',
42
42
  defaultMessage: 'ui.feedObject.visibleToAll'
43
+ },
44
+ visibleToGroup: {
45
+ id: 'ui.feedObject.visibleToGroup',
46
+ defaultMessage: 'ui.feedObject.visibleToGroup'
43
47
  }
44
48
  });
45
49
  const classes = {
@@ -47,6 +51,7 @@ const classes = {
47
51
  deleted: `${PREFIX}-deleted`,
48
52
  header: `${PREFIX}-header`,
49
53
  category: `${PREFIX}-category`,
54
+ group: `${PREFIX}-group`,
50
55
  avatar: `${PREFIX}-avatar`,
51
56
  username: `${PREFIX}-username`,
52
57
  activityAt: `${PREFIX}-activity-at`,
@@ -100,6 +105,7 @@ const Root = styled(Widget, {
100
105
  |deleted|.SCFeedObject-deleted|Styles applied to the feed obj when is deleted (visible only for admin and moderator).|
101
106
  |header|.SCFeedObject-header|Styles applied to the header of the card.|
102
107
  |category|.SCFeedObject-category|Styles applied to the category element.|
108
+ |group|.SCFeedObject-group|Styles applied to the group element.|
103
109
  |avatar|.SCFeedObject-avatar|Styles applied to the avatar element.|
104
110
  |username|.SCFeedObject-username|Styles applied to the username element.|
105
111
  |activityAt|.SCFeedObject-activity-at|Styles applied to the activity at section.|
@@ -167,7 +173,7 @@ export default function FeedObject(inProps) {
167
173
  }, [onStateChange, onHeightChange]);
168
174
  /**
169
175
  * Update state object
170
- * @param obj
176
+ * @param newObj
171
177
  */
172
178
  const updateObject = (newObj) => {
173
179
  setObj(newObj);
@@ -424,8 +430,13 @@ export default function FeedObject(inProps) {
424
430
  template === SCFeedObjectTemplateType.DETAIL ||
425
431
  template === SCFeedObjectTemplateType.SEARCH) {
426
432
  objElement = (React.createElement(React.Fragment, null, obj ? (React.createElement(Box, { className: classNames({ [classes.deleted]: obj && obj.deleted }) },
427
- obj.categories.length > 0 && (React.createElement("div", { className: classes.category }, obj.categories.map((c) => (React.createElement(Link, { to: scRoutingContext.url(SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
428
- React.createElement(Typography, { variant: "overline" }, c.name)))))),
433
+ obj.categories.length > 0 && (React.createElement("div", { className: classes.category },
434
+ React.createElement(React.Fragment, null, obj.group && (React.createElement("div", { className: classes.group },
435
+ React.createElement(Chip, { color: "secondary", size: "small", key: obj.group.id, icon: React.createElement(Icon, null, "groups"), component: Link, to: scRoutingContext.url(SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true })))),
436
+ obj.categories.map((c) => (React.createElement(Link, { to: scRoutingContext.url(SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
437
+ React.createElement(Typography, { variant: "overline" }, c.name)))))),
438
+ obj.group && !obj.categories.length && (React.createElement("div", { className: classes.group },
439
+ React.createElement(Chip, { color: "secondary", size: "small", key: obj.group.id, icon: React.createElement(Icon, null, "groups"), label: obj.group.name, component: Link, to: scRoutingContext.url(SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
429
440
  React.createElement(CardHeader, { className: classes.header, avatar: React.createElement(Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null }),
430
441
  React.createElement(UserAvatar, { hide: !obj.author.community_badge },
431
442
  React.createElement(Avatar, { "aria-label": "recipe", src: obj.author.avatar, className: classes.avatar }, obj.author.username))), title: React.createElement(Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }), obj.author.username), subheader: React.createElement(React.Fragment, null,
@@ -437,7 +448,8 @@ export default function FeedObject(inProps) {
437
448
  React.createElement(Icon, null, "add_location_alt"), (_a = obj.location) === null || _a === void 0 ? void 0 :
438
449
  _a.location))),
439
450
  React.createElement(Bullet, null),
440
- React.createElement(Box, { className: classes.tag }, obj.addressing.length > 0 ? (React.createElement(Tags, { tags: obj.addressing, TagChipProps: { disposable: false, clickable: false } })) : (React.createElement(Tooltip, { title: `${intl.formatMessage(messages.visibleToAll)}` },
451
+ React.createElement(Box, { className: classes.tag }, obj.addressing.length > 0 ? (React.createElement(Tags, { tags: obj.addressing, TagChipProps: { disposable: false, clickable: false } })) : obj.group ? (React.createElement(Tooltip, { title: `${intl.formatMessage(messages.visibleToGroup, { group: obj.group.name })}` },
452
+ React.createElement(Icon, { color: "disabled", fontSize: "small" }, "groups"))) : (React.createElement(Tooltip, { title: `${intl.formatMessage(messages.visibleToAll)}` },
441
453
  React.createElement(Icon, { color: "disabled", fontSize: "small" }, "public"))))), action: renderHeaderAction() }),
442
454
  React.createElement(CardContent, { classes: { root: classes.content } },
443
455
  React.createElement(Box, { className: classes.titleSection }, 'title' in obj && (React.createElement(React.Fragment, null, template === SCFeedObjectTemplateType.DETAIL ? (React.createElement(Typography, { variant: "body1", gutterBottom: true, className: classes.title }, obj.title)) : (React.createElement(Link, { to: scRoutingContext.url(getContributionRouteName(obj), getRouteData(obj)) },
@@ -466,8 +478,13 @@ export default function FeedObject(inProps) {
466
478
  }
467
479
  else if (template === SCFeedObjectTemplateType.SHARE) {
468
480
  objElement = (React.createElement(React.Fragment, null, obj ? (React.createElement(React.Fragment, null,
469
- obj.categories.length > 0 && (React.createElement("div", { className: classes.category }, obj.categories.map((c) => (React.createElement(Link, { to: scRoutingContext.url(SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
470
- React.createElement(Typography, { variant: "overline" }, c.name)))))),
481
+ obj.categories.length > 0 && (React.createElement("div", { className: classes.category },
482
+ React.createElement(React.Fragment, null, obj.group && (React.createElement("div", { className: classes.group },
483
+ React.createElement(Chip, { color: "secondary", size: "small", key: obj.group.id, icon: React.createElement(Icon, null, "groups"), component: Link, to: scRoutingContext.url(SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true })))),
484
+ obj.categories.map((c) => (React.createElement(Link, { to: scRoutingContext.url(SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
485
+ React.createElement(Typography, { variant: "overline" }, c.name)))))),
486
+ obj.group && !obj.categories.length && (React.createElement("div", { className: classes.group },
487
+ React.createElement(Chip, { color: "secondary", size: "small", key: obj.group.id, icon: React.createElement(Icon, null, "groups"), label: obj.group.name, component: Link, to: scRoutingContext.url(SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
471
488
  React.createElement(CardHeader, { classes: { root: classes.header }, avatar: React.createElement(Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }),
472
489
  React.createElement(UserAvatar, { hide: !obj.author.community_badge },
473
490
  React.createElement(Avatar, { "aria-label": "recipe", src: obj.author.avatar, className: classes.avatar }, obj.author.username))), title: React.createElement(Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }), obj.author.username), subheader: React.createElement(Link, { to: scRoutingContext.url(getContributionRouteName(obj), getRouteData(obj)), className: classes.activityAt },
@@ -55,7 +55,7 @@ export default function FeedUpdatesWidget(inProps) {
55
55
  const [updates, setUpdates] = useState(false);
56
56
  // REFS
57
57
  const updatesSubscription = useRef(null);
58
- // Subscripber for pubsub callback
58
+ // Subscriber for pubsub callback
59
59
  const subscriber = (msg, data) => {
60
60
  if (subscriptionChannelUpdatesCallback(msg, data)) {
61
61
  setUpdates(true);
@@ -1,8 +1,9 @@
1
1
  import { __rest } from "tslib";
2
- import React, { useState } from 'react';
2
+ import React, { useMemo, useState } from 'react';
3
3
  import { styled } from '@mui/material/styles';
4
4
  import { Avatar, Icon, Stack } from '@mui/material';
5
- import { Link, SCRoutes, useSCFetchGroup, useSCRouting } from '@selfcommunity/react-core';
5
+ import { SCGroupPrivacyType } from '@selfcommunity/types';
6
+ import { Link, SCRoutes, useSCFetchGroup, useSCRouting, useSCUser } from '@selfcommunity/react-core';
6
7
  import { defineMessages, useIntl } from 'react-intl';
7
8
  import classNames from 'classnames';
8
9
  import { useThemeProps } from '@mui/system';
@@ -56,16 +57,20 @@ const Root = styled(BaseItemButton, {
56
57
  * @param inProps
57
58
  */
58
59
  export default function Group(inProps) {
60
+ var _a;
59
61
  // PROPS
60
62
  const props = useThemeProps({
61
63
  props: inProps,
62
64
  name: PREFIX
63
65
  });
64
- const { groupId = null, group = null, className = null, elevation, hideActions = false, groupSubscribeButtonProps = {}, buttonProps = {}, visible = true } = props, rest = __rest(props, ["groupId", "group", "className", "elevation", "hideActions", "groupSubscribeButtonProps", "buttonProps", "visible"]);
66
+ const { groupId = null, group = null, className = null, elevation, hideActions = false, groupSubscribeButtonProps = {} } = props, rest = __rest(props, ["groupId", "group", "className", "elevation", "hideActions", "groupSubscribeButtonProps"]);
65
67
  // STATE
66
68
  const { scGroup } = useSCFetchGroup({ id: groupId, group });
67
69
  // CONTEXT
68
70
  const scRoutingContext = useSCRouting();
71
+ const scUserContext = useSCUser();
72
+ // CONST
73
+ const isGroupAdmin = 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]);
69
74
  const [openAlert, setOpenAlert] = useState(false);
70
75
  // INTL
71
76
  const intl = useIntl();
@@ -75,7 +80,8 @@ export default function Group(inProps) {
75
80
  */
76
81
  function renderAuthenticatedActions() {
77
82
  return (React.createElement(Stack, { className: classes.actions, direction: "row", alignItems: "center", justifyContent: "center", spacing: 2 },
78
- React.createElement(Icon, null, !visible ? 'private' : 'public'),
83
+ React.createElement(Icon, null, (group === null || group === void 0 ? void 0 : group.privacy) === SCGroupPrivacyType.PRIVATE ? 'private' : 'public'),
84
+ isGroupAdmin && React.createElement(Icon, null, "face"),
79
85
  React.createElement(GroupSubscribeButton, Object.assign({ group: group, groupId: groupId }, groupSubscribeButtonProps))));
80
86
  }
81
87
  /**
@@ -88,6 +94,6 @@ export default function Group(inProps) {
88
94
  * Renders root object
89
95
  */
90
96
  return (React.createElement(React.Fragment, null,
91
- React.createElement(Root, Object.assign({ elevation: elevation }, rest, { className: classNames(classes.root, className), ButtonBaseProps: buttonProps !== null && buttonProps !== void 0 ? buttonProps : { component: Link, to: scRoutingContext.url(SCRoutes.GROUP_ROUTE_NAME, scGroup) }, image: React.createElement(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() })),
97
+ React.createElement(Root, Object.assign({ elevation: elevation }, rest, { className: classNames(classes.root, className), ButtonBaseProps: { component: Link, to: scRoutingContext.url(SCRoutes.GROUP_ROUTE_NAME, scGroup) }, image: React.createElement(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() })),
92
98
  openAlert && React.createElement(UserDeletedSnackBar, { open: openAlert, handleClose: () => setOpenAlert(false) })));
93
99
  }
@@ -13,10 +13,12 @@ import ChangeGroupPicture from '../ChangeGroupPicture';
13
13
  import ChangeGroupCover from '../ChangeGroupCover';
14
14
  import { GROUP_DESCRIPTION_MAX_LENGTH, GROUP_TITLE_MAX_LENGTH } from '../../constants/Group';
15
15
  import GroupInviteButton from '../GroupInviteButton';
16
+ import PubSub from 'pubsub-js';
16
17
  import { SCGroupPrivacyType } from '@selfcommunity/types';
17
18
  import { SCOPE_SC_UI } from '../../constants/Errors';
18
19
  import { formatHttpErrorCode, GroupService } from '@selfcommunity/api-services';
19
20
  import { Logger } from '@selfcommunity/utils';
21
+ import { SCEventType, SCTopicType } from '../../constants/PubSub';
20
22
  const messages = defineMessages({
21
23
  name: {
22
24
  id: 'ui.groupForm.name.placeholder',
@@ -140,6 +142,22 @@ export default function GroupForm(inProps) {
140
142
  setError(error);
141
143
  }
142
144
  }
145
+ /**
146
+ * Notify when a group info changed
147
+ * @param data
148
+ */
149
+ function notifyChanges(data) {
150
+ if (data) {
151
+ if (group) {
152
+ // Edit group
153
+ PubSub.publish(`${SCTopicType.GROUP}.${SCEventType.EDIT}`, data);
154
+ }
155
+ else {
156
+ // Create group
157
+ PubSub.publish(`${SCTopicType.GROUP}.${SCEventType.CREATE}`, data);
158
+ }
159
+ }
160
+ }
143
161
  const handleSubmit = () => {
144
162
  setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: true })));
145
163
  const formData = new FormData();
@@ -153,8 +171,10 @@ export default function GroupForm(inProps) {
153
171
  if (field.emotionalImageOriginalFile) {
154
172
  formData.append('emotional_image_original', field.emotionalImageOriginalFile);
155
173
  }
156
- for (const key in field.invitedUsers) {
157
- formData.append(key, field.invitedUsers[key]);
174
+ if (!group) {
175
+ for (const key in field.invitedUsers) {
176
+ formData.append(key, field.invitedUsers[key]);
177
+ }
158
178
  }
159
179
  let groupService;
160
180
  if (group) {
@@ -166,6 +186,7 @@ export default function GroupForm(inProps) {
166
186
  groupService
167
187
  .then((data) => {
168
188
  onSuccess && onSuccess(data);
189
+ notifyChanges(data);
169
190
  onClose && onClose();
170
191
  setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: false })));
171
192
  })
@@ -213,24 +234,25 @@ export default function GroupForm(inProps) {
213
234
  React.createElement(Typography, { className: classNames(classes.switchLabel, { [classes.active]: !field.isPublic }) },
214
235
  React.createElement(Icon, null, "private"),
215
236
  React.createElement(FormattedMessage, { id: "ui.groupForm.privacy.private", defaultMessage: "ui.groupForm.privacy.private" })),
216
- React.createElement(Switch, { className: classes.switch, checked: field.isPublic, onClick: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['isPublic']: !field.isPublic }))) }),
237
+ React.createElement(Switch, { className: classes.switch, checked: field.isPublic, onChange: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['isPublic']: !field.isPublic }))), disabled: group && group.privacy === SCGroupPrivacyType.PRIVATE }),
217
238
  React.createElement(Typography, { className: classNames(classes.switchLabel, { [classes.active]: field.isPublic }) },
218
239
  React.createElement(Icon, null, "public"),
219
240
  React.createElement(FormattedMessage, { id: "ui.groupForm.privacy.public", defaultMessage: "ui.groupForm.privacy.public" }))),
220
- React.createElement(Typography, { variant: "body2", className: classes.privacySectionInfo }, field.isPublic ? (React.createElement(FormattedMessage, { id: "ui.groupForm.privacy.public.info", defaultMessage: "ui.groupForm.privacy.public.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } })) : (React.createElement(FormattedMessage, { id: "ui.groupForm.privacy.private.info", defaultMessage: "ui.groupForm.private.public.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } })))),
221
- React.createElement(Box, { className: classes.visibilitySection }, !field.isPublic && (React.createElement(React.Fragment, null,
241
+ React.createElement(Typography, { variant: "body2", className: classes.privacySectionInfo }, field.isPublic ? (React.createElement(FormattedMessage, { id: "ui.groupForm.privacy.public.info", defaultMessage: "ui.groupForm.privacy.public.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } })) : (React.createElement(React.Fragment, null, group && group.privacy === SCGroupPrivacyType.PRIVATE ? (React.createElement(FormattedMessage, { id: "ui.groupForm.privacy.private.info.edit", defaultMessage: "ui.groupForm.private.public.info.edit", values: { b: (chunks) => React.createElement("strong", null, chunks) } })) : (React.createElement(FormattedMessage, { id: "ui.groupForm.privacy.private.info", defaultMessage: "ui.groupForm.private.public.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } })))))),
242
+ React.createElement(Box, { className: classes.visibilitySection }, ((!field.isPublic && !group) || (group && !field.isPublic)) && (React.createElement(React.Fragment, null,
222
243
  React.createElement(Typography, { variant: "h4" },
223
244
  React.createElement(FormattedMessage, { id: "ui.groupForm.visibility.title", defaultMessage: "ui.groupForm.visibility.title", values: { b: (chunks) => React.createElement("strong", null, chunks) } })),
224
245
  React.createElement(Stack, { direction: "row", spacing: 1, alignItems: "center" },
225
246
  React.createElement(Typography, { className: classNames(classes.switchLabel, { [classes.active]: !field.isVisible }) },
226
247
  React.createElement(Icon, null, "visibility_off"),
227
248
  React.createElement(FormattedMessage, { id: "ui.groupForm.visibility.hidden", defaultMessage: "ui.groupForm.visibility.hidden" })),
228
- React.createElement(Switch, { className: classes.switch, checked: field.isVisible, onClick: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['isVisible']: !field.isVisible }))) }),
249
+ React.createElement(Switch, { className: classes.switch, checked: field.isVisible, onChange: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['isVisible']: !field.isVisible }))) }),
229
250
  React.createElement(Typography, { className: classNames(classes.switchLabel, { [classes.active]: field.isVisible }) },
230
251
  React.createElement(Icon, null, "visibility"),
231
252
  React.createElement(FormattedMessage, { id: "ui.groupForm.visibility.visible", defaultMessage: "ui.groupForm.visibility.visible" }))),
232
253
  React.createElement(Typography, { variant: "body2", className: classes.visibilitySectionInfo }, !field.isVisible ? (React.createElement(FormattedMessage, { id: "ui.groupForm.visibility.hidden.info", defaultMessage: "ui.groupForm.visibility.hidden.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } })) : (React.createElement(FormattedMessage, { id: "ui.groupForm.visibility.visible.info", defaultMessage: "ui.groupForm.visibility.visible.info", values: { b: (chunks) => React.createElement("strong", null, chunks) } }))))))),
233
- React.createElement(Divider, null),
234
- React.createElement(Box, { className: classes.inviteSection },
235
- React.createElement(GroupInviteButton, { handleInvitations: handleInviteSection })))));
254
+ !group && (React.createElement(React.Fragment, null,
255
+ React.createElement(Divider, null),
256
+ React.createElement(Box, { className: classes.inviteSection },
257
+ React.createElement(GroupInviteButton, { handleInvitations: handleInviteSection })))))));
236
258
  }
@@ -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
  */