@selfcommunity/react-ui 0.7.50-events.43 → 0.7.50-events.46

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 (54) hide show
  1. package/lib/cjs/components/CreateEventButton/CreateEventButton.js +6 -4
  2. package/lib/cjs/components/CreateEventWidget/CreateEventWidget.d.ts +8 -0
  3. package/lib/cjs/components/CreateEventWidget/CreateEventWidget.js +62 -0
  4. package/lib/cjs/components/CreateEventWidget/Skeleton.d.ts +1 -0
  5. package/lib/cjs/components/CreateEventWidget/Skeleton.js +25 -0
  6. package/lib/cjs/components/CreateEventWidget/constants.d.ts +1 -0
  7. package/lib/cjs/components/CreateEventWidget/constants.js +4 -0
  8. package/lib/cjs/components/CreateEventWidget/index.d.ts +4 -0
  9. package/lib/cjs/components/CreateEventWidget/index.js +8 -0
  10. package/lib/cjs/components/EventPartecipantsButton/EventPartecipantsButton.d.ts +46 -0
  11. package/lib/cjs/components/EventPartecipantsButton/EventPartecipantsButton.js +130 -0
  12. package/lib/cjs/components/EventPartecipantsButton/index.d.ts +3 -0
  13. package/lib/cjs/components/EventPartecipantsButton/index.js +5 -0
  14. package/lib/cjs/components/Events/Events.js +1 -2
  15. package/lib/cjs/components/MyEventsWidget/MyEventsWidget.d.ts +19 -0
  16. package/lib/cjs/components/MyEventsWidget/MyEventsWidget.js +129 -0
  17. package/lib/cjs/components/MyEventsWidget/Skeleton.d.ts +1 -0
  18. package/lib/cjs/components/MyEventsWidget/Skeleton.js +25 -0
  19. package/lib/cjs/components/MyEventsWidget/constants.d.ts +1 -0
  20. package/lib/cjs/components/MyEventsWidget/constants.js +4 -0
  21. package/lib/cjs/components/MyEventsWidget/index.d.ts +4 -0
  22. package/lib/cjs/components/MyEventsWidget/index.js +8 -0
  23. package/lib/cjs/components/User/User.js +1 -1
  24. package/lib/cjs/index.d.ts +4 -1
  25. package/lib/cjs/index.js +12 -4
  26. package/lib/cjs/shared/Calendar/index.js +5 -1
  27. package/lib/esm/components/CreateEventButton/CreateEventButton.js +6 -4
  28. package/lib/esm/components/CreateEventWidget/CreateEventWidget.d.ts +8 -0
  29. package/lib/esm/components/CreateEventWidget/CreateEventWidget.js +59 -0
  30. package/lib/esm/components/CreateEventWidget/Skeleton.d.ts +1 -0
  31. package/lib/esm/components/CreateEventWidget/Skeleton.js +21 -0
  32. package/lib/esm/components/CreateEventWidget/constants.d.ts +1 -0
  33. package/lib/esm/components/CreateEventWidget/constants.js +1 -0
  34. package/lib/esm/components/CreateEventWidget/index.d.ts +4 -0
  35. package/lib/esm/components/CreateEventWidget/index.js +4 -0
  36. package/lib/esm/components/EventPartecipantsButton/EventPartecipantsButton.d.ts +46 -0
  37. package/lib/esm/components/EventPartecipantsButton/EventPartecipantsButton.js +127 -0
  38. package/lib/esm/components/EventPartecipantsButton/index.d.ts +3 -0
  39. package/lib/esm/components/EventPartecipantsButton/index.js +2 -0
  40. package/lib/esm/components/Events/Events.js +1 -2
  41. package/lib/esm/components/MyEventsWidget/MyEventsWidget.d.ts +19 -0
  42. package/lib/esm/components/MyEventsWidget/MyEventsWidget.js +126 -0
  43. package/lib/esm/components/MyEventsWidget/Skeleton.d.ts +1 -0
  44. package/lib/esm/components/MyEventsWidget/Skeleton.js +21 -0
  45. package/lib/esm/components/MyEventsWidget/constants.d.ts +1 -0
  46. package/lib/esm/components/MyEventsWidget/constants.js +1 -0
  47. package/lib/esm/components/MyEventsWidget/index.d.ts +4 -0
  48. package/lib/esm/components/MyEventsWidget/index.js +4 -0
  49. package/lib/esm/components/User/User.js +1 -1
  50. package/lib/esm/index.d.ts +4 -1
  51. package/lib/esm/index.js +6 -3
  52. package/lib/esm/shared/Calendar/index.js +5 -1
  53. package/lib/umd/react-ui.js +1 -1
  54. package/package.json +7 -7
@@ -10,6 +10,7 @@ const classnames_1 = tslib_1.__importDefault(require("classnames"));
10
10
  const react_1 = tslib_1.__importStar(require("react"));
11
11
  const react_intl_1 = require("react-intl");
12
12
  const EventForm_1 = tslib_1.__importDefault(require("../EventForm"));
13
+ const types_1 = require("@selfcommunity/types");
13
14
  const PREFIX = 'SCCreateEventButton';
14
15
  const classes = {
15
16
  root: `${PREFIX}-root`
@@ -52,11 +53,12 @@ function CreateEventButton(inProps) {
52
53
  const [open, setOpen] = react_1.default.useState(false);
53
54
  // CONST
54
55
  const authUserId = scUserContext.user ? scUserContext.user.id : null;
55
- const preferences = (0, react_core_1.useSCPreferences)();
56
- const onlyStaffEnabled = (0, react_1.useMemo)(() => preferences.preferences[react_core_1.SCPreferences.CONFIGURATIONS_GROUPS_ONLY_STAFF_ENABLED].value, [preferences.preferences]);
56
+ const { preferences, features } = (0, react_core_1.useSCPreferences)();
57
+ const eventsEnabled = (0, react_1.useMemo)(() => features && features.includes(types_1.SCFeatureName.EVENT) && features.includes(types_1.SCFeatureName.TAGGING), [features]);
58
+ const onlyStaffEnabled = (0, react_1.useMemo)(() => preferences[react_core_1.SCPreferences.CONFIGURATIONS_EVENTS_ONLY_STAFF_ENABLED].value, [preferences]);
57
59
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
58
60
  // @ts-ignore
59
- const canCreateEvent = (0, react_1.useMemo)(() => { var _a, _b; return (_b = (_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.permission) === null || _b === void 0 ? void 0 : _b.create_group; }, [(_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.permission]);
61
+ const canCreateEvent = (0, react_1.useMemo)(() => { var _a, _b; return (_b = (_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.permission) === null || _b === void 0 ? void 0 : _b.create_event; }, [(_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.permission]);
60
62
  /**
61
63
  * Handle click on button
62
64
  */
@@ -66,7 +68,7 @@ function CreateEventButton(inProps) {
66
68
  /**
67
69
  * If there's no authUserId, component is hidden.
68
70
  */
69
- if ((!canCreateEvent && onlyStaffEnabled) || !authUserId) {
71
+ if (!eventsEnabled || (!canCreateEvent && onlyStaffEnabled) || !authUserId) {
70
72
  return null;
71
73
  }
72
74
  /**
@@ -0,0 +1,8 @@
1
+ import { WidgetProps } from '../Widget';
2
+ export interface CreateEventWidgetProps extends WidgetProps {
3
+ /**
4
+ * Other props
5
+ */
6
+ [p: string]: any;
7
+ }
8
+ export default function CreateEventWidget(inProps: CreateEventWidgetProps): JSX.Element;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const material_1 = require("@mui/material");
6
+ const react_core_1 = require("@selfcommunity/react-core");
7
+ const react_1 = require("react");
8
+ const react_intl_1 = require("react-intl");
9
+ const HiddenPlaceholder_1 = tslib_1.__importDefault(require("../../shared/HiddenPlaceholder"));
10
+ const CreateEventButton_1 = tslib_1.__importDefault(require("../CreateEventButton"));
11
+ const Widget_1 = tslib_1.__importDefault(require("../Widget"));
12
+ const constants_1 = require("./constants");
13
+ const Skeleton_1 = tslib_1.__importDefault(require("./Skeleton"));
14
+ const types_1 = require("@selfcommunity/types");
15
+ const classes = {
16
+ root: `${constants_1.PREFIX}-root`,
17
+ image: `${constants_1.PREFIX}-image`,
18
+ calendar: `${constants_1.PREFIX}-calendar`,
19
+ content: `${constants_1.PREFIX}-content`,
20
+ title: `${constants_1.PREFIX}-title`,
21
+ spaging: `${constants_1.PREFIX}-spacing`,
22
+ actions: `${constants_1.PREFIX}-actions`
23
+ };
24
+ const Root = (0, material_1.styled)(Widget_1.default, {
25
+ name: constants_1.PREFIX,
26
+ slot: 'Root'
27
+ })();
28
+ function CreateEventWidget(inProps) {
29
+ var _a;
30
+ // PROPS
31
+ const props = (0, material_1.useThemeProps)({
32
+ props: inProps,
33
+ name: constants_1.PREFIX
34
+ });
35
+ const rest = tslib_1.__rest(props, []);
36
+ // STATE
37
+ const [loading, setLoading] = (0, react_1.useState)(true);
38
+ // CONTEXT
39
+ const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
40
+ // HOOK
41
+ const { preferences, features } = (0, react_core_1.useSCPreferences)();
42
+ const eventsEnabled = (0, react_1.useMemo)(() => features && features.includes(types_1.SCFeatureName.EVENT) && features.includes(types_1.SCFeatureName.TAGGING), [features]);
43
+ const authUserId = scUserContext.user ? scUserContext.user.id : null;
44
+ const onlyStaffEnabled = (0, react_1.useMemo)(() => preferences[react_core_1.SCPreferences.CONFIGURATIONS_GROUPS_ONLY_STAFF_ENABLED].value, [preferences]);
45
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
46
+ // @ts-ignore
47
+ const canCreateEvent = (0, react_1.useMemo)(() => { var _a, _b; return (_b = (_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.permission) === null || _b === void 0 ? void 0 : _b.create_group; }, [(_a = scUserContext === null || scUserContext === void 0 ? void 0 : scUserContext.user) === null || _a === void 0 ? void 0 : _a.permission]);
48
+ (0, react_1.useEffect)(() => {
49
+ setLoading(false);
50
+ }, []);
51
+ if (loading) {
52
+ return (0, jsx_runtime_1.jsx)(Skeleton_1.default, {});
53
+ }
54
+ /**
55
+ * If there's no authUserId, component is hidden.
56
+ */
57
+ if (!eventsEnabled || (!canCreateEvent && onlyStaffEnabled) || !authUserId) {
58
+ return (0, jsx_runtime_1.jsx)(HiddenPlaceholder_1.default, {});
59
+ }
60
+ return ((0, jsx_runtime_1.jsxs)(Root, Object.assign({ className: classes.root }, rest, { children: [(0, jsx_runtime_1.jsxs)(material_1.Box, Object.assign({ position: "relative" }, { children: [(0, jsx_runtime_1.jsx)(material_1.CardMedia, { component: "img", image: `${preferences[react_core_1.SCPreferences.IMAGES_USER_DEFAULT_COVER].value}`, alt: "placeholder image", className: classes.image }), (0, jsx_runtime_1.jsx)(material_1.Icon, Object.assign({ className: classes.calendar, fontSize: "large" }, { children: "CalendarIcon" }))] })), (0, jsx_runtime_1.jsxs)(material_1.CardContent, Object.assign({ className: classes.content }, { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "h5", className: classes.title }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.createEvent.title", defaultMessage: "ui.createEvent.title" }) })), (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "body1", className: classes.spaging }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.createEvent.description", defaultMessage: "ui.createEvent.description" }) })), (0, jsx_runtime_1.jsx)(material_1.Divider, { className: classes.spaging })] })), (0, jsx_runtime_1.jsx)(material_1.CardActions, Object.assign({ className: classes.actions }, { children: (0, jsx_runtime_1.jsx)(CreateEventButton_1.default, {}) }))] })));
61
+ }
62
+ exports.default = CreateEventWidget;
@@ -0,0 +1 @@
1
+ export default function CreateEventWidgetSkeleton(): JSX.Element;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const material_1 = require("@mui/material");
6
+ const Skeleton_1 = tslib_1.__importDefault(require("@mui/material/Skeleton"));
7
+ const styles_1 = require("@mui/material/styles");
8
+ const Widget_1 = tslib_1.__importDefault(require("../Widget"));
9
+ const constants_1 = require("./constants");
10
+ const classes = {
11
+ root: `${constants_1.PREFIX}-skeleton-root`,
12
+ calendar: `${constants_1.PREFIX}-calendar`,
13
+ content: `${constants_1.PREFIX}-content`,
14
+ title: `${constants_1.PREFIX}-title`,
15
+ spacing: `${constants_1.PREFIX}-spacing`,
16
+ actions: `${constants_1.PREFIX}-actions`
17
+ };
18
+ const Root = (0, styles_1.styled)(Widget_1.default, {
19
+ name: constants_1.PREFIX,
20
+ slot: 'SkeletonRoot'
21
+ })();
22
+ function CreateEventWidgetSkeleton() {
23
+ return ((0, jsx_runtime_1.jsxs)(Root, Object.assign({ className: classes.root }, { children: [(0, jsx_runtime_1.jsxs)(material_1.Box, Object.assign({ position: "relative" }, { children: [(0, jsx_runtime_1.jsx)(Skeleton_1.default, { variant: "rectangular", animation: "wave", width: "100%", height: "110px" }), (0, jsx_runtime_1.jsx)(Skeleton_1.default, { className: classes.calendar, variant: "rounded", animation: "wave", width: "50px", height: "50px" })] })), (0, jsx_runtime_1.jsxs)(material_1.CardContent, Object.assign({ className: classes.content }, { children: [(0, jsx_runtime_1.jsx)(Skeleton_1.default, { className: classes.title, animation: "wave", width: "26%", height: "30px" }), (0, jsx_runtime_1.jsx)(Skeleton_1.default, { className: classes.spacing, animation: "wave", width: "100%", height: "20px" }), (0, jsx_runtime_1.jsx)(material_1.Divider, { className: classes.spacing })] })), (0, jsx_runtime_1.jsx)(material_1.CardActions, Object.assign({ className: classes.actions }, { children: (0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", variant: "rounded", width: "138px", height: "36px" }) }))] })));
24
+ }
25
+ exports.default = CreateEventWidgetSkeleton;
@@ -0,0 +1 @@
1
+ export declare const PREFIX = "SCCreateEventWidget";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PREFIX = void 0;
4
+ exports.PREFIX = 'SCCreateEventWidget';
@@ -0,0 +1,4 @@
1
+ import CreateEventWidget, { CreateEventWidgetProps } from './CreateEventWidget';
2
+ import CreateEventWidgetSkeleton from './Skeleton';
3
+ export default CreateEventWidget;
4
+ export { CreateEventWidgetSkeleton, CreateEventWidgetProps, type CreateEventWidget };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreateEventWidgetSkeleton = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const CreateEventWidget_1 = tslib_1.__importDefault(require("./CreateEventWidget"));
6
+ const Skeleton_1 = tslib_1.__importDefault(require("./Skeleton"));
7
+ exports.CreateEventWidgetSkeleton = Skeleton_1.default;
8
+ exports.default = CreateEventWidget_1.default;
@@ -0,0 +1,46 @@
1
+ import { ButtonProps } from '@mui/material/Button/Button';
2
+ import { SCEventType } from '@selfcommunity/types';
3
+ import { BaseDialogProps } from '../../shared/BaseDialog';
4
+ export interface EventPartecipantsButtonProps extends Pick<ButtonProps, Exclude<keyof ButtonProps, 'onClick' | 'disabled'>> {
5
+ /**
6
+ * Event Object
7
+ * @default null
8
+ */
9
+ event?: SCEventType;
10
+ /**
11
+ * Id of event object
12
+ * @default null
13
+ */
14
+ eventId?: number;
15
+ /**
16
+ * Props to spread to followedBy dialog
17
+ * @default {}
18
+ */
19
+ DialogProps?: BaseDialogProps;
20
+ /**
21
+ * Any other properties
22
+ */
23
+ [p: string]: any;
24
+ }
25
+ /**
26
+ *> API documentation for the Community-JS Event Partecipants Button component. Learn about the available props and the CSS API.
27
+ *
28
+ #### Import
29
+ ```jsx
30
+ import {EventPartecipantsButton} from '@selfcommunity/react-ui';
31
+ ```
32
+ #### Component Name
33
+
34
+ The name `SCEventPartecipantsButton` can be used when providing style overrides in the theme.
35
+
36
+ * #### CSS
37
+ *
38
+ |Rule Name|Global class|Description|
39
+ |---|---|---|
40
+ |root|.SCEventPartecipantsButton-root|Styles applied to the root element.|
41
+ |dialogRoot|.SCEventPartecipantsButton-dialog-root|Styles applied to the root element.|
42
+ |endMessage|.SCEventPartecipantsButton-end-message|Styles applied to the end message element.|
43
+
44
+ * @param inProps
45
+ */
46
+ export default function EventPartecipantsButton(inProps: EventPartecipantsButtonProps): JSX.Element;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const material_1 = require("@mui/material");
6
+ const styles_1 = require("@mui/material/styles");
7
+ const useMediaQuery_1 = tslib_1.__importDefault(require("@mui/material/useMediaQuery"));
8
+ const system_1 = require("@mui/system");
9
+ const api_services_1 = require("@selfcommunity/api-services");
10
+ const react_core_1 = require("@selfcommunity/react-core");
11
+ const utils_1 = require("@selfcommunity/utils");
12
+ const classnames_1 = tslib_1.__importDefault(require("classnames"));
13
+ const react_1 = require("react");
14
+ const react_intl_1 = require("react-intl");
15
+ const use_deep_compare_effect_1 = require("use-deep-compare-effect");
16
+ const Errors_1 = require("../../constants/Errors");
17
+ const BaseDialog_1 = tslib_1.__importDefault(require("../../shared/BaseDialog"));
18
+ const InfiniteScroll_1 = tslib_1.__importDefault(require("../../shared/InfiniteScroll"));
19
+ const AvatarGroupSkeleton_1 = tslib_1.__importDefault(require("../Skeleton/AvatarGroupSkeleton"));
20
+ const User_1 = tslib_1.__importStar(require("../User"));
21
+ const PREFIX = 'SCEventPartecipantsButton';
22
+ const classes = {
23
+ root: `${PREFIX}-root`,
24
+ dialogRoot: `${PREFIX}-dialog-root`,
25
+ endMessage: `${PREFIX}-end-message`
26
+ };
27
+ const Root = (0, styles_1.styled)(material_1.Button, {
28
+ name: PREFIX,
29
+ slot: 'Root',
30
+ overridesResolver: (_props, styles) => styles.root
31
+ })();
32
+ const DialogRoot = (0, styles_1.styled)(BaseDialog_1.default, {
33
+ name: PREFIX,
34
+ slot: 'Root',
35
+ overridesResolver: (_props, styles) => styles.dialogRoot
36
+ })();
37
+ /**
38
+ *> API documentation for the Community-JS Event Partecipants Button component. Learn about the available props and the CSS API.
39
+ *
40
+ #### Import
41
+ ```jsx
42
+ import {EventPartecipantsButton} from '@selfcommunity/react-ui';
43
+ ```
44
+ #### Component Name
45
+
46
+ The name `SCEventPartecipantsButton` can be used when providing style overrides in the theme.
47
+
48
+ * #### CSS
49
+ *
50
+ |Rule Name|Global class|Description|
51
+ |---|---|---|
52
+ |root|.SCEventPartecipantsButton-root|Styles applied to the root element.|
53
+ |dialogRoot|.SCEventPartecipantsButton-dialog-root|Styles applied to the root element.|
54
+ |endMessage|.SCEventPartecipantsButton-end-message|Styles applied to the end message element.|
55
+
56
+ * @param inProps
57
+ */
58
+ function EventPartecipantsButton(inProps) {
59
+ // PROPS
60
+ const props = (0, system_1.useThemeProps)({
61
+ props: inProps,
62
+ name: PREFIX
63
+ });
64
+ const { className, eventId, event, DialogProps = {} } = props, rest = tslib_1.__rest(props, ["className", "eventId", "event", "DialogProps"]);
65
+ // STATE
66
+ const [loading, setLoading] = (0, react_1.useState)(true);
67
+ const [next, setNext] = (0, react_1.useState)(null);
68
+ const [offset, setOffset] = (0, react_1.useState)(null);
69
+ const [followers, setFollowers] = (0, react_1.useState)([]);
70
+ const [open, setOpen] = (0, react_1.useState)(false);
71
+ // HOOKS
72
+ const { scEvent } = (0, react_core_1.useSCFetchEvent)({ id: eventId, event });
73
+ // FETCH FIRST FOLLOWERS
74
+ (0, use_deep_compare_effect_1.useDeepCompareEffectNoCheck)(() => {
75
+ if (!scEvent) {
76
+ return;
77
+ }
78
+ if (followers.length === 0) {
79
+ api_services_1.EventService.getUsersGoingToEvent(scEvent.id, { limit: 3 }).then((res) => {
80
+ setFollowers([...res.results]);
81
+ setOffset(4);
82
+ setLoading(false);
83
+ });
84
+ }
85
+ else {
86
+ setOffset(0);
87
+ }
88
+ }, [scEvent]);
89
+ (0, react_1.useEffect)(() => {
90
+ if (open && offset !== null) {
91
+ setLoading(true);
92
+ api_services_1.EventService.getUsersGoingToEvent(scEvent.id, { offset, limit: 20 }).then((res) => {
93
+ setFollowers([...(offset === 0 ? [] : followers), ...res.results]);
94
+ setNext(res.next);
95
+ setLoading(false);
96
+ setOffset(null);
97
+ });
98
+ }
99
+ }, [open, followers, offset]);
100
+ /**
101
+ * Memoized fetchFollowers
102
+ */
103
+ const fetchFollowers = (0, react_1.useCallback)(() => {
104
+ if (!next) {
105
+ return;
106
+ }
107
+ api_services_1.http
108
+ .request({
109
+ url: next,
110
+ method: api_services_1.Endpoints.GetUsersGoingToEvent.method
111
+ })
112
+ .then((res) => {
113
+ setFollowers([...followers, ...res.data.results]);
114
+ setNext(res.data.next);
115
+ })
116
+ .catch((error) => utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error))
117
+ .then(() => setLoading(false));
118
+ }, [followers, scEvent, next]);
119
+ /**
120
+ * Opens dialog votes
121
+ */
122
+ const handleToggleDialogOpen = (0, react_1.useCallback)(() => {
123
+ setOpen((prev) => !prev);
124
+ }, [setOpen]);
125
+ // RENDER
126
+ const theme = (0, material_1.useTheme)();
127
+ const isMobile = (0, useMediaQuery_1.default)(theme.breakpoints.down('md'));
128
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className), onClick: handleToggleDialogOpen, disabled: loading || !scEvent || scEvent.goings_counter === 0 }, rest, { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ color: "primary", variant: "caption" }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { defaultMessage: "ui.eventPartecipantsButton.partecipants", id: "ui.eventPartecipantsButton.partecipants" }) })), loading || !scEvent ? ((0, jsx_runtime_1.jsx)(AvatarGroupSkeleton_1.default, Object.assign({}, rest))) : ((0, jsx_runtime_1.jsx)(material_1.AvatarGroup, Object.assign({ total: scEvent.goings_counter }, { children: followers.map((c) => ((0, jsx_runtime_1.jsx)(material_1.Avatar, { alt: c.username, src: c.avatar }, c.id))) })))] })), open && ((0, jsx_runtime_1.jsx)(DialogRoot, Object.assign({ className: classes.dialogRoot, title: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { defaultMessage: "ui.eventPartecipantsButton.dialogTitle", id: "ui.eventPartecipantsButton.dialogTitle", values: { total: scEvent.goings_counter } }), onClose: handleToggleDialogOpen, open: open }, DialogProps, { children: (0, jsx_runtime_1.jsx)(InfiniteScroll_1.default, Object.assign({ dataLength: followers.length, next: fetchFollowers, hasMoreNext: next !== null || loading, loaderNext: (0, jsx_runtime_1.jsx)(User_1.UserSkeleton, { elevation: 0 }), height: isMobile ? '100%' : 400, endMessage: (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ className: classes.endMessage }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.eventPartecipantsButton.noOtherPartecipants", defaultMessage: "ui.eventPartecipantsButton.noOtherPartecipants" }) })) }, { children: (0, jsx_runtime_1.jsx)(material_1.List, { children: followers.map((follower) => ((0, jsx_runtime_1.jsx)(material_1.ListItem, { children: (0, jsx_runtime_1.jsx)(User_1.default, { elevation: 0, user: follower }) }, follower.id))) }) })) })))] }));
129
+ }
130
+ exports.default = EventPartecipantsButton;
@@ -0,0 +1,3 @@
1
+ import EventPartecipantsButton, { EventPartecipantsButtonProps } from './EventPartecipantsButton';
2
+ export default EventPartecipantsButton;
3
+ export { EventPartecipantsButtonProps };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const EventPartecipantsButton_1 = tslib_1.__importDefault(require("./EventPartecipantsButton"));
5
+ exports.default = EventPartecipantsButton_1.default;
@@ -14,7 +14,6 @@ const react_1 = require("react");
14
14
  const react_intl_1 = require("react-intl");
15
15
  const Errors_1 = require("../../constants/Errors");
16
16
  const Pagination_1 = require("../../constants/Pagination");
17
- const HiddenPlaceholder_1 = tslib_1.__importDefault(require("../../shared/HiddenPlaceholder"));
18
17
  const CreateEventButton_1 = tslib_1.__importDefault(require("../CreateEventButton"));
19
18
  const Event_1 = tslib_1.__importStar(require("../Event"));
20
19
  const Skeleton_1 = tslib_1.__importDefault(require("../Events/Skeleton"));
@@ -194,7 +193,7 @@ function Events(inProps) {
194
193
  * Renders root object (if content availability community option is false and user is anonymous, component is hidden)
195
194
  */
196
195
  if (!contentAvailability && !scUserContext.user) {
197
- return (0, jsx_runtime_1.jsx)(HiddenPlaceholder_1.default, {});
196
+ return null;
198
197
  }
199
198
  if (loading) {
200
199
  return (0, jsx_runtime_1.jsx)(Skeleton_1.default, {});
@@ -0,0 +1,19 @@
1
+ import { CacheStrategies } from '@selfcommunity/utils';
2
+ import { WidgetProps } from '../Widget';
3
+ export interface MyEventsWidgetProps extends WidgetProps {
4
+ /**
5
+ * Feed API Query Params
6
+ * @default [{'limit': 20, 'offset': 0}]
7
+ */
8
+ endpointQueryParams?: Record<string, string | number>;
9
+ /**
10
+ * Caching strategies
11
+ * @default CacheStrategies.CACHE_FIRST
12
+ */
13
+ cacheStrategy?: CacheStrategies;
14
+ /**
15
+ * Other props
16
+ */
17
+ [p: string]: any;
18
+ }
19
+ export default function MyEventsWidget(inProps: MyEventsWidgetProps): JSX.Element;
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const material_1 = require("@mui/material");
6
+ const styles_1 = require("@mui/material/styles");
7
+ const system_1 = require("@mui/system");
8
+ const api_services_1 = require("@selfcommunity/api-services");
9
+ const react_core_1 = require("@selfcommunity/react-core");
10
+ const types_1 = require("@selfcommunity/types");
11
+ const utils_1 = require("@selfcommunity/utils");
12
+ const react_1 = require("react");
13
+ const react_intl_1 = require("react-intl");
14
+ const Errors_1 = require("../../constants/Errors");
15
+ const Pagination_1 = require("../../constants/Pagination");
16
+ const Calendar_1 = tslib_1.__importDefault(require("../../shared/Calendar"));
17
+ const EventInfoDetails_1 = tslib_1.__importDefault(require("../../shared/EventInfoDetails"));
18
+ const HiddenPlaceholder_1 = tslib_1.__importDefault(require("../../shared/HiddenPlaceholder"));
19
+ const widget_1 = require("../../utils/widget");
20
+ const EventPartecipantsButton_1 = tslib_1.__importDefault(require("../EventPartecipantsButton"));
21
+ const User_1 = tslib_1.__importDefault(require("../User"));
22
+ const Widget_1 = tslib_1.__importDefault(require("../Widget"));
23
+ const constants_1 = require("./constants");
24
+ const Skeleton_1 = tslib_1.__importDefault(require("./Skeleton"));
25
+ const classes = {
26
+ root: `${constants_1.PREFIX}-root`,
27
+ titleWrapper: `${constants_1.PREFIX}-title-wrapper`,
28
+ content: `${constants_1.PREFIX}-content`,
29
+ firstDivider: `${constants_1.PREFIX}-first-divider`,
30
+ secondDivider: `${constants_1.PREFIX}-second-divider`,
31
+ actions: `${constants_1.PREFIX}-actions`,
32
+ actionButton: `${constants_1.PREFIX}-action-button`,
33
+ arrows: `${constants_1.PREFIX}-arrows`
34
+ };
35
+ const Root = (0, styles_1.styled)(Widget_1.default, {
36
+ name: constants_1.PREFIX,
37
+ slot: 'Root',
38
+ overridesResolver: (_props, styles) => styles.root
39
+ })();
40
+ function MyEventsWidget(inProps) {
41
+ var _a, _b, _c, _d, _e, _f;
42
+ // PROPS
43
+ const props = (0, system_1.useThemeProps)({
44
+ props: inProps,
45
+ name: constants_1.PREFIX
46
+ });
47
+ // CONST
48
+ const { endpointQueryParams = { limit: Pagination_1.DEFAULT_PAGINATION_LIMIT, offset: Pagination_1.DEFAULT_PAGINATION_OFFSET }, cacheStrategy } = props, rest = tslib_1.__rest(props, ["endpointQueryParams", "cacheStrategy"]);
49
+ // STATE
50
+ const [state, dispatch] = (0, react_1.useReducer)(widget_1.dataWidgetReducer, {
51
+ isLoadingNext: false,
52
+ next: null,
53
+ cacheKey: react_core_1.SCCache.getWidgetStateCacheKey(react_core_1.SCCache.USER_EVENTS_STATE_CACHE_PREFIX_KEY),
54
+ cacheStrategy,
55
+ visibleItems: 1
56
+ }, widget_1.stateWidgetInitializer);
57
+ const [eventIndex, setEventIndex] = (0, react_1.useState)(0);
58
+ // CONTEXT
59
+ const scUserContext = (0, react_core_1.useSCUser)();
60
+ const scRoutingContext = (0, react_core_1.useSCRouting)();
61
+ const { features } = (0, react_core_1.useSCPreferences)();
62
+ const eventsEnabled = (0, react_1.useMemo)(() => features && features.includes(types_1.SCFeatureName.EVENT) && features.includes(types_1.SCFeatureName.TAGGING), [features]);
63
+ /**
64
+ * Initialize component
65
+ * Fetch data only if the component is not initialized and it is not loading data
66
+ */
67
+ const _initComponent = (0, react_1.useCallback)(() => {
68
+ if (!state.initialized && !state.isLoadingNext) {
69
+ dispatch({ type: widget_1.actionWidgetTypes.LOADING_NEXT });
70
+ api_services_1.EventService.getUserEvents(Object.assign({}, endpointQueryParams))
71
+ .then((payload) => {
72
+ dispatch({ type: widget_1.actionWidgetTypes.LOAD_NEXT_SUCCESS, payload: Object.assign(Object.assign({}, payload), { initialized: true }) });
73
+ })
74
+ .catch((error) => {
75
+ dispatch({ type: widget_1.actionWidgetTypes.LOAD_NEXT_FAILURE, payload: { errorLoadNext: error } });
76
+ utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
77
+ });
78
+ }
79
+ }, [state.isLoadingNext, state.initialized, dispatch]);
80
+ const _fetchNext = (0, react_1.useCallback)(() => {
81
+ dispatch({ type: widget_1.actionWidgetTypes.LOADING_NEXT });
82
+ api_services_1.http
83
+ .request({
84
+ url: state.next,
85
+ method: api_services_1.Endpoints.GetUserEvents.method
86
+ })
87
+ .then((res) => {
88
+ dispatch({ type: widget_1.actionWidgetTypes.LOAD_NEXT_SUCCESS, payload: res.data });
89
+ setEventIndex((index) => index + 1);
90
+ })
91
+ .catch((error) => {
92
+ dispatch({ type: widget_1.actionWidgetTypes.LOAD_NEXT_FAILURE, payload: { errorLoadNext: error } });
93
+ utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
94
+ });
95
+ }, [dispatch, state.next]);
96
+ // EFFECTS
97
+ (0, react_1.useEffect)(() => {
98
+ let _t;
99
+ if (scUserContext.user) {
100
+ _t = setTimeout(_initComponent);
101
+ return () => {
102
+ clearTimeout(_t);
103
+ };
104
+ }
105
+ }, [scUserContext.user]);
106
+ const handlePrev = (0, react_1.useCallback)(() => {
107
+ setEventIndex(eventIndex - 1);
108
+ }, [eventIndex]);
109
+ const handleNext = (0, react_1.useCallback)(() => {
110
+ if (eventIndex < state.results.length - 1) {
111
+ setEventIndex(eventIndex + 1);
112
+ }
113
+ else {
114
+ _fetchNext();
115
+ }
116
+ }, [eventIndex, state.results]);
117
+ // RENDER
118
+ if (!eventsEnabled) {
119
+ return (0, jsx_runtime_1.jsx)(HiddenPlaceholder_1.default, {});
120
+ }
121
+ if (!state.initialized || state.isLoadingNext) {
122
+ return (0, jsx_runtime_1.jsx)(Skeleton_1.default, {});
123
+ }
124
+ if (state.count === 0) {
125
+ return (0, jsx_runtime_1.jsx)(HiddenPlaceholder_1.default, {});
126
+ }
127
+ return ((0, jsx_runtime_1.jsxs)(Root, Object.assign({ className: classes.root }, rest, { children: [(0, jsx_runtime_1.jsx)(system_1.Box, Object.assign({ className: classes.titleWrapper }, { children: (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "h5" }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.myEventsWidget.title", defaultMessage: "ui.myEventsWidget.title" }) })) })), (0, jsx_runtime_1.jsxs)(system_1.Box, Object.assign({ position: "relative" }, { children: [(0, jsx_runtime_1.jsx)(material_1.CardMedia, { component: "img", height: "170px", image: ((_a = state.results[eventIndex]) === null || _a === void 0 ? void 0 : _a.emotional_image) || ((_b = state.results[eventIndex]) === null || _b === void 0 ? void 0 : _b.image_medium), alt: (_c = state.results[eventIndex]) === null || _c === void 0 ? void 0 : _c.name }), (0, jsx_runtime_1.jsx)(Calendar_1.default, { day: new Date((_d = state.results[eventIndex]) === null || _d === void 0 ? void 0 : _d.start_date).getDate() })] })), (0, jsx_runtime_1.jsxs)(material_1.CardContent, Object.assign({ className: classes.content }, { children: [(0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "h3", marginBottom: "10px" }, { children: (_e = state.results[eventIndex]) === null || _e === void 0 ? void 0 : _e.name })), (0, jsx_runtime_1.jsx)(EventInfoDetails_1.default, { event: state.results[eventIndex] }), (0, jsx_runtime_1.jsx)(User_1.default, { user: (_f = state.results[eventIndex]) === null || _f === void 0 ? void 0 : _f.managed_by, elevation: 0, secondary: (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "caption" }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.myEventsWidget.planner", defaultMessage: "ui.myEventsWidget.planner" }) })) }), (0, jsx_runtime_1.jsx)(material_1.Divider, { className: classes.firstDivider }), (0, jsx_runtime_1.jsx)(EventPartecipantsButton_1.default, { event: state.results[eventIndex], eventId: state.results[eventIndex].id }), (0, jsx_runtime_1.jsx)(material_1.Divider, { className: classes.secondDivider })] })), (0, jsx_runtime_1.jsxs)(material_1.CardActions, Object.assign({ className: classes.actions }, { children: [(0, jsx_runtime_1.jsx)(material_1.IconButton, Object.assign({ size: "small", disabled: eventIndex === 0, className: classes.arrows, onClick: handlePrev }, { children: (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "chevron_left" }) })), (0, jsx_runtime_1.jsx)(material_1.Button, Object.assign({ href: scRoutingContext.url(react_core_1.SCRoutes.EVENTS_ROUTE_NAME, {}), className: classes.actionButton }, { children: (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "caption" }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.myEventsWidget.showAll", defaultMessage: "ui.myEventsWidget.showAll" }) })) })), (0, jsx_runtime_1.jsx)(material_1.IconButton, Object.assign({ size: "small", disabled: eventIndex === state.count - 1, className: classes.arrows, onClick: handleNext }, { children: (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "chevron_right" }) }))] }))] })));
128
+ }
129
+ exports.default = MyEventsWidget;
@@ -0,0 +1 @@
1
+ export default function MyEventsWidgetSkeleton(): JSX.Element;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const material_1 = require("@mui/material");
6
+ const Skeleton_1 = tslib_1.__importDefault(require("@mui/material/Skeleton"));
7
+ const styles_1 = require("@mui/material/styles");
8
+ const Widget_1 = tslib_1.__importDefault(require("../Widget"));
9
+ const constants_1 = require("./constants");
10
+ const classes = {
11
+ root: `${constants_1.PREFIX}-skeleton-root`,
12
+ calendar: `${constants_1.PREFIX}-calendar`,
13
+ content: `${constants_1.PREFIX}-content`,
14
+ firstDivider: `${constants_1.PREFIX}-first-divider`,
15
+ secondDivider: `${constants_1.PREFIX}-second-divider`,
16
+ actions: `${constants_1.PREFIX}-actions`
17
+ };
18
+ const Root = (0, styles_1.styled)(Widget_1.default, {
19
+ name: constants_1.PREFIX,
20
+ slot: 'SkeletonRoot'
21
+ })();
22
+ function MyEventsWidgetSkeleton() {
23
+ return ((0, jsx_runtime_1.jsxs)(Root, Object.assign({ className: classes.root }, { children: [(0, jsx_runtime_1.jsx)(material_1.Box, Object.assign({ padding: "12px 16px" }, { children: (0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", width: "141px", height: "23px" }) })), (0, jsx_runtime_1.jsxs)(material_1.Box, Object.assign({ position: "relative" }, { children: [(0, jsx_runtime_1.jsx)(Skeleton_1.default, { variant: "rectangular", animation: "wave", width: "100%", height: "170px" }), (0, jsx_runtime_1.jsx)(Skeleton_1.default, { className: classes.calendar, variant: "rounded", animation: "wave", width: "60px", height: "60px" })] })), (0, jsx_runtime_1.jsxs)(material_1.CardContent, Object.assign({ className: classes.content }, { children: [(0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", width: "26%", height: "30px" }), (0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ direction: "row", alignItems: "center", gap: "8px", marginBottom: "9px" }, { children: [(0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", variant: "circular", width: "21px", height: "21px" }), (0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", width: "229px", height: "20px" })] })), (0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ direction: "row", alignItems: "center", gap: "8px", marginBottom: "9px" }, { children: [(0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", variant: "circular", width: "21px", height: "21px" }), (0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", width: "124px", height: "20px" })] })), (0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ direction: "row", alignItems: "center", gap: "8px", marginBottom: "14px" }, { children: [(0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", variant: "circular", width: "21px", height: "21px" }), (0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", width: "27%", height: "20px" })] })), (0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ direction: "row", gap: "8px", alignItems: "center", height: "57px" }, { children: [(0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", variant: "circular", width: "36px", height: "36px" }), (0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ gap: "1px" }, { children: [(0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", width: "75px", height: "15px" }), (0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", width: "86px", height: "16px" })] }))] })), (0, jsx_runtime_1.jsx)(material_1.Divider, { className: classes.firstDivider }), (0, jsx_runtime_1.jsxs)(material_1.Stack, Object.assign({ direction: "row", gap: "8px", alignItems: "center", height: "44px", marginTop: "8px" }, { children: [(0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", width: "68px", height: "20px" }), (0, jsx_runtime_1.jsxs)(material_1.AvatarGroup, { children: [(0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", variant: "circular", width: "40px", height: "40px" }), (0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", variant: "circular", width: "40px", height: "40px" }), (0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", variant: "circular", width: "40px", height: "40px" }), (0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", variant: "circular", width: "40px", height: "40px" })] })] })), (0, jsx_runtime_1.jsx)(material_1.Divider, { className: classes.secondDivider })] })), (0, jsx_runtime_1.jsxs)(material_1.CardActions, Object.assign({ className: classes.actions }, { children: [(0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", variant: "rounded", width: "14px", height: "14px" }), (0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", width: "52px", height: "20px" }), (0, jsx_runtime_1.jsx)(Skeleton_1.default, { animation: "wave", variant: "rounded", width: "14px", height: "14px" })] }))] })));
24
+ }
25
+ exports.default = MyEventsWidgetSkeleton;
@@ -0,0 +1 @@
1
+ export declare const PREFIX = "SCMyEventsWidget";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PREFIX = void 0;
4
+ exports.PREFIX = 'SCMyEventsWidget';
@@ -0,0 +1,4 @@
1
+ import MyEventsWidget, { MyEventsWidgetProps } from './MyEventsWidget';
2
+ import MyEventsWidgetSkeleton from './Skeleton';
3
+ export default MyEventsWidget;
4
+ export { MyEventsWidgetSkeleton, type MyEventsWidgetProps };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MyEventsWidgetSkeleton = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const MyEventsWidget_1 = tslib_1.__importDefault(require("./MyEventsWidget"));
6
+ const Skeleton_1 = tslib_1.__importDefault(require("./Skeleton"));
7
+ exports.MyEventsWidgetSkeleton = Skeleton_1.default;
8
+ exports.default = MyEventsWidget_1.default;
@@ -70,7 +70,7 @@ function User(inProps) {
70
70
  });
71
71
  const { userId = null, user = null, handleIgnoreAction, className = null, followConnectUserButtonProps = {}, showFollowers = false, elevation, badgeContent = null, actions = null, isGroupAdmin = false, buttonProps = null, secondary = null } = props, rest = tslib_1.__rest(props, ["userId", "user", "handleIgnoreAction", "className", "followConnectUserButtonProps", "showFollowers", "elevation", "badgeContent", "actions", "isGroupAdmin", "buttonProps", "secondary"]);
72
72
  // STATE
73
- const { scUser, setSCUser } = (0, react_core_1.useSCFetchUser)({ id: userId, user });
73
+ const { scUser } = (0, react_core_1.useSCFetchUser)({ id: userId, user });
74
74
  // CONTEXT
75
75
  const scRoutingContext = (0, react_core_1.useSCRouting)();
76
76
  // PREFERENCES