@selfcommunity/react-ui 0.7.9-alpha.30 → 0.7.9-alpha.31
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/CommentObject/CommentObject.js +18 -0
- package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -0
- package/lib/cjs/components/GroupRequestsWidget/GroupRequestsWidget.js +7 -6
- package/lib/esm/components/CommentObject/CommentObject.js +20 -2
- package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.d.ts +11 -0
- package/lib/esm/components/GroupRequestsWidget/GroupRequestsWidget.js +7 -6
- package/lib/umd/react-ui.js +1 -1
- package/package.json +2 -2
|
@@ -89,6 +89,7 @@ const Root = (0, styles_1.styled)(material_1.Box, {
|
|
|
89
89
|
* @param inProps
|
|
90
90
|
*/
|
|
91
91
|
function CommentObject(inProps) {
|
|
92
|
+
var _a;
|
|
92
93
|
// PROPS
|
|
93
94
|
const props = (0, system_1.useThemeProps)({
|
|
94
95
|
props: inProps,
|
|
@@ -98,6 +99,7 @@ function CommentObject(inProps) {
|
|
|
98
99
|
// CONTEXT
|
|
99
100
|
const scContext = (0, react_core_1.useSCContext)();
|
|
100
101
|
const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
|
|
102
|
+
const scGroupsManager = scUserContext.managers.groups;
|
|
101
103
|
const scRoutingContext = (0, react_core_1.useSCRouting)();
|
|
102
104
|
const { enqueueSnackbar } = (0, notistack_1.useSnackbar)();
|
|
103
105
|
// STATE
|
|
@@ -115,11 +117,21 @@ function CommentObject(inProps) {
|
|
|
115
117
|
cacheStrategy
|
|
116
118
|
});
|
|
117
119
|
const [openAlert, setOpenAlert] = (0, react_1.useState)(false);
|
|
120
|
+
const [status, setStatus] = (0, react_1.useState)(null);
|
|
118
121
|
// HANDLERS
|
|
119
122
|
const handleVoteSuccess = (contribution) => {
|
|
120
123
|
setObj(contribution);
|
|
121
124
|
onVote && onVote(contribution);
|
|
122
125
|
};
|
|
126
|
+
/**
|
|
127
|
+
* If the obj has a group, checks the subscription status for the authenticated user
|
|
128
|
+
*/
|
|
129
|
+
(0, react_1.useEffect)(() => {
|
|
130
|
+
var _a;
|
|
131
|
+
if (((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id) && (feedObject === null || feedObject === void 0 ? void 0 : feedObject.group)) {
|
|
132
|
+
setStatus(scGroupsManager.subscriptionStatus(feedObject === null || feedObject === void 0 ? void 0 : feedObject.group));
|
|
133
|
+
}
|
|
134
|
+
}, [(_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id, scGroupsManager.subscriptionStatus, feedObject === null || feedObject === void 0 ? void 0 : feedObject.group]);
|
|
123
135
|
/**
|
|
124
136
|
* Update state object
|
|
125
137
|
* @param newObj
|
|
@@ -154,6 +166,12 @@ function CommentObject(inProps) {
|
|
|
154
166
|
if (!scUserContext.user) {
|
|
155
167
|
scContext.settings.handleAnonymousAction();
|
|
156
168
|
}
|
|
169
|
+
else if ((feedObject === null || feedObject === void 0 ? void 0 : feedObject.group) && status !== types_1.SCGroupSubscriptionStatusType.SUBSCRIBED) {
|
|
170
|
+
enqueueSnackbar(react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.common.group.actions.unsubscribed", defaultMessage: "ui.common.group.actions.unsubscribed" }), {
|
|
171
|
+
variant: 'warning',
|
|
172
|
+
autoHideDuration: 3000
|
|
173
|
+
});
|
|
174
|
+
}
|
|
157
175
|
else {
|
|
158
176
|
setReplyComment(comment);
|
|
159
177
|
onOpenReply && onOpenReply(comment);
|
|
@@ -4,6 +4,7 @@ import { CacheStrategies } from '@selfcommunity/utils';
|
|
|
4
4
|
import { BaseDialogProps } from '../../shared/BaseDialog';
|
|
5
5
|
import { VirtualScrollerItemProps } from '../../types/virtualScroller';
|
|
6
6
|
import { UserProps } from '../User';
|
|
7
|
+
import { GroupSubscribeButtonProps } from '../GroupSubscribeButton';
|
|
7
8
|
export interface GroupRequestsWidgetProps extends VirtualScrollerItemProps, WidgetProps {
|
|
8
9
|
/**
|
|
9
10
|
* Group Object
|
|
@@ -35,6 +36,16 @@ export interface GroupRequestsWidgetProps extends VirtualScrollerItemProps, Widg
|
|
|
35
36
|
* @default {}
|
|
36
37
|
*/
|
|
37
38
|
DialogProps?: BaseDialogProps;
|
|
39
|
+
/**
|
|
40
|
+
* Props to spread to group subscribe button component
|
|
41
|
+
* @default {}
|
|
42
|
+
*/
|
|
43
|
+
GroupSubscribeButtonProps?: GroupSubscribeButtonProps;
|
|
44
|
+
/**
|
|
45
|
+
* onSubscribeAction callback
|
|
46
|
+
* @param user
|
|
47
|
+
*/
|
|
48
|
+
onSubscribeActon?: (userId: number | string) => any;
|
|
38
49
|
/**
|
|
39
50
|
* Other props
|
|
40
51
|
*/
|
|
@@ -75,7 +75,7 @@ function GroupRequestsWidget(inProps) {
|
|
|
75
75
|
props: inProps,
|
|
76
76
|
name: constants_1.PREFIX
|
|
77
77
|
});
|
|
78
|
-
const { groupId, group, limit = 5, className, cacheStrategy = utils_1.CacheStrategies.NETWORK_ONLY, onHeightChange, onStateChange, UserProps = {}, DialogProps = {} } = props, rest = tslib_1.__rest(props, ["groupId", "group", "limit", "className", "cacheStrategy", "onHeightChange", "onStateChange", "UserProps", "DialogProps"]);
|
|
78
|
+
const { groupId, group, limit = 5, className, cacheStrategy = utils_1.CacheStrategies.NETWORK_ONLY, onHeightChange, onStateChange, UserProps = {}, DialogProps = {}, GroupSubscribeButtonProps = {}, onSubscribeActon } = props, rest = tslib_1.__rest(props, ["groupId", "group", "limit", "className", "cacheStrategy", "onHeightChange", "onStateChange", "UserProps", "DialogProps", "GroupSubscribeButtonProps", "onSubscribeActon"]);
|
|
79
79
|
// STATE
|
|
80
80
|
const [state, dispatch] = (0, react_1.useReducer)(widget_1.dataWidgetReducer, {
|
|
81
81
|
isLoadingNext: false,
|
|
@@ -171,14 +171,15 @@ function GroupRequestsWidget(inProps) {
|
|
|
171
171
|
const handleToggleDialogOpen = () => {
|
|
172
172
|
setOpenDialog((prev) => !prev);
|
|
173
173
|
};
|
|
174
|
-
const handleSubscribeAction = (0, react_1.useMemo)(() => (
|
|
174
|
+
const handleSubscribeAction = (0, react_1.useMemo)(() => (user) => {
|
|
175
175
|
const newRequests = [...state.results];
|
|
176
|
-
const _updated = newRequests.filter((u) => u.id !==
|
|
176
|
+
const _updated = newRequests.filter((u) => u.id !== user.id);
|
|
177
177
|
dispatch({
|
|
178
178
|
type: widget_1.actionWidgetTypes.SET_RESULTS,
|
|
179
179
|
payload: { results: newRequests.length > 1 ? _updated : [] }
|
|
180
180
|
});
|
|
181
|
-
|
|
181
|
+
onSubscribeActon && onSubscribeActon(user);
|
|
182
|
+
}, [dispatch, state.count, state.results, onSubscribeActon]);
|
|
182
183
|
// RENDER
|
|
183
184
|
if ((!state.count && state.initialized) || !contentAvailability || !scGroup || !state.count || !state.results.length || !isGroupAdmin) {
|
|
184
185
|
return react_1.default.createElement(HiddenPlaceholder_1.default, null);
|
|
@@ -191,14 +192,14 @@ function GroupRequestsWidget(inProps) {
|
|
|
191
192
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupRequestsWidget.title", defaultMessage: "ui.groupRequestsWidget.title" })),
|
|
192
193
|
react_1.default.createElement(react_1.default.Fragment, null,
|
|
193
194
|
react_1.default.createElement(List_1.default, null, state.results.slice(0, state.visibleItems).map((user) => (react_1.default.createElement(material_1.ListItem, { key: user.id },
|
|
194
|
-
react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(GroupSubscribeButton_1.default, { group: scGroup, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, user: user, onSubscribe: () => handleSubscribeAction(user
|
|
195
|
+
react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(GroupSubscribeButton_1.default, Object.assign({ group: scGroup, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, user: user, onSubscribe: () => handleSubscribeAction(user) }, GroupSubscribeButtonProps)), user: user, userId: user.id }))))),
|
|
195
196
|
state.count > state.visibleItems && (react_1.default.createElement(material_1.Button, { className: classes.showMore, onClick: handleToggleDialogOpen },
|
|
196
197
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupRequestsWidget.button.showMore", defaultMessage: "ui.groupRequestsWidget.button.showMore" })))),
|
|
197
198
|
openDialog && (react_1.default.createElement(DialogRoot, Object.assign({ className: classes.dialogRoot, title: react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupRequestsWidget.dialogTitle", id: "ui.groupRequestsWidget.dialogTitle", values: { total: scGroup.subscribers_counter } }), onClose: handleToggleDialogOpen, open: openDialog }, DialogProps),
|
|
198
199
|
react_1.default.createElement(InfiniteScroll_1.default, { dataLength: state.results.length, next: handleNext, hasMoreNext: Boolean(state.next), loaderNext: react_1.default.createElement(User_1.UserSkeleton, Object.assign({ elevation: 0 }, UserProps)), height: isMobile ? '100%' : 400, endMessage: react_1.default.createElement(material_1.Typography, { className: classes.endMessage },
|
|
199
200
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupRequestsWidget.noMoreResults", defaultMessage: "ui.groupRequestsWidget.noMoreResults" })) },
|
|
200
201
|
react_1.default.createElement(List_1.default, null, state.results.map((user) => (react_1.default.createElement(material_1.ListItem, { key: user.id },
|
|
201
|
-
react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(GroupSubscribeButton_1.default, { group: scGroup, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, user: user, onSubscribe: () => handleSubscribeAction(user
|
|
202
|
+
react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(GroupSubscribeButton_1.default, Object.assign({ group: scGroup, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, user: user, onSubscribe: () => handleSubscribeAction(user) }, GroupSubscribeButtonProps)), user: user, userId: user.id }))))))))));
|
|
202
203
|
return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, rest), content));
|
|
203
204
|
}
|
|
204
205
|
exports.default = GroupRequestsWidget;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __rest } from "tslib";
|
|
2
|
-
import React, { useContext, useState } from 'react';
|
|
2
|
+
import React, { useContext, useEffect, useState } from 'react';
|
|
3
3
|
import { styled } from '@mui/material/styles';
|
|
4
4
|
import Widget from '../Widget';
|
|
5
5
|
import { FormattedMessage } from 'react-intl';
|
|
@@ -17,7 +17,7 @@ import { getContributionHtml, getContributionType, getRouteData } from '../../ut
|
|
|
17
17
|
import { useSnackbar } from 'notistack';
|
|
18
18
|
import { useThemeProps } from '@mui/system';
|
|
19
19
|
import BaseItem from '../../shared/BaseItem';
|
|
20
|
-
import { SCContributionType } from '@selfcommunity/types';
|
|
20
|
+
import { SCContributionType, SCGroupSubscriptionStatusType } from '@selfcommunity/types';
|
|
21
21
|
import { Endpoints, http } from '@selfcommunity/api-services';
|
|
22
22
|
import { CacheStrategies, Logger, LRUCache } from '@selfcommunity/utils';
|
|
23
23
|
import { Link, SCCache, SCRoutes, SCUserContext, UserUtils, useSCContext, useSCFetchCommentObject, useSCFetchCommentObjects, useSCRouting } from '@selfcommunity/react-core';
|
|
@@ -87,6 +87,7 @@ const Root = styled(Box, {
|
|
|
87
87
|
* @param inProps
|
|
88
88
|
*/
|
|
89
89
|
export default function CommentObject(inProps) {
|
|
90
|
+
var _a;
|
|
90
91
|
// PROPS
|
|
91
92
|
const props = useThemeProps({
|
|
92
93
|
props: inProps,
|
|
@@ -96,6 +97,7 @@ export default function CommentObject(inProps) {
|
|
|
96
97
|
// CONTEXT
|
|
97
98
|
const scContext = useSCContext();
|
|
98
99
|
const scUserContext = useContext(SCUserContext);
|
|
100
|
+
const scGroupsManager = scUserContext.managers.groups;
|
|
99
101
|
const scRoutingContext = useSCRouting();
|
|
100
102
|
const { enqueueSnackbar } = useSnackbar();
|
|
101
103
|
// STATE
|
|
@@ -113,11 +115,21 @@ export default function CommentObject(inProps) {
|
|
|
113
115
|
cacheStrategy
|
|
114
116
|
});
|
|
115
117
|
const [openAlert, setOpenAlert] = useState(false);
|
|
118
|
+
const [status, setStatus] = useState(null);
|
|
116
119
|
// HANDLERS
|
|
117
120
|
const handleVoteSuccess = (contribution) => {
|
|
118
121
|
setObj(contribution);
|
|
119
122
|
onVote && onVote(contribution);
|
|
120
123
|
};
|
|
124
|
+
/**
|
|
125
|
+
* If the obj has a group, checks the subscription status for the authenticated user
|
|
126
|
+
*/
|
|
127
|
+
useEffect(() => {
|
|
128
|
+
var _a;
|
|
129
|
+
if (((_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id) && (feedObject === null || feedObject === void 0 ? void 0 : feedObject.group)) {
|
|
130
|
+
setStatus(scGroupsManager.subscriptionStatus(feedObject === null || feedObject === void 0 ? void 0 : feedObject.group));
|
|
131
|
+
}
|
|
132
|
+
}, [(_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.id, scGroupsManager.subscriptionStatus, feedObject === null || feedObject === void 0 ? void 0 : feedObject.group]);
|
|
121
133
|
/**
|
|
122
134
|
* Update state object
|
|
123
135
|
* @param newObj
|
|
@@ -152,6 +164,12 @@ export default function CommentObject(inProps) {
|
|
|
152
164
|
if (!scUserContext.user) {
|
|
153
165
|
scContext.settings.handleAnonymousAction();
|
|
154
166
|
}
|
|
167
|
+
else if ((feedObject === null || feedObject === void 0 ? void 0 : feedObject.group) && status !== SCGroupSubscriptionStatusType.SUBSCRIBED) {
|
|
168
|
+
enqueueSnackbar(React.createElement(FormattedMessage, { id: "ui.common.group.actions.unsubscribed", defaultMessage: "ui.common.group.actions.unsubscribed" }), {
|
|
169
|
+
variant: 'warning',
|
|
170
|
+
autoHideDuration: 3000
|
|
171
|
+
});
|
|
172
|
+
}
|
|
155
173
|
else {
|
|
156
174
|
setReplyComment(comment);
|
|
157
175
|
onOpenReply && onOpenReply(comment);
|
|
@@ -4,6 +4,7 @@ import { CacheStrategies } from '@selfcommunity/utils';
|
|
|
4
4
|
import { BaseDialogProps } from '../../shared/BaseDialog';
|
|
5
5
|
import { VirtualScrollerItemProps } from '../../types/virtualScroller';
|
|
6
6
|
import { UserProps } from '../User';
|
|
7
|
+
import { GroupSubscribeButtonProps } from '../GroupSubscribeButton';
|
|
7
8
|
export interface GroupRequestsWidgetProps extends VirtualScrollerItemProps, WidgetProps {
|
|
8
9
|
/**
|
|
9
10
|
* Group Object
|
|
@@ -35,6 +36,16 @@ export interface GroupRequestsWidgetProps extends VirtualScrollerItemProps, Widg
|
|
|
35
36
|
* @default {}
|
|
36
37
|
*/
|
|
37
38
|
DialogProps?: BaseDialogProps;
|
|
39
|
+
/**
|
|
40
|
+
* Props to spread to group subscribe button component
|
|
41
|
+
* @default {}
|
|
42
|
+
*/
|
|
43
|
+
GroupSubscribeButtonProps?: GroupSubscribeButtonProps;
|
|
44
|
+
/**
|
|
45
|
+
* onSubscribeAction callback
|
|
46
|
+
* @param user
|
|
47
|
+
*/
|
|
48
|
+
onSubscribeActon?: (userId: number | string) => any;
|
|
38
49
|
/**
|
|
39
50
|
* Other props
|
|
40
51
|
*/
|
|
@@ -73,7 +73,7 @@ export default function GroupRequestsWidget(inProps) {
|
|
|
73
73
|
props: inProps,
|
|
74
74
|
name: PREFIX
|
|
75
75
|
});
|
|
76
|
-
const { groupId, group, limit = 5, className, cacheStrategy = CacheStrategies.NETWORK_ONLY, onHeightChange, onStateChange, UserProps = {}, DialogProps = {} } = props, rest = __rest(props, ["groupId", "group", "limit", "className", "cacheStrategy", "onHeightChange", "onStateChange", "UserProps", "DialogProps"]);
|
|
76
|
+
const { groupId, group, limit = 5, className, cacheStrategy = CacheStrategies.NETWORK_ONLY, onHeightChange, onStateChange, UserProps = {}, DialogProps = {}, GroupSubscribeButtonProps = {}, onSubscribeActon } = props, rest = __rest(props, ["groupId", "group", "limit", "className", "cacheStrategy", "onHeightChange", "onStateChange", "UserProps", "DialogProps", "GroupSubscribeButtonProps", "onSubscribeActon"]);
|
|
77
77
|
// STATE
|
|
78
78
|
const [state, dispatch] = useReducer(dataWidgetReducer, {
|
|
79
79
|
isLoadingNext: false,
|
|
@@ -169,14 +169,15 @@ export default function GroupRequestsWidget(inProps) {
|
|
|
169
169
|
const handleToggleDialogOpen = () => {
|
|
170
170
|
setOpenDialog((prev) => !prev);
|
|
171
171
|
};
|
|
172
|
-
const handleSubscribeAction = useMemo(() => (
|
|
172
|
+
const handleSubscribeAction = useMemo(() => (user) => {
|
|
173
173
|
const newRequests = [...state.results];
|
|
174
|
-
const _updated = newRequests.filter((u) => u.id !==
|
|
174
|
+
const _updated = newRequests.filter((u) => u.id !== user.id);
|
|
175
175
|
dispatch({
|
|
176
176
|
type: actionWidgetTypes.SET_RESULTS,
|
|
177
177
|
payload: { results: newRequests.length > 1 ? _updated : [] }
|
|
178
178
|
});
|
|
179
|
-
|
|
179
|
+
onSubscribeActon && onSubscribeActon(user);
|
|
180
|
+
}, [dispatch, state.count, state.results, onSubscribeActon]);
|
|
180
181
|
// RENDER
|
|
181
182
|
if ((!state.count && state.initialized) || !contentAvailability || !scGroup || !state.count || !state.results.length || !isGroupAdmin) {
|
|
182
183
|
return React.createElement(HiddenPlaceholder, null);
|
|
@@ -189,13 +190,13 @@ export default function GroupRequestsWidget(inProps) {
|
|
|
189
190
|
React.createElement(FormattedMessage, { id: "ui.groupRequestsWidget.title", defaultMessage: "ui.groupRequestsWidget.title" })),
|
|
190
191
|
React.createElement(React.Fragment, null,
|
|
191
192
|
React.createElement(List, null, state.results.slice(0, state.visibleItems).map((user) => (React.createElement(ListItem, { key: user.id },
|
|
192
|
-
React.createElement(User, { elevation: 0, actions: React.createElement(GroupSubscribeButton, { group: scGroup, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, user: user, onSubscribe: () => handleSubscribeAction(user
|
|
193
|
+
React.createElement(User, { elevation: 0, actions: React.createElement(GroupSubscribeButton, Object.assign({ group: scGroup, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, user: user, onSubscribe: () => handleSubscribeAction(user) }, GroupSubscribeButtonProps)), user: user, userId: user.id }))))),
|
|
193
194
|
state.count > state.visibleItems && (React.createElement(Button, { className: classes.showMore, onClick: handleToggleDialogOpen },
|
|
194
195
|
React.createElement(FormattedMessage, { id: "ui.groupRequestsWidget.button.showMore", defaultMessage: "ui.groupRequestsWidget.button.showMore" })))),
|
|
195
196
|
openDialog && (React.createElement(DialogRoot, Object.assign({ className: classes.dialogRoot, title: React.createElement(FormattedMessage, { defaultMessage: "ui.groupRequestsWidget.dialogTitle", id: "ui.groupRequestsWidget.dialogTitle", values: { total: scGroup.subscribers_counter } }), onClose: handleToggleDialogOpen, open: openDialog }, DialogProps),
|
|
196
197
|
React.createElement(InfiniteScroll, { dataLength: state.results.length, next: handleNext, hasMoreNext: Boolean(state.next), loaderNext: React.createElement(UserSkeleton, Object.assign({ elevation: 0 }, UserProps)), height: isMobile ? '100%' : 400, endMessage: React.createElement(Typography, { className: classes.endMessage },
|
|
197
198
|
React.createElement(FormattedMessage, { id: "ui.groupRequestsWidget.noMoreResults", defaultMessage: "ui.groupRequestsWidget.noMoreResults" })) },
|
|
198
199
|
React.createElement(List, null, state.results.map((user) => (React.createElement(ListItem, { key: user.id },
|
|
199
|
-
React.createElement(User, { elevation: 0, actions: React.createElement(GroupSubscribeButton, { group: scGroup, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, user: user, onSubscribe: () => handleSubscribeAction(user
|
|
200
|
+
React.createElement(User, { elevation: 0, actions: React.createElement(GroupSubscribeButton, Object.assign({ group: scGroup, groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, user: user, onSubscribe: () => handleSubscribeAction(user) }, GroupSubscribeButtonProps)), user: user, userId: user.id }))))))))));
|
|
200
201
|
return (React.createElement(Root, Object.assign({ className: classNames(classes.root, className) }, rest), content));
|
|
201
202
|
}
|