@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.
- package/lib/cjs/components/ChangeGroupPicture/ChangeGroupPicture.js +13 -10
- package/lib/cjs/components/Composer/Composer.js +1 -1
- package/lib/cjs/components/Composer/Layer/AudienceLayer/AudienceLayer.js +4 -4
- package/lib/cjs/components/FeedObject/FeedObject.d.ts +1 -0
- package/lib/cjs/components/FeedObject/FeedObject.js +17 -5
- package/lib/cjs/components/Group/Group.js +3 -2
- package/lib/cjs/components/GroupForm/GroupForm.js +3 -3
- package/lib/cjs/components/GroupHeader/GroupHeader.js +2 -2
- package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
- package/lib/cjs/components/PrivateMessageComponent/PrivateMessageComponent.js +10 -7
- package/lib/cjs/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
- package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
- package/lib/cjs/components/PrivateMessageSnippets/PrivateMessageSnippets.js +19 -5
- package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
- package/lib/cjs/components/PrivateMessageThread/PrivateMessageThread.js +33 -16
- package/lib/esm/components/ChangeGroupPicture/ChangeGroupPicture.js +13 -10
- package/lib/esm/components/Composer/Composer.js +1 -1
- package/lib/esm/components/Composer/Layer/AudienceLayer/AudienceLayer.js +4 -4
- package/lib/esm/components/FeedObject/FeedObject.d.ts +1 -0
- package/lib/esm/components/FeedObject/FeedObject.js +18 -6
- package/lib/esm/components/Group/Group.js +3 -2
- package/lib/esm/components/GroupForm/GroupForm.js +3 -3
- package/lib/esm/components/GroupHeader/GroupHeader.js +2 -2
- package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.d.ts +1 -1
- package/lib/esm/components/PrivateMessageComponent/PrivateMessageComponent.js +11 -8
- package/lib/esm/components/PrivateMessageSnippetItem/PrivateMessageSnippetItem.js +11 -6
- package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.d.ts +3 -3
- package/lib/esm/components/PrivateMessageSnippets/PrivateMessageSnippets.js +21 -7
- package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.d.ts +6 -1
- package/lib/esm/components/PrivateMessageThread/PrivateMessageThread.js +34 -17
- package/lib/umd/react-ui.js +1 -1
- 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
|
-
|
|
79
|
-
|
|
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 ?
|
|
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
|
-
() => (
|
|
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
|
|
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
|
|
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 },
|
|
430
|
-
react_1.default.createElement(
|
|
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 },
|
|
472
|
-
react_1.default.createElement(
|
|
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 = {}
|
|
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,
|
|
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, {
|
|
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.
|
|
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 },
|
|
@@ -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
|
-
|
|
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
|
-
},
|
|
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, {
|
|
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 (
|
|
78
|
-
|
|
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 },
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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 {
|
|
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 =
|
|
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
|
|
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:
|
|
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 (
|
|
259
|
+
if (threadObj && typeof threadObj !== 'string' && type !== types_1.SCPrivateMessageType.GROUP) {
|
|
260
260
|
setLoadingMessageObjs(true);
|
|
261
|
-
const _userObjId = isNumber ?
|
|
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
|
-
|
|
360
|
-
|
|
361
|
-
|
|
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 (
|
|
425
|
+
if (threadObj) {
|
|
409
426
|
fetchThread();
|
|
410
427
|
}
|
|
411
428
|
else {
|
|
412
429
|
reset();
|
|
413
430
|
}
|
|
414
|
-
}, [
|
|
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 ?
|
|
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 ?
|
|
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) }),
|
|
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;
|