@selfcommunity/react-ui 0.7.9-alpha.15 → 0.7.9-alpha.17

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 (32) hide show
  1. package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +13 -10
  2. package/lib/cjs/components/Composer/Composer.js +1 -1
  3. package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +4 -4
  4. package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
  5. package/lib/cjs/components/FeedObject/FeedObject.js +17 -5
  6. package/lib/cjs/components/Group/Group.js +3 -2
  7. package/lib/cjs/components/GroupForm/GroupForm.js +3 -3
  8. package/lib/cjs/components/GroupHeader/GroupHeader.js +2 -2
  9. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  10. package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +10 -7
  11. package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  12. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  13. package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +19 -5
  14. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  15. package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +33 -16
  16. package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +13 -10
  17. package/lib/esm/components/Composer/Composer.js +1 -1
  18. package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +4 -4
  19. package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
  20. package/lib/esm/components/FeedObject/FeedObject.js +18 -6
  21. package/lib/esm/components/Group/Group.js +3 -2
  22. package/lib/esm/components/GroupForm/GroupForm.js +3 -3
  23. package/lib/esm/components/GroupHeader/GroupHeader.js +2 -2
  24. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
  25. package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +11 -8
  26. package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
  27. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
  28. package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +21 -7
  29. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
  30. package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +34 -17
  31. package/lib/umd/react-ui.js +1 -1
  32. package/package.json +6 -6
@@ -59,12 +59,12 @@ function ChangeGroupPicture(inProps) {
59
59
  name: constants_1.PREFIX
60
60
  });
61
61
  const { groupId, onChange, autoHide, className, isCreationMode = false } = props, rest = tslib_1.__rest(props, ["groupId", "onChange", "autoHide", "className", "isCreationMode"]);
62
+ //CONTEXT
63
+ const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
62
64
  //STATE
65
+ let fileInput = (0, react_1.useRef)(null);
63
66
  const [loading, setLoading] = (0, react_1.useState)(false);
64
67
  const [alert, setAlert] = (0, react_1.useState)(null);
65
- let fileInput = (0, react_1.useRef)(null);
66
- //CONTEXT
67
- const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
68
68
  // INTL
69
69
  const intl = (0, react_intl_1.useIntl)();
70
70
  // Anonymous
@@ -75,8 +75,8 @@ function ChangeGroupPicture(inProps) {
75
75
  * Handles avatar upload
76
76
  * @param event
77
77
  */
78
- function handleUpload(event) {
79
- const fileInput = event.target.files[0];
78
+ const handleUpload = (event) => {
79
+ fileInput = event.target.files[0];
80
80
  if (fileInput) {
81
81
  const reader = new FileReader();
82
82
  reader.onload = (e) => {
@@ -93,26 +93,29 @@ function ChangeGroupPicture(inProps) {
93
93
  // @ts-ignore
94
94
  img.src = e.target.result;
95
95
  };
96
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
97
+ // @ts-ignore
96
98
  reader.readAsDataURL(fileInput);
97
99
  }
98
- }
99
- // ui.changeGroupPicture.alert
100
+ };
100
101
  /**
101
102
  * Performs save avatar after upload
102
103
  */
103
104
  function handleSave() {
104
105
  setLoading(true);
105
106
  const formData = new FormData();
107
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
108
+ // @ts-ignore
106
109
  formData.append('image_original', fileInput);
107
110
  api_services_1.GroupService.changeGroupAvatarOrCover(groupId, formData, { headers: { 'Content-Type': 'multipart/form-data' } })
108
111
  .then((data) => {
112
+ onChange && onChange(data.image_big);
109
113
  setLoading(false);
110
- onChange && onChange(data.image_bigger);
111
114
  })
112
115
  .catch((error) => {
113
- setAlert(intl.formatMessage(messages.errorLoadImage));
114
- setLoading(false);
115
116
  utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
117
+ setLoading(false);
118
+ setAlert(intl.formatMessage(messages.errorLoadImage));
116
119
  });
117
120
  }
118
121
  /**
@@ -553,7 +553,7 @@ function Composer(inProps) {
553
553
  }),
554
554
  react_1.default.createElement(material_1.IconButton, { disabled: isSubmitting, onClick: handleAddCategoryLayer },
555
555
  react_1.default.createElement(Icon_1.default, null, "category")),
556
- react_1.default.createElement(material_1.IconButton, { disabled: isSubmitting || !features.includes(types_1.SCFeatureName.TAGGING), onClick: handleAddAudienceLayer }, addressing === null || addressing.length === 0 ? (react_1.default.createElement(Icon_1.default, null, "public")) : typeof addressing === 'object' ? (react_1.default.createElement(Icon_1.default, null, "groups")) : (react_1.default.createElement(Icon_1.default, null, "label"))),
556
+ react_1.default.createElement(material_1.IconButton, { disabled: isSubmitting || !features.includes(types_1.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_1.default.createElement(Icon_1.default, null, "public") : group ? react_1.default.createElement(Icon_1.default, null, "groups") : react_1.default.createElement(Icon_1.default, null, "label")),
557
557
  preferences[react_core_1.SCPreferences.ADDONS_POST_GEOLOCATION_ENABLED].value && (react_1.default.createElement(material_1.IconButton, { disabled: isSubmitting, onClick: handleAddLocationLayer, color: location !== null ? 'primary' : 'default' },
558
558
  react_1.default.createElement(Icon_1.default, null, "add_location_alt"))))),
559
559
  layer && (react_1.default.createElement(LayerTransitionRoot, { className: classes.layerTransitionRoot, in: true, container: dialogRef.current, direction: "left" },
@@ -46,7 +46,7 @@ const AudienceLayer = react_1.default.forwardRef((props, ref) => {
46
46
  // @ts-ignore
47
47
  defaultValue === null || defaultValue.length === 0
48
48
  ? AudienceTypes.AUDIENCE_ALL
49
- : typeof defaultValue === 'object'
49
+ : defaultValue && typeof defaultValue === 'object'
50
50
  ? AudienceTypes.AUDIENCE_GROUP
51
51
  : AudienceTypes.AUDIENCE_TAG);
52
52
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -58,7 +58,7 @@ const AudienceLayer = react_1.default.forwardRef((props, ref) => {
58
58
  const handleSave = (0, react_1.useCallback)(
59
59
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
60
60
  // @ts-ignore
61
- () => (typeof defaultValue === 'object' ? 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]);
61
+ () => (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]);
62
62
  const handleChange = (0, react_1.useCallback)((event, tags) => setValue(tags), []);
63
63
  const handleGroupChange = (0, react_1.useCallback)((group) => setValue(group), []);
64
64
  const handleChangeAudience = (0, react_1.useCallback)((event, data) => setAudience(data), []);
@@ -81,14 +81,14 @@ const AudienceLayer = react_1.default.forwardRef((props, ref) => {
81
81
  , {
82
82
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
83
83
  // @ts-ignore
84
- disabled: defaultValue && defaultValue.length !== 0, value: AudienceTypes.AUDIENCE_GROUP, icon: react_1.default.createElement(Icon_1.default, null, "groups"), label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.composer.layer.audience.group", defaultMessage: "ui.composer.layer.audience.group" }) }),
84
+ disabled: defaultValue && typeof defaultValue !== 'object', value: AudienceTypes.AUDIENCE_GROUP, icon: react_1.default.createElement(Icon_1.default, null, "groups"), label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.composer.layer.audience.group", defaultMessage: "ui.composer.layer.audience.group" }) }),
85
85
  react_1.default.createElement(material_1.Tab
86
86
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
87
87
  // @ts-ignore
88
88
  , {
89
89
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
90
90
  // @ts-ignore
91
- disabled: typeof defaultValue === 'object', value: AudienceTypes.AUDIENCE_TAG, icon: react_1.default.createElement(Icon_1.default, null, "label"), label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.composer.layer.audience.tag", defaultMessage: "ui.composer.layer.audience.tag" }) })),
91
+ disabled: value && typeof defaultValue === 'object', value: AudienceTypes.AUDIENCE_TAG, icon: react_1.default.createElement(Icon_1.default, null, "label"), label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.composer.layer.audience.tag", defaultMessage: "ui.composer.layer.audience.tag" }) })),
92
92
  react_1.default.createElement(material_1.Typography, { className: classes.message },
93
93
  audience === AudienceTypes.AUDIENCE_ALL && (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.composer.layer.audience.all.message", defaultMessage: "ui.composer.audience.layer.all.message" })),
94
94
  audience === AudienceTypes.AUDIENCE_GROUP && (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.composer.layer.audience.group.message", defaultMessage: "ui.composer.audience.layer.group.message" })),
@@ -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.|
@@ -49,6 +49,7 @@ const classes = {
49
49
  deleted: `${constants_1.PREFIX}-deleted`,
50
50
  header: `${constants_1.PREFIX}-header`,
51
51
  category: `${constants_1.PREFIX}-category`,
52
+ group: `${constants_1.PREFIX}-group`,
52
53
  avatar: `${constants_1.PREFIX}-avatar`,
53
54
  username: `${constants_1.PREFIX}-username`,
54
55
  activityAt: `${constants_1.PREFIX}-activity-at`,
@@ -102,6 +103,7 @@ const Root = (0, styles_1.styled)(Widget_1.default, {
102
103
  |deleted|.SCFeedObject-deleted|Styles applied to the feed obj when is deleted (visible only for admin and moderator).|
103
104
  |header|.SCFeedObject-header|Styles applied to the header of the card.|
104
105
  |category|.SCFeedObject-category|Styles applied to the category element.|
106
+ |group|.SCFeedObject-group|Styles applied to the group element.|
105
107
  |avatar|.SCFeedObject-avatar|Styles applied to the avatar element.|
106
108
  |username|.SCFeedObject-username|Styles applied to the username element.|
107
109
  |activityAt|.SCFeedObject-activity-at|Styles applied to the activity at section.|
@@ -169,7 +171,7 @@ function FeedObject(inProps) {
169
171
  }, [onStateChange, onHeightChange]);
170
172
  /**
171
173
  * Update state object
172
- * @param obj
174
+ * @param newObj
173
175
  */
174
176
  const updateObject = (newObj) => {
175
177
  setObj(newObj);
@@ -426,8 +428,13 @@ function FeedObject(inProps) {
426
428
  template === feedObject_1.SCFeedObjectTemplateType.DETAIL ||
427
429
  template === feedObject_1.SCFeedObjectTemplateType.SEARCH) {
428
430
  objElement = (react_1.default.createElement(react_1.default.Fragment, null, obj ? (react_1.default.createElement(material_1.Box, { className: (0, classnames_1.default)({ [classes.deleted]: obj && obj.deleted }) },
429
- obj.categories.length > 0 && (react_1.default.createElement("div", { className: classes.category }, obj.categories.map((c) => (react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
430
- react_1.default.createElement(material_1.Typography, { variant: "overline" }, c.name)))))),
431
+ obj.categories.length > 0 && (react_1.default.createElement("div", { className: classes.category },
432
+ react_1.default.createElement(react_1.default.Fragment, null, obj.group && (react_1.default.createElement("div", { className: classes.group },
433
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true })))),
434
+ obj.categories.map((c) => (react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
435
+ react_1.default.createElement(material_1.Typography, { variant: "overline" }, c.name)))))),
436
+ obj.group && !obj.categories.length && (react_1.default.createElement("div", { className: classes.group },
437
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), label: obj.group.name, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
431
438
  react_1.default.createElement(material_1.CardHeader, { className: classes.header, avatar: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null }),
432
439
  react_1.default.createElement(UserAvatar_1.default, { hide: !obj.author.community_badge },
433
440
  react_1.default.createElement(material_1.Avatar, { "aria-label": "recipe", src: obj.author.avatar, className: classes.avatar }, obj.author.username))), title: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }), obj.author.username), subheader: react_1.default.createElement(react_1.default.Fragment, null,
@@ -468,8 +475,13 @@ function FeedObject(inProps) {
468
475
  }
469
476
  else if (template === feedObject_1.SCFeedObjectTemplateType.SHARE) {
470
477
  objElement = (react_1.default.createElement(react_1.default.Fragment, null, obj ? (react_1.default.createElement(react_1.default.Fragment, null,
471
- obj.categories.length > 0 && (react_1.default.createElement("div", { className: classes.category }, obj.categories.map((c) => (react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
472
- react_1.default.createElement(material_1.Typography, { variant: "overline" }, c.name)))))),
478
+ obj.categories.length > 0 && (react_1.default.createElement("div", { className: classes.category },
479
+ react_1.default.createElement(react_1.default.Fragment, null, obj.group && (react_1.default.createElement("div", { className: classes.group },
480
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true })))),
481
+ obj.categories.map((c) => (react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
482
+ react_1.default.createElement(material_1.Typography, { variant: "overline" }, c.name)))))),
483
+ obj.group && !obj.categories.length && (react_1.default.createElement("div", { className: classes.group },
484
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), label: obj.group.name, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
473
485
  react_1.default.createElement(material_1.CardHeader, { classes: { root: classes.header }, avatar: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }),
474
486
  react_1.default.createElement(UserAvatar_1.default, { hide: !obj.author.community_badge },
475
487
  react_1.default.createElement(material_1.Avatar, { "aria-label": "recipe", src: obj.author.avatar, className: classes.avatar }, obj.author.username))), title: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }), obj.author.username), subheader: react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url((0, contribution_1.getContributionRouteName)(obj), (0, contribution_1.getRouteData)(obj)), className: classes.activityAt },
@@ -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"));
@@ -63,7 +64,7 @@ function Group(inProps) {
63
64
  props: inProps,
64
65
  name: constants_1.PREFIX
65
66
  });
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"]);
67
+ const { groupId = null, group = null, className = null, elevation, hideActions = false, groupSubscribeButtonProps = {} } = props, rest = tslib_1.__rest(props, ["groupId", "group", "className", "elevation", "hideActions", "groupSubscribeButtonProps"]);
67
68
  // STATE
68
69
  const { scGroup } = (0, react_core_1.useSCFetchGroup)({ id: groupId, group });
69
70
  // CONTEXT
@@ -77,7 +78,7 @@ function Group(inProps) {
77
78
  */
78
79
  function renderAuthenticatedActions() {
79
80
  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(material_1.Icon, null, (group === null || group === void 0 ? void 0 : group.privacy) === types_1.SCGroupPrivacyType.PRIVATE ? 'private' : 'public'),
81
82
  react_1.default.createElement(GroupSubscribeButton_1.default, Object.assign({ group: group, groupId: groupId }, groupSubscribeButtonProps))));
82
83
  }
83
84
  /**
@@ -208,7 +208,7 @@ function GroupForm(inProps) {
208
208
  react_1.default.createElement(material_1.TextField, { multiline: true, className: classes.description, placeholder: `${intl.formatMessage(messages.description)}`, margin: "normal", value: field.description, name: "description", onChange: handleChange, InputProps: {
209
209
  endAdornment: react_1.default.createElement(material_1.Typography, { variant: "body2" }, Group_1.GROUP_DESCRIPTION_MAX_LENGTH - field.description.length)
210
210
  } }),
211
- react_1.default.createElement(material_1.Box, { className: classes.privacySection },
211
+ (!group || (group && group.privacy !== types_1.SCGroupPrivacyType.PRIVATE)) && (react_1.default.createElement(material_1.Box, { className: classes.privacySection },
212
212
  react_1.default.createElement(material_1.Typography, { variant: "h4" },
213
213
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.title", defaultMessage: "ui.groupForm.privacy.title", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })),
214
214
  react_1.default.createElement(material_1.Stack, { direction: "row", spacing: 1, alignItems: "center" },
@@ -219,8 +219,8 @@ function GroupForm(inProps) {
219
219
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: field.isPublic }) },
220
220
  react_1.default.createElement(material_1.Icon, null, "public"),
221
221
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.public", defaultMessage: "ui.groupForm.privacy.public" }))),
222
- react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.privacySectionInfo }, field.isPublic ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.public.info", defaultMessage: "ui.groupForm.privacy.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private.info", defaultMessage: "ui.groupForm.private.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })))),
223
- react_1.default.createElement(material_1.Box, { className: classes.visibilitySection }, !field.isPublic && (react_1.default.createElement(react_1.default.Fragment, null,
222
+ react_1.default.createElement(material_1.Typography, { variant: "body2", className: classes.privacySectionInfo }, field.isPublic ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.public.info", defaultMessage: "ui.groupForm.privacy.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.privacy.private.info", defaultMessage: "ui.groupForm.private.public.info", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } }))))),
223
+ react_1.default.createElement(material_1.Box, { className: classes.visibilitySection }, ((!field.isPublic && !group) || (group && !field.isPublic)) && (react_1.default.createElement(react_1.default.Fragment, null,
224
224
  react_1.default.createElement(material_1.Typography, { variant: "h4" },
225
225
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupForm.visibility.title", defaultMessage: "ui.groupForm.visibility.title", values: { b: (chunks) => react_1.default.createElement("strong", null, chunks) } })),
226
226
  react_1.default.createElement(material_1.Stack, { direction: "row", spacing: 1, alignItems: "center" },
@@ -89,7 +89,7 @@ function GroupHeader(inProps) {
89
89
  */
90
90
  function handleChangeAvatar(avatar) {
91
91
  if (isGroupAdmin) {
92
- setSCGroup(Object.assign({}, scGroup, { image_bigger: avatar }));
92
+ setSCGroup(Object.assign({}, scGroup, { image_big: avatar }));
93
93
  }
94
94
  }
95
95
  /**
@@ -118,7 +118,7 @@ function GroupHeader(inProps) {
118
118
  react_1.default.createElement(material_1.Paper, { style: _backgroundCover, classes: { root: classes.cover } },
119
119
  react_1.default.createElement(material_1.Box, { className: classes.avatar },
120
120
  react_1.default.createElement(material_1.Avatar, null,
121
- react_1.default.createElement("img", { alt: "group", src: scGroup.image_bigger ? scGroup.image_bigger : '' }))),
121
+ react_1.default.createElement("img", { alt: "group", src: scGroup.image_big ? scGroup.image_big : '' }))),
122
122
  isGroupAdmin && (react_1.default.createElement(react_1.default.Fragment, null,
123
123
  react_1.default.createElement(ChangeGroupPicture_1.default, Object.assign({ groupId: scGroup.id, onChange: handleChangeAvatar, className: classes.changePicture }, ChangePictureProps)),
124
124
  react_1.default.createElement("div", { className: classes.changeCover },
@@ -8,7 +8,7 @@ export interface PrivateMessageComponentProps {
8
8
  * Handler on message click
9
9
  * @default null
10
10
  */
11
- onItemClick?: (id: any) => void;
11
+ onItemClick?: (id: any, type: any) => void;
12
12
  /**
13
13
  * Handler on single message open
14
14
  * @default null
@@ -67,6 +67,7 @@ function PrivateMessageComponent(inProps) {
67
67
  const isMobile = (0, material_1.useMediaQuery)(theme.breakpoints.down('md'));
68
68
  const [layout, setLayout] = (0, react_1.useState)('default');
69
69
  const [obj, setObj] = (0, react_1.useState)(id !== null && id !== void 0 ? id : null);
70
+ const [type, setType] = (0, react_1.useState)(null);
70
71
  const isNew = obj && obj === types_1.SCPrivateMessageStatusType.NEW;
71
72
  const [openNewMessage, setOpenNewMessage] = (0, react_1.useState)(isNew !== null && isNew !== void 0 ? isNew : false);
72
73
  const mobileSnippetsView = (layout === 'default' && !obj) || (layout === 'mobile' && !obj);
@@ -88,10 +89,12 @@ function PrivateMessageComponent(inProps) {
88
89
  /**
89
90
  * Handles thread opening on click
90
91
  * @param item
92
+ * @param type
91
93
  */
92
- const handleThreadOpening = (item) => {
93
- onItemClick && onItemClick(messageReceiver(item, authUserId));
94
- setObj(messageReceiver(item, authUserId));
94
+ const handleThreadOpening = (item, type) => {
95
+ onItemClick && onItemClick(item.group ? item.group.id : messageReceiver(item, authUserId), type);
96
+ setType(type);
97
+ setObj(item.group ? item : messageReceiver(item, authUserId));
95
98
  setOpenNewMessage(false);
96
99
  };
97
100
  /**
@@ -107,7 +110,7 @@ function PrivateMessageComponent(inProps) {
107
110
  const handleOpenNewMessage = () => {
108
111
  setOpenNewMessage(!openNewMessage);
109
112
  setObj(types_1.SCPrivateMessageStatusType.NEW);
110
- onItemClick && onItemClick(types_1.SCPrivateMessageStatusType.NEW);
113
+ onItemClick && onItemClick(types_1.SCPrivateMessageStatusType.NEW, types_1.SCPrivateMessageType.NEW);
111
114
  };
112
115
  /**
113
116
  * Handles new messages open from user profile page or notifications section
@@ -129,7 +132,7 @@ function PrivateMessageComponent(inProps) {
129
132
  * Handles state update when a new message is sent
130
133
  */
131
134
  const handleOnNewMessageSent = (msg, isOne) => {
132
- onItemClick && onItemClick(isOne ? messageReceiver(msg, authUserId) : '');
135
+ onItemClick && onItemClick(isOne ? messageReceiver(msg, authUserId) : '', msg.group ? types_1.SCPrivateMessageType.GROUP : types_1.SCPrivateMessageType.USER);
133
136
  setObj(isOne ? messageReceiver(msg, authUserId) : null);
134
137
  setOpenNewMessage(false);
135
138
  };
@@ -149,14 +152,14 @@ function PrivateMessageComponent(inProps) {
149
152
  onSnippetClick: handleThreadOpening,
150
153
  onNewMessageClick: handleOpenNewMessage,
151
154
  onDeleteConfirm: handleDeleteThread
152
- }, userObj: obj, clearSearch: clear, elevation: 0 })));
155
+ }, threadObj: obj, clearSearch: clear, elevation: 0 })));
153
156
  }
154
157
  /**
155
158
  * Renders thread section
156
159
  */
157
160
  function renderThread() {
158
161
  return (react_1.default.createElement(material_1.Grid, { item: true, xs: 12, md: 7, className: (0, classnames_1.default)(classes.threadBox, { [classes.hide]: isMobile && mobileSnippetsView }) },
159
- react_1.default.createElement(PrivateMessageThread_1.default, { userObj: obj, openNewMessage: openNewMessage, onNewMessageClose: handleMessageBack, onNewMessageSent: handleOnNewMessageSent, onSingleMessageOpen: handleSingleMessage, elevation: 0 })));
162
+ react_1.default.createElement(PrivateMessageThread_1.default, { threadObj: obj, type: type, openNewMessage: openNewMessage, onNewMessageClose: handleMessageBack, onNewMessageSent: handleOnNewMessageSent, onSingleMessageOpen: handleSingleMessage, elevation: 0 })));
160
163
  }
161
164
  /**
162
165
  * Renders the component (if not hidden by autoHide prop)
@@ -74,10 +74,12 @@ function PrivateMessageSnippetItem(inProps) {
74
74
  // STATE
75
75
  const hasBadge = () => {
76
76
  var _a;
77
- if ((message === null || message === void 0 ? void 0 : message.receiver.id) !== ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id)) {
78
- return message === null || message === void 0 ? void 0 : message.receiver.community_badge;
77
+ if (message.receiver) {
78
+ if ((message === null || message === void 0 ? void 0 : message.receiver.id) !== ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id)) {
79
+ return message === null || message === void 0 ? void 0 : message.receiver.community_badge;
80
+ }
81
+ return message === null || message === void 0 ? void 0 : message.sender.community_badge;
79
82
  }
80
- return message === null || message === void 0 ? void 0 : message.sender.community_badge;
81
83
  };
82
84
  if (!message) {
83
85
  return react_1.default.createElement(Skeleton_1.default, { elevation: 0 });
@@ -88,10 +90,13 @@ function PrivateMessageSnippetItem(inProps) {
88
90
  return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, rest, { secondaryAction: secondaryAction, disablePadding: true }),
89
91
  react_1.default.createElement(material_1.ListItemButton, { onClick: onItemClick, classes: { root: (0, classnames_1.default)({ [classes.unread]: message.thread_status === types_1.SCPrivateMessageStatusType.NEW }) } },
90
92
  react_1.default.createElement(material_1.ListItemAvatar, null,
91
- react_1.default.createElement(UserAvatar_1.default, { hide: !hasBadge() },
92
- react_1.default.createElement(material_1.Avatar, { alt: ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) === message.receiver.username ? message.sender.username : message.receiver.username, src: ((_b = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _b === void 0 ? void 0 : _b.username) === message.receiver.username ? message.sender.avatar : message.receiver.avatar }))),
93
+ react_1.default.createElement(UserAvatar_1.default, { hide: !hasBadge() }, message.group ? (react_1.default.createElement(material_1.Avatar, { alt: message.group.name, src: message.group.image_big })) : (react_1.default.createElement(material_1.Avatar, { alt: ((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.username) === message.receiver.username ? message.sender.username : message.receiver.username, src: ((_b = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _b === void 0 ? void 0 : _b.username) === message.receiver.username ? message.sender.avatar : message.receiver.avatar })))),
93
94
  react_1.default.createElement(material_1.ListItemText, { primary: react_1.default.createElement(react_1.default.Fragment, null,
94
- react_1.default.createElement(material_1.Typography, { component: "span", className: classes.username }, ((_c = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _c === void 0 ? void 0 : _c.username) === message.receiver.username ? message.sender.username : message.receiver.username),
95
+ react_1.default.createElement(material_1.Typography, { component: "span", className: classes.username }, message.group
96
+ ? message.group.name
97
+ : ((_c = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _c === void 0 ? void 0 : _c.username) === message.receiver.username
98
+ ? message.sender.username
99
+ : message.receiver.username),
95
100
  hasBadge() && preferences && (react_1.default.createElement(material_1.Chip, { component: "span", className: classes.badgeLabel, size: "small", label: preferences[react_core_1.SCPreferences.STAFF_STAFF_BADGE_LABEL] })),
96
101
  react_1.default.createElement(material_1.Typography, { color: "secondary", className: classes.time, component: "span" }, `${intl.formatDate(message.last_message_at, {
97
102
  day: '2-digit',
@@ -20,7 +20,7 @@ export interface PrivateMessageSnippetsProps extends CardProps {
20
20
  *
21
21
  */
22
22
  snippetActions?: {
23
- onSnippetClick?: (msg: any) => void;
23
+ onSnippetClick?: (msg: any, type: any) => void;
24
24
  onNewMessageClick?: () => void;
25
25
  onDeleteConfirm?: (msg: any) => void;
26
26
  };
@@ -29,10 +29,10 @@ export interface PrivateMessageSnippetsProps extends CardProps {
29
29
  */
30
30
  [p: string]: any;
31
31
  /**
32
- * thread user object
32
+ * thread user/ group object
33
33
  * @default null
34
34
  */
35
- userObj?: any;
35
+ threadObj?: any;
36
36
  }
37
37
  /**
38
38
  * > API documentation for the Community-JS PrivateMessageSnippets component. Learn about the available props and the CSS API.
@@ -71,15 +71,16 @@ function PrivateMessageSnippets(inProps) {
71
71
  props: inProps,
72
72
  name: constants_1.PREFIX
73
73
  });
74
- const { className = null, userObj = null, snippetActions, clearSearch } = props, rest = tslib_1.__rest(props, ["className", "userObj", "snippetActions", "clearSearch"]);
74
+ const { className = null, threadObj = null, snippetActions, clearSearch } = props, rest = tslib_1.__rest(props, ["className", "threadObj", "snippetActions", "clearSearch"]);
75
75
  // STATE
76
76
  const theme = (0, material_1.useTheme)();
77
77
  const isMobile = (0, useMediaQuery_1.default)(theme.breakpoints.down('md'));
78
78
  const { data, updateSnippets } = (0, react_core_1.useSCFetchPrivateMessageSnippets)({ cacheStrategy: utils_1.CacheStrategies.CACHE_FIRST });
79
79
  const [search, setSearch] = (0, react_1.useState)('');
80
- const isObj = typeof userObj === 'object';
80
+ const isObj = typeof threadObj === 'object';
81
81
  const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
82
82
  const authUserId = scUserContext.user ? scUserContext.user.id : null;
83
+ const [type, setType] = (0, react_1.useState)(null);
83
84
  // INTL
84
85
  const intl = (0, react_intl_1.useIntl)();
85
86
  // REFS
@@ -101,6 +102,18 @@ function PrivateMessageSnippets(inProps) {
101
102
  }
102
103
  return ((_b = item === null || item === void 0 ? void 0 : item.receiver) === null || _b === void 0 ? void 0 : _b.id) !== loggedUserId ? (_c = item === null || item === void 0 ? void 0 : item.receiver) === null || _c === void 0 ? void 0 : _c.id : (_d = item === null || item === void 0 ? void 0 : item.sender) === null || _d === void 0 ? void 0 : _d.id;
103
104
  };
105
+ const isSelected = (0, react_1.useMemo)(() => {
106
+ return (message) => {
107
+ var _a, _b;
108
+ if (type === types_1.SCPrivateMessageType.GROUP) {
109
+ return ((_a = message === null || message === void 0 ? void 0 : message.group) === null || _a === void 0 ? void 0 : _a.id) === (isObj ? (_b = threadObj === null || threadObj === void 0 ? void 0 : threadObj.group) === null || _b === void 0 ? void 0 : _b.id : threadObj);
110
+ }
111
+ else if (type === types_1.SCPrivateMessageType.USER) {
112
+ return messageReceiver(message, authUserId) === (isObj ? messageReceiver(threadObj, authUserId) : threadObj);
113
+ }
114
+ return false;
115
+ };
116
+ }, [threadObj, authUserId, type]);
104
117
  //HANDLERS
105
118
  const handleChange = (event) => {
106
119
  setSearch(event.target.value);
@@ -116,7 +129,9 @@ function PrivateMessageSnippets(inProps) {
116
129
  snippetActions && snippetActions.onDeleteConfirm(msg);
117
130
  };
118
131
  function handleOpenThread(msg) {
119
- snippetActions && snippetActions.onSnippetClick(msg);
132
+ const _type = msg.group !== null ? types_1.SCPrivateMessageType.GROUP : types_1.SCPrivateMessageType.USER;
133
+ setType(_type);
134
+ snippetActions && snippetActions.onSnippetClick(msg, _type);
120
135
  handleClear();
121
136
  updateSnippetsParams(msg.id, 'seen');
122
137
  }
@@ -221,7 +236,6 @@ function PrivateMessageSnippets(inProps) {
221
236
  } }),
222
237
  react_1.default.createElement(material_1.List, null, filteredSnippets.map((message) => (react_1.default.createElement(PrivateMessageSnippetItem_1.default, { message: message, key: message.id, onItemClick: () => handleOpenThread(message), secondaryAction: react_1.default.createElement(react_1.default.Fragment, null,
223
238
  message.thread_status === types_1.SCPrivateMessageStatusType.NEW && (react_1.default.createElement(material_1.Icon, { fontSize: "small", color: "secondary" }, "fiber_manual_record")),
224
- !isMobile && (react_1.default.createElement(PrivateMessageSettingsIconButton_1.default, { threadToDelete: messageReceiver(message, authUserId), onItemDeleteConfirm: () => handleDeleteConversation(messageReceiver(message, authUserId)), user: messageReceiver(message, authUserId, true) }))), selected: userObj !== types_1.SCPrivateMessageStatusType.NEW &&
225
- messageReceiver(message, authUserId) === (isObj ? messageReceiver(userObj, authUserId) : userObj) })))))))));
239
+ !isMobile && (react_1.default.createElement(PrivateMessageSettingsIconButton_1.default, { threadToDelete: messageReceiver(message, authUserId), onItemDeleteConfirm: () => handleDeleteConversation(messageReceiver(message, authUserId)), user: messageReceiver(message, authUserId, true) }))), selected: isSelected(message) })))))))));
226
240
  }
227
241
  exports.default = PrivateMessageSnippets;
@@ -1,10 +1,11 @@
1
+ import { SCPrivateMessageType } from '@selfcommunity/types';
1
2
  import { CardProps } from '@mui/material';
2
3
  export interface PrivateMessageThreadProps extends CardProps {
3
4
  /**
4
5
  * Thread object or thread id
5
6
  * default null
6
7
  */
7
- userObj?: any;
8
+ threadObj?: any;
8
9
  /**
9
10
  * Overrides or extends the styles applied to the component.
10
11
  * @default null
@@ -30,6 +31,10 @@ export interface PrivateMessageThreadProps extends CardProps {
30
31
  * @default null
31
32
  */
32
33
  onSingleMessageOpen?: (open: boolean) => void;
34
+ /**
35
+ * The Thread type
36
+ */
37
+ type?: SCPrivateMessageType;
33
38
  /**
34
39
  * Any other properties
35
40
  */
@@ -95,7 +95,7 @@ function PrivateMessageThread(inProps) {
95
95
  props: inProps,
96
96
  name: constants_1.PREFIX
97
97
  });
98
- const { userObj, openNewMessage = false, onNewMessageClose = null, onNewMessageSent = null, onSingleMessageOpen = null, className } = props, rest = tslib_1.__rest(props, ["userObj", "openNewMessage", "onNewMessageClose", "onNewMessageSent", "onSingleMessageOpen", "className"]);
98
+ const { threadObj, openNewMessage = false, onNewMessageClose = null, onNewMessageSent = null, onSingleMessageOpen = null, className, type } = props, rest = tslib_1.__rest(props, ["threadObj", "openNewMessage", "onNewMessageClose", "onNewMessageSent", "onSingleMessageOpen", "className", "type"]);
99
99
  // CONTEXT
100
100
  const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
101
101
  // STATE
@@ -106,7 +106,7 @@ function PrivateMessageThread(inProps) {
106
106
  const [loading, setLoading] = (0, react_1.useState)(false);
107
107
  const [isHovered, setIsHovered] = (0, react_1.useState)({});
108
108
  const [followers, setFollowers] = (0, react_1.useState)([]);
109
- const isNew = userObj && userObj === types_1.SCPrivateMessageStatusType.NEW;
109
+ const isNew = threadObj && threadObj === types_1.SCPrivateMessageStatusType.NEW;
110
110
  const authUserId = scUserContext.user ? scUserContext.user.id : null;
111
111
  const [singleMessageUser, setSingleMessageUser] = (0, react_1.useState)(null);
112
112
  const [receiver, setReceiver] = (0, react_1.useState)(null);
@@ -115,7 +115,7 @@ function PrivateMessageThread(inProps) {
115
115
  const [openDeleteMessageDialog, setOpenDeleteMessageDialog] = (0, react_1.useState)(false);
116
116
  const [recipients, setRecipients] = (0, react_1.useState)([]);
117
117
  const { enqueueSnackbar, closeSnackbar } = (0, notistack_1.useSnackbar)();
118
- const isNumber = typeof userObj === 'number';
118
+ const isNumber = typeof threadObj === 'number';
119
119
  const messageReceiver = (item, loggedUserId) => {
120
120
  var _a, _b, _c;
121
121
  return ((_a = item === null || item === void 0 ? void 0 : item.receiver) === null || _a === void 0 ? void 0 : _a.id) !== loggedUserId ? (_b = item === null || item === void 0 ? void 0 : item.receiver) === null || _b === void 0 ? void 0 : _b.id : (_c = item === null || item === void 0 ? void 0 : item.sender) === null || _c === void 0 ? void 0 : _c.id;
@@ -128,7 +128,7 @@ function PrivateMessageThread(inProps) {
128
128
  // HOOKS
129
129
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
130
130
  // @ts-ignore
131
- const { scUser } = (0, react_core_1.useSCFetchUser)({ id: userObj, userObj });
131
+ const { scUser } = (0, react_core_1.useSCFetchUser)({ id: threadObj, threadObj });
132
132
  const messagesEndRef = (0, react_1.useRef)(null);
133
133
  const scrollToBottom = () => {
134
134
  var _a;
@@ -256,9 +256,9 @@ function PrivateMessageThread(inProps) {
256
256
  * Fetches thread
257
257
  */
258
258
  function fetchThread() {
259
- if (userObj && typeof userObj !== 'string') {
259
+ if (threadObj && typeof threadObj !== 'string' && type !== types_1.SCPrivateMessageType.GROUP) {
260
260
  setLoadingMessageObjs(true);
261
- const _userObjId = isNumber ? userObj : messageReceiver(userObj, authUserId);
261
+ const _userObjId = isNumber ? threadObj : messageReceiver(threadObj, authUserId);
262
262
  api_services_1.PrivateMessageService.getAThread({ user: _userObjId, limit: 10 })
263
263
  .then((res) => {
264
264
  setMessageObjs(res.results);
@@ -291,6 +291,19 @@ function PrivateMessageThread(inProps) {
291
291
  utils_1.Logger.error(Errors_1.SCOPE_SC_UI, { error });
292
292
  });
293
293
  }
294
+ else if (type === types_1.SCPrivateMessageType.GROUP) {
295
+ api_services_1.PrivateMessageService.getAThread({ group: isNumber ? threadObj : threadObj.group.id, limit: 10 })
296
+ .then((res) => {
297
+ setMessageObjs(res.results);
298
+ setPrevious(res.next && updateAndDeleteURLParameters(res.next, 'before_message', res.results[0].id, 'offset'));
299
+ setLoadingMessageObjs(false);
300
+ })
301
+ .catch((error) => {
302
+ setLoadingMessageObjs(false);
303
+ console.log(error);
304
+ utils_1.Logger.error(Errors_1.SCOPE_SC_UI, { error });
305
+ });
306
+ }
294
307
  }
295
308
  const isNewerThan60Seconds = (creationTime) => {
296
309
  const date = new Date(creationTime);
@@ -355,11 +368,15 @@ function PrivateMessageThread(inProps) {
355
368
  .request({
356
369
  url: api_services_1.Endpoints.SendMessage.url(),
357
370
  method: api_services_1.Endpoints.SendMessage.method,
358
- data: {
359
- recipients: openNewMessage || isNew || singleMessageThread ? ids : [isNumber && userObj ? userObj : messageReceiver(userObj, authUserId)],
360
- message: message,
361
- file_uuid: file && !message ? file : null
362
- }
371
+ data: Object.assign(Object.assign({}, (type === types_1.SCPrivateMessageType.GROUP
372
+ ? { group: isNumber ? threadObj : threadObj.group.id }
373
+ : {
374
+ recipients: openNewMessage || isNew || singleMessageThread
375
+ ? ids
376
+ : [isNumber && threadObj ? threadObj : messageReceiver(threadObj, authUserId)]
377
+ })), {
378
+ // recipients: openNewMessage || isNew || singleMessageThread ? ids : [isNumber && threadObj ? threadObj : messageReceiver(threadObj, authUserId)],
379
+ message: message, file_uuid: file && !message ? file : null })
363
380
  })
364
381
  .then((res) => {
365
382
  const isOne = res.data.length <= 1;
@@ -405,13 +422,13 @@ function PrivateMessageThread(inProps) {
405
422
  if (!authUserId) {
406
423
  return;
407
424
  }
408
- if (userObj) {
425
+ if (threadObj) {
409
426
  fetchThread();
410
427
  }
411
428
  else {
412
429
  reset();
413
430
  }
414
- }, [userObj, authUserId, scUser]);
431
+ }, [threadObj, authUserId, scUser]);
415
432
  /**
416
433
  * Notification subscriber
417
434
  */
@@ -426,7 +443,7 @@ function PrivateMessageThread(inProps) {
426
443
  if (index !== -1) {
427
444
  setMessageObjs((prev) => [...prev, res.notification_obj.message]);
428
445
  }
429
- if (isNumber ? userObj === res.thread_id : userObj.id === res.thread_id) {
446
+ if (isNumber ? threadObj === res.thread_id : threadObj.id === res.thread_id) {
430
447
  scrollToBottom();
431
448
  }
432
449
  };
@@ -457,7 +474,7 @@ function PrivateMessageThread(inProps) {
457
474
  onMouseEnter: () => handleMouseEnter(msg.id),
458
475
  onMouseLeave: () => handleMouseLeave(msg.id)
459
476
  }, isHovering: isHovered[msg.id], showMenuIcon: authUserId === msg.sender.id, onMenuIconClick: () => handleOpenDeleteMessageDialog(msg) }))))))))),
460
- react_1.default.createElement(PrivateMessageEditor_1.default, { className: classes.editor, send: handleSend, autoHide: !(scUser === null || scUser === void 0 ? void 0 : scUser.can_send_pm_to), autoHideDeletion: (receiver === null || receiver === void 0 ? void 0 : receiver.deleted) || (scUser === null || scUser === void 0 ? void 0 : scUser.deleted), onThreadChangeId: isNumber ? userObj : userObj.receiver.id, error: error, onErrorRemove: () => setError(false) }),
477
+ react_1.default.createElement(PrivateMessageEditor_1.default, { className: classes.editor, send: handleSend, autoHide: type === types_1.SCPrivateMessageType.USER && !(scUser === null || scUser === void 0 ? void 0 : scUser.can_send_pm_to), autoHideDeletion: type === types_1.SCPrivateMessageType.USER && ((receiver === null || receiver === void 0 ? void 0 : receiver.deleted) || (scUser === null || scUser === void 0 ? void 0 : scUser.deleted)), onThreadChangeId: isNumber ? threadObj : type === types_1.SCPrivateMessageType.USER ? threadObj.receiver.id : threadObj.group.id, error: error, onErrorRemove: () => setError(false) }),
461
478
  openDeleteMessageDialog && (react_1.default.createElement(ConfirmDialog_1.default, { open: openDeleteMessageDialog, title: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.privateMessage.component.delete.message.dialog.msg", defaultMessage: "ui.privateMessage.component.delete.message.dialog.msg" }), btnConfirm: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.privateMessage.component.delete.message.dialog.confirm", defaultMessage: "ui.privateMessage.component.delete.message.dialog.confirm" }), onConfirm: handleDeleteMessage, onClose: handleCloseDeleteMessageDialog }))));
462
479
  }
463
480
  /**
@@ -485,6 +502,6 @@ function PrivateMessageThread(inProps) {
485
502
  /**
486
503
  * Renders the component
487
504
  */
488
- return (react_1.default.createElement(Root, Object.assign({}, rest, { className: (0, classnames_1.default)(classes.root, className) }), userObj !== null && !isNew && !singleMessageThread ? renderThread() : renderNewOrNoMessageBox()));
505
+ return (react_1.default.createElement(Root, Object.assign({}, rest, { className: (0, classnames_1.default)(classes.root, className) }), threadObj !== null && !isNew && !singleMessageThread ? renderThread() : renderNewOrNoMessageBox()));
489
506
  }
490
507
  exports.default = PrivateMessageThread;