@selfcommunity/react-ui 0.7.50-events.38 → 0.7.50-events.40

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 (99) hide show
  1. package/lib/cjs/components/BottomNavigation/BottomNavigation.js +14 -5
  2. package/lib/cjs/components/CreateEventButton/CreateEventButton.js +6 -7
  3. package/lib/cjs/components/EditEventButton/EditEventButton.d.ts +43 -0
  4. package/lib/cjs/components/EditEventButton/EditEventButton.js +61 -0
  5. package/lib/cjs/components/EditEventButton/index.d.ts +3 -0
  6. package/lib/cjs/components/EditEventButton/index.js +5 -0
  7. package/lib/cjs/components/EventForm/EventAddress.d.ts +2 -1
  8. package/lib/cjs/components/EventForm/EventAddress.js +4 -4
  9. package/lib/cjs/components/EventForm/EventForm.d.ts +6 -0
  10. package/lib/cjs/components/EventForm/EventForm.js +51 -25
  11. package/lib/cjs/components/EventForm/UploadEventCover.d.ts +10 -0
  12. package/lib/cjs/components/EventForm/UploadEventCover.js +34 -7
  13. package/lib/cjs/components/EventHeader/EventHeader.d.ts +67 -0
  14. package/lib/cjs/components/EventHeader/EventHeader.js +175 -0
  15. package/lib/cjs/components/EventHeader/Skeleton.d.ts +25 -0
  16. package/lib/cjs/components/EventHeader/Skeleton.js +56 -0
  17. package/lib/cjs/components/EventHeader/constants.d.ts +1 -0
  18. package/lib/cjs/components/EventHeader/constants.js +4 -0
  19. package/lib/cjs/components/EventHeader/index.d.ts +4 -0
  20. package/lib/cjs/components/EventHeader/index.js +8 -0
  21. package/lib/cjs/components/EventInfoWidget/EventInfoWidget.d.ts +24 -0
  22. package/lib/cjs/components/EventInfoWidget/EventInfoWidget.js +74 -0
  23. package/lib/cjs/components/EventInfoWidget/constants.d.ts +1 -0
  24. package/lib/cjs/components/EventInfoWidget/constants.js +4 -0
  25. package/lib/cjs/components/EventInfoWidget/index.d.ts +3 -0
  26. package/lib/cjs/components/EventInfoWidget/index.js +6 -0
  27. package/lib/cjs/components/EventInviteButton/EventInviteButton.js +11 -11
  28. package/lib/cjs/components/EventLocationWidget/EventLocationWidget.js +1 -0
  29. package/lib/cjs/components/EventSubscribeButton/EventSubscribeButton.d.ts +56 -0
  30. package/lib/cjs/components/EventSubscribeButton/EventSubscribeButton.js +193 -0
  31. package/lib/cjs/components/EventSubscribeButton/index.d.ts +3 -0
  32. package/lib/cjs/components/EventSubscribeButton/index.js +5 -0
  33. package/lib/cjs/components/Events/Events.js +12 -11
  34. package/lib/cjs/components/FeedObject/FeedObject.js +1 -1
  35. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.d.ts +2 -0
  36. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.js +9 -1
  37. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +12 -2
  38. package/lib/cjs/components/User/User.d.ts +2 -1
  39. package/lib/cjs/components/User/User.js +9 -9
  40. package/lib/cjs/constants/PubSub.d.ts +5 -1
  41. package/lib/cjs/index.d.ts +104 -100
  42. package/lib/cjs/index.js +270 -260
  43. package/lib/cjs/shared/Bullet/index.js +1 -2
  44. package/lib/cjs/shared/Calendar/index.d.ts +1 -2
  45. package/lib/cjs/shared/Calendar/index.js +3 -5
  46. package/lib/cjs/shared/EventInfoDetails/index.d.ts +6 -0
  47. package/lib/cjs/shared/EventInfoDetails/index.js +67 -0
  48. package/lib/esm/components/BottomNavigation/BottomNavigation.js +14 -5
  49. package/lib/esm/components/CreateEventButton/CreateEventButton.js +6 -7
  50. package/lib/esm/components/EditEventButton/EditEventButton.d.ts +43 -0
  51. package/lib/esm/components/EditEventButton/EditEventButton.js +58 -0
  52. package/lib/esm/components/EditEventButton/index.d.ts +3 -0
  53. package/lib/esm/components/EditEventButton/index.js +2 -0
  54. package/lib/esm/components/EventForm/EventAddress.d.ts +2 -1
  55. package/lib/esm/components/EventForm/EventAddress.js +4 -4
  56. package/lib/esm/components/EventForm/EventForm.d.ts +6 -0
  57. package/lib/esm/components/EventForm/EventForm.js +51 -25
  58. package/lib/esm/components/EventForm/UploadEventCover.d.ts +10 -0
  59. package/lib/esm/components/EventForm/UploadEventCover.js +34 -7
  60. package/lib/esm/components/EventHeader/EventHeader.d.ts +67 -0
  61. package/lib/esm/components/EventHeader/EventHeader.js +172 -0
  62. package/lib/esm/components/EventHeader/Skeleton.d.ts +25 -0
  63. package/lib/esm/components/EventHeader/Skeleton.js +53 -0
  64. package/lib/esm/components/EventHeader/constants.d.ts +1 -0
  65. package/lib/esm/components/EventHeader/constants.js +1 -0
  66. package/lib/esm/components/EventHeader/index.d.ts +4 -0
  67. package/lib/esm/components/EventHeader/index.js +4 -0
  68. package/lib/esm/components/EventInfoWidget/EventInfoWidget.d.ts +24 -0
  69. package/lib/esm/components/EventInfoWidget/EventInfoWidget.js +71 -0
  70. package/lib/esm/components/EventInfoWidget/constants.d.ts +1 -0
  71. package/lib/esm/components/EventInfoWidget/constants.js +1 -0
  72. package/lib/esm/components/EventInfoWidget/index.d.ts +3 -0
  73. package/lib/esm/components/EventInfoWidget/index.js +3 -0
  74. package/lib/esm/components/EventInviteButton/EventInviteButton.js +11 -11
  75. package/lib/esm/components/EventLocationWidget/EventLocationWidget.js +1 -0
  76. package/lib/esm/components/EventSubscribeButton/EventSubscribeButton.d.ts +56 -0
  77. package/lib/esm/components/EventSubscribeButton/EventSubscribeButton.js +190 -0
  78. package/lib/esm/components/EventSubscribeButton/index.d.ts +3 -0
  79. package/lib/esm/components/EventSubscribeButton/index.js +2 -0
  80. package/lib/esm/components/Events/Events.js +12 -11
  81. package/lib/esm/components/FeedObject/FeedObject.js +1 -1
  82. package/lib/esm/components/NavigationToolbar/NavigationToolbar.d.ts +2 -0
  83. package/lib/esm/components/NavigationToolbar/NavigationToolbar.js +9 -1
  84. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +13 -3
  85. package/lib/esm/components/User/User.d.ts +2 -1
  86. package/lib/esm/components/User/User.js +9 -9
  87. package/lib/esm/constants/PubSub.d.ts +5 -1
  88. package/lib/esm/index.d.ts +104 -100
  89. package/lib/esm/index.js +109 -105
  90. package/lib/esm/shared/Bullet/index.js +0 -1
  91. package/lib/esm/shared/Calendar/index.d.ts +1 -2
  92. package/lib/esm/shared/Calendar/index.js +0 -1
  93. package/lib/esm/shared/EventInfoDetails/index.d.ts +6 -0
  94. package/lib/esm/shared/EventInfoDetails/index.js +64 -0
  95. package/lib/umd/84.js +2 -0
  96. package/lib/umd/react-ui.js +1 -1
  97. package/package.json +8 -7
  98. package/lib/umd/204.js +0 -2
  99. /package/lib/umd/{204.js.LICENSE.txt → 84.js.LICENSE.txt} +0 -0
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importStar(require("react"));
5
+ const styles_1 = require("@mui/material/styles");
6
+ const utils_1 = require("@selfcommunity/utils");
7
+ const react_core_1 = require("@selfcommunity/react-core");
8
+ const types_1 = require("@selfcommunity/types");
9
+ const react_intl_1 = require("react-intl");
10
+ const classnames_1 = tslib_1.__importDefault(require("classnames"));
11
+ const system_1 = require("@mui/system");
12
+ const Errors_1 = require("../../constants/Errors");
13
+ const material_1 = require("@mui/material");
14
+ const lab_1 = require("@mui/lab");
15
+ const PREFIX = 'SCEventSubscribeButton';
16
+ const classes = {
17
+ requestRoot: `${PREFIX}-request-root`,
18
+ selectRoot: `${PREFIX}-select-root`,
19
+ drawerRoot: `${PREFIX}-drawer-root`,
20
+ menuRoot: `${PREFIX}-menu-root`,
21
+ paper: `${PREFIX}-paper`,
22
+ item: `${PREFIX}-item`,
23
+ going: `${PREFIX}-going`,
24
+ notGoing: `${PREFIX}-not-going`
25
+ };
26
+ const options = [
27
+ {
28
+ value: types_1.SCEventSubscriptionStatusType.GOING,
29
+ label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventSubscribeButton.going", defaultMessage: "ui.eventSubscribeButton.going" })
30
+ },
31
+ {
32
+ value: types_1.SCEventSubscriptionStatusType.NOT_GOING,
33
+ label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventSubscribeButton.notGoing", defaultMessage: "ui.eventSubscribeButton.notGoing" })
34
+ }
35
+ ];
36
+ const RequestRoot = (0, styles_1.styled)(lab_1.LoadingButton, {
37
+ name: PREFIX,
38
+ slot: 'RequestRoot'
39
+ })(() => ({}));
40
+ const SelectRoot = (0, styles_1.styled)(material_1.Button, {
41
+ name: PREFIX,
42
+ slot: 'SelectRoot'
43
+ })(() => ({}));
44
+ const SwipeableDrawerRoot = (0, styles_1.styled)(material_1.SwipeableDrawer, {
45
+ name: PREFIX,
46
+ slot: 'DrawerRoot'
47
+ })(() => ({}));
48
+ const MenuRoot = (0, styles_1.styled)(material_1.Menu, {
49
+ name: PREFIX,
50
+ slot: 'MenuRoot'
51
+ })(() => ({}));
52
+ /**
53
+ * > API documentation for the Community-JS Event Subscribe Button component. Learn about the available props and the CSS API.
54
+
55
+ #### Import
56
+
57
+ ```jsx
58
+ import {EventSubscribeButton} from '@selfcommunity/react-ui';
59
+ ```
60
+
61
+ #### Component Name
62
+
63
+ The name `SCEventSubscribeButton` can be used when providing style overrides in the theme.
64
+
65
+
66
+ #### CSS
67
+
68
+ |Rule Name|Global class|Description|
69
+ |---|---|---|
70
+ |root|.SCEventSubscribeButton-root|Styles applied to the root element.|
71
+
72
+ * @param inProps
73
+ */
74
+ function EventSubscribeButton(inProps) {
75
+ var _a;
76
+ // PROPS
77
+ const props = (0, system_1.useThemeProps)({
78
+ props: inProps,
79
+ name: PREFIX
80
+ });
81
+ const { className, eventId, event, user, onSubscribe } = props, rest = tslib_1.__rest(props, ["className", "eventId", "event", "user", "onSubscribe"]);
82
+ // STATE
83
+ const [status, setStatus] = (0, react_1.useState)(null);
84
+ const [anchorEl, setAnchorEl] = react_1.default.useState(null);
85
+ const open = Boolean(anchorEl);
86
+ // CONTEXT
87
+ const scContext = (0, react_core_1.useSCContext)();
88
+ const scUserContext = (0, react_core_1.useSCUser)();
89
+ const scEventsManager = scUserContext.managers.events;
90
+ const theme = (0, material_1.useTheme)();
91
+ const isMobile = (0, material_1.useMediaQuery)(theme.breakpoints.down('md'));
92
+ // CONST
93
+ const authUserId = scUserContext.user ? scUserContext.user.id : null;
94
+ const { scEvent } = (0, react_core_1.useSCFetchEvent)({
95
+ id: eventId,
96
+ event,
97
+ cacheStrategy: authUserId ? utils_1.CacheStrategies.CACHE_FIRST : utils_1.CacheStrategies.STALE_WHILE_REVALIDATE
98
+ });
99
+ const isEventAdmin = (0, react_1.useMemo)(() => { var _a; return scUserContext.user && ((_a = scEvent === null || scEvent === void 0 ? void 0 : scEvent.managed_by) === null || _a === void 0 ? void 0 : _a.id) === scUserContext.user.id; }, [scUserContext.user, (_a = scEvent === null || scEvent === void 0 ? void 0 : scEvent.managed_by) === null || _a === void 0 ? void 0 : _a.id]);
100
+ // HANDLERS
101
+ const handleOpen = (event) => {
102
+ setAnchorEl(event.currentTarget);
103
+ };
104
+ const handleClose = () => {
105
+ setAnchorEl(null);
106
+ };
107
+ (0, react_1.useEffect)(() => {
108
+ /**
109
+ * Call scEventsManager.subscriptionStatus inside an effect
110
+ * to avoid warning rendering child during update parent state
111
+ */
112
+ if (authUserId) {
113
+ setStatus(scEventsManager === null || scEventsManager === void 0 ? void 0 : scEventsManager.subscriptionStatus(scEvent));
114
+ }
115
+ }, [authUserId, scEventsManager === null || scEventsManager === void 0 ? void 0 : scEventsManager.subscriptionStatus, scEvent]);
116
+ const toggleGoingToEvent = (user) => {
117
+ scEventsManager
118
+ .toggleEventAttendance(scEvent, user === null || user === void 0 ? void 0 : user.id)
119
+ .then(() => {
120
+ const _status = scEvent.privacy === types_1.SCEventPrivacyType.PRIVATE && scEvent.subscription_status !== types_1.SCEventSubscriptionStatusType.INVITED
121
+ ? types_1.SCEventSubscriptionStatusType.REQUESTED
122
+ : scEvent.subscription_status === types_1.SCEventSubscriptionStatusType.GOING
123
+ ? types_1.SCEventSubscriptionStatusType.SUBSCRIBED
124
+ : types_1.SCEventSubscriptionStatusType.GOING;
125
+ onSubscribe && onSubscribe(scEvent, _status);
126
+ })
127
+ .catch((e) => {
128
+ utils_1.Logger.error(Errors_1.SCOPE_SC_UI, e);
129
+ });
130
+ };
131
+ const toggleNotGoingToEvent = () => {
132
+ scEventsManager
133
+ .toggleEventNonattendance(scEvent)
134
+ .then(() => {
135
+ const _status = scEvent.subscription_status === types_1.SCEventSubscriptionStatusType.NOT_GOING
136
+ ? types_1.SCEventSubscriptionStatusType.SUBSCRIBED
137
+ : types_1.SCEventSubscriptionStatusType.NOT_GOING;
138
+ onSubscribe && onSubscribe(scEvent, _status);
139
+ })
140
+ .catch((e) => {
141
+ utils_1.Logger.error(Errors_1.SCOPE_SC_UI, e);
142
+ });
143
+ };
144
+ const handleToggleAction = (event) => {
145
+ const _status = event.target.value;
146
+ setAnchorEl(null);
147
+ if (!scUserContext.user) {
148
+ scContext.settings.handleAnonymousAction();
149
+ }
150
+ else {
151
+ (_status === types_1.SCEventSubscriptionStatusType.NOT_GOING && !(user === null || user === void 0 ? void 0 : user.id)) || (!_status && (user === null || user === void 0 ? void 0 : user.id)) ? toggleNotGoingToEvent() : toggleGoingToEvent();
152
+ }
153
+ };
154
+ function renderMenuItems() {
155
+ return (react_1.default.createElement(material_1.Box, null, options.map((option) => (react_1.default.createElement(material_1.MenuItem, { key: option.value, className: classes.item },
156
+ option.label,
157
+ react_1.default.createElement(material_1.Checkbox, { size: "small", checked: status === option.value, value: option.value, onChange: handleToggleAction, name: `${option.value}-option`, inputProps: { 'aria-label': `${option.label}` } }))))));
158
+ }
159
+ /**
160
+ * Get current translated status
161
+ */
162
+ const getStatus = (0, react_1.useMemo)(() => {
163
+ let _status;
164
+ switch (status) {
165
+ case types_1.SCEventSubscriptionStatusType.REQUESTED:
166
+ _status = react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.eventSubscribeButton.waitingApproval", id: "ui.eventSubscribeButton.waitingApproval" });
167
+ break;
168
+ case types_1.SCEventSubscriptionStatusType.GOING:
169
+ _status = react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.eventSubscribeButton.going", id: "ui.eventSubscribeButton.going" });
170
+ break;
171
+ case types_1.SCEventSubscriptionStatusType.INVITED:
172
+ _status = react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.eventSubscribeButton.accept", id: "ui.eventSubscribeButton.accept" });
173
+ break;
174
+ case types_1.SCEventSubscriptionStatusType.NOT_GOING:
175
+ _status = react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.eventSubscribeButton.notGoing", id: "ui.eventSubscribeButton.notGoing" });
176
+ break;
177
+ default:
178
+ (scEvent === null || scEvent === void 0 ? void 0 : scEvent.privacy) === types_1.SCEventPrivacyType.PUBLIC
179
+ ? (_status = react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.eventSubscribeButton.label", id: "ui.eventSubscribeButton.label" }))
180
+ : (_status = (react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.eventSubscribeButton.requestParticipation", id: "ui.eventSubscribeButton.requestParticipation" })));
181
+ break;
182
+ }
183
+ return _status;
184
+ }, [status, scEvent]);
185
+ if (!scEvent || (isEventAdmin && (user === null || user === void 0 ? void 0 : user.id) === scUserContext.user.id) || (isEventAdmin && !(user === null || user === void 0 ? void 0 : user.id))) {
186
+ return null;
187
+ }
188
+ return (react_1.default.createElement(react_1.default.Fragment, null, (scEvent === null || scEvent === void 0 ? void 0 : scEvent.privacy) !== types_1.SCEventPrivacyType.PRIVATE ? (react_1.default.createElement(react_1.default.Fragment, null,
189
+ react_1.default.createElement(SelectRoot, Object.assign({ className: (0, classnames_1.default)(classes.selectRoot, className, { [classes.going]: status && status === types_1.SCEventSubscriptionStatusType.GOING }, { [classes.notGoing]: status && status === types_1.SCEventSubscriptionStatusType.NOT_GOING }), onClick: handleOpen, endIcon: react_1.default.createElement(material_1.Icon, null, open ? 'expand_less' : 'expand_more'), startIcon: status &&
190
+ status !== types_1.SCEventSubscriptionStatusType.SUBSCRIBED && (react_1.default.createElement(material_1.Icon, null, status === types_1.SCEventSubscriptionStatusType.GOING ? 'circle_checked' : 'circle_closed')) }, rest), getStatus),
191
+ isMobile ? (react_1.default.createElement(SwipeableDrawerRoot, { className: classes.drawerRoot, PaperProps: { className: classes.paper }, open: open, onClose: handleClose, onOpen: handleOpen, anchor: "bottom", disableSwipeToOpen: true }, renderMenuItems())) : (react_1.default.createElement(MenuRoot, { className: classes.menuRoot, anchorEl: anchorEl, open: open, onClose: handleClose }, renderMenuItems())))) : (react_1.default.createElement(RequestRoot, Object.assign({ className: (0, classnames_1.default)(classes.requestRoot, className), variant: "outlined", size: "small", loading: scUserContext.user ? scEventsManager.isLoading(scEvent) : null, disabled: status === types_1.SCEventSubscriptionStatusType.REQUESTED }, rest), getStatus))));
192
+ }
193
+ exports.default = EventSubscribeButton;
@@ -0,0 +1,3 @@
1
+ import EventSubscribeButton, { EventSubscribeButtonProps } from './EventSubscribeButton';
2
+ export default EventSubscribeButton;
3
+ export { EventSubscribeButtonProps };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const EventSubscribeButton_1 = tslib_1.__importDefault(require("./EventSubscribeButton"));
5
+ exports.default = EventSubscribeButton_1.default;
@@ -1,23 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
- const react_1 = tslib_1.__importStar(require("react"));
5
- const styles_1 = require("@mui/material/styles");
6
4
  const material_1 = require("@mui/material");
5
+ const styles_1 = require("@mui/material/styles");
6
+ const system_1 = require("@mui/system");
7
7
  const api_services_1 = require("@selfcommunity/api-services");
8
8
  const react_core_1 = require("@selfcommunity/react-core");
9
9
  const types_1 = require("@selfcommunity/types");
10
- const Event_1 = tslib_1.__importStar(require("../Event"));
11
- const react_intl_1 = require("react-intl");
10
+ const utils_1 = require("@selfcommunity/utils");
12
11
  const classnames_1 = tslib_1.__importDefault(require("classnames"));
13
- const system_1 = require("@mui/system");
12
+ const react_1 = tslib_1.__importStar(require("react"));
13
+ const react_intl_1 = require("react-intl");
14
14
  const Errors_1 = require("../../constants/Errors");
15
- const utils_1 = require("@selfcommunity/utils");
16
- const HiddenPlaceholder_1 = tslib_1.__importDefault(require("../../shared/HiddenPlaceholder"));
17
- const constants_1 = require("./constants");
18
- const Skeleton_1 = tslib_1.__importDefault(require("../Events/Skeleton"));
19
15
  const Pagination_1 = require("../../constants/Pagination");
16
+ const HiddenPlaceholder_1 = tslib_1.__importDefault(require("../../shared/HiddenPlaceholder"));
20
17
  const CreateEventButton_1 = tslib_1.__importDefault(require("../CreateEventButton"));
18
+ const Event_1 = tslib_1.__importStar(require("../Event"));
19
+ const Skeleton_1 = tslib_1.__importDefault(require("../Events/Skeleton"));
20
+ const constants_1 = require("./constants");
21
21
  const classes = {
22
22
  root: `${constants_1.PREFIX}-root`,
23
23
  filters: `${constants_1.PREFIX}-filters`,
@@ -76,7 +76,7 @@ function Events(inProps) {
76
76
  props: inProps,
77
77
  name: constants_1.PREFIX
78
78
  });
79
- const { endpointQueryParams = { limit: 8, offset: Pagination_1.DEFAULT_PAGINATION_OFFSET }, className, EventComponentProps = {}, showFilters = false, filters, general = true } = props, rest = tslib_1.__rest(props, ["endpointQueryParams", "className", "EventComponentProps", "showFilters", "filters", "general"]);
79
+ const { endpointQueryParams = { limit: 8, offset: Pagination_1.DEFAULT_PAGINATION_OFFSET }, className, EventComponentProps = {}, showFilters = false, filters, general = false } = props, rest = tslib_1.__rest(props, ["endpointQueryParams", "className", "EventComponentProps", "showFilters", "filters", "general"]);
80
80
  // STATE
81
81
  const [events, setEvents] = (0, react_1.useState)([]);
82
82
  const [loading, setLoading] = (0, react_1.useState)(true);
@@ -213,7 +213,8 @@ function Events(inProps) {
213
213
  filteredEvents.map((event) => (react_1.default.createElement(material_1.Grid, { item: true, xs: 12, sm: 8, md: 6, key: event.id, className: classes.item },
214
214
  react_1.default.createElement(Event_1.default, Object.assign({ event: event, eventId: event.id }, EventComponentProps))))),
215
215
  filteredEvents.length <= 3 && (react_1.default.createElement(material_1.Grid, { item: true, xs: 12, sm: 8, md: 6, key: 'skeleton-item', className: classes.itemSkeleton },
216
- react_1.default.createElement(Event_1.EventSkeleton, { action: react_1.default.createElement(CreateEventButton_1.default, null) }))))),
216
+ react_1.default.createElement(Event_1.EventSkeleton, { action: react_1.default.createElement(CreateEventButton_1.default, { variant: "outlined", color: "primary", size: "small" },
217
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.events.skeleton.action.add", defaultMessage: "ui.events.skeleton.action.add" })) }))))),
217
218
  Boolean(next) && (react_1.default.createElement(material_1.Button, { color: "secondary", variant: "text", onClick: handleNext, className: classes.showMore },
218
219
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.events.button.seeMore", defaultMessage: "ui.events.button.seeMore" }))))))));
219
220
  /**
@@ -440,7 +440,7 @@ function FeedObject(inProps) {
440
440
  obj.group && (react_1.default.createElement("div", { className: classes.group },
441
441
  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 }))),
442
442
  obj.event && (react_1.default.createElement("div", { className: classes.event },
443
- react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.event.id, icon: react_1.default.createElement(Icon_1.default, null, "CalendarIcon"), component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.EVENT_ROUTE_NAME, obj.event), clickable: true })))),
443
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.event.id, label: obj.event.name, icon: react_1.default.createElement(Icon_1.default, null, "CalendarIcon"), component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.EVENT_ROUTE_NAME, obj.event), clickable: true })))),
444
444
  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 },
445
445
  react_1.default.createElement(material_1.Typography, { variant: "overline" }, c.name)))))),
446
446
  obj.group && !obj.categories.length && (react_1.default.createElement("div", { className: classes.group },
@@ -85,6 +85,8 @@ export interface NavigationToolbarProps extends ToolbarProps {
85
85
  |navigation|.SCNavigationToolbar-navigation|Styles applied to the navigation container element|
86
86
  |home|.SCNavigationToolbar-home|Styles applied to the home button|
87
87
  |explore|.SCNavigationToolbar-explore|Styles applied to the explore button|
88
+ |groups|.SCNavigationToolbar-groups|Styles applied to the group button|
89
+ |events|.SCNavigationToolbar-events|Styles applied to the event button|
88
90
  |search|.SCNavigationToolbar-search|Styles applied to the search component|
89
91
  |composer|.SCNavigationToolbar-composer|Styles applied to the composer component|
90
92
  |profile|.SCNavigationToolbar-profile|Styles applied to the profile button|
@@ -24,6 +24,7 @@ const classes = {
24
24
  navigation: `${constants_1.PREFIX}-navigation`,
25
25
  home: `${constants_1.PREFIX}-home`,
26
26
  explore: `${constants_1.PREFIX}-explore`,
27
+ events: `${constants_1.PREFIX}-events`,
27
28
  groups: `${constants_1.PREFIX}-groups`,
28
29
  search: `${constants_1.PREFIX}-search`,
29
30
  composer: `${constants_1.PREFIX}-composer`,
@@ -76,6 +77,8 @@ const PREFERENCES = [
76
77
  |navigation|.SCNavigationToolbar-navigation|Styles applied to the navigation container element|
77
78
  |home|.SCNavigationToolbar-home|Styles applied to the home button|
78
79
  |explore|.SCNavigationToolbar-explore|Styles applied to the explore button|
80
+ |groups|.SCNavigationToolbar-groups|Styles applied to the group button|
81
+ |events|.SCNavigationToolbar-events|Styles applied to the event button|
79
82
  |search|.SCNavigationToolbar-search|Styles applied to the search component|
80
83
  |composer|.SCNavigationToolbar-composer|Styles applied to the composer component|
81
84
  |profile|.SCNavigationToolbar-profile|Styles applied to the profile button|
@@ -107,6 +110,7 @@ function NavigationToolbar(inProps) {
107
110
  }, [scPreferences.preferences]);
108
111
  const privateMessagingEnabled = (0, react_1.useMemo)(() => scPreferences.features.includes(types_1.SCFeatureName.PRIVATE_MESSAGING), [scPreferences.features]);
109
112
  const groupsEnabled = (0, react_1.useMemo)(() => scPreferences.features && scPreferences.features.includes(types_1.SCFeatureName.GROUPING) && scPreferences.features.includes(types_1.SCFeatureName.TAGGING), [scPreferences.features]);
113
+ const eventsEnabled = (0, react_1.useMemo)(() => scPreferences.features && scPreferences.features.includes(types_1.SCFeatureName.EVENT) && scPreferences.features.includes(types_1.SCFeatureName.TAGGING), [scPreferences.features]);
110
114
  const showComposer = (0, react_1.useMemo)(() => {
111
115
  return (!disableComposer &&
112
116
  (!scPreferences.preferences[react_core_1.SCPreferences.CONFIGURATIONS_POST_ONLY_STAFF_ENABLED].value || react_core_1.UserUtils.isStaff(scUserContext.user)));
@@ -136,7 +140,11 @@ function NavigationToolbar(inProps) {
136
140
  [classes.active]: value.startsWith(scRoutingContext.url(react_core_1.SCRoutes.GROUPS_SUBSCRIBED_ROUTE_NAME, {})) ||
137
141
  value.startsWith(scRoutingContext.url(react_core_1.SCRoutes.GROUPS_ROUTE_NAME, {}))
138
142
  }), "aria-label": "Groups", to: scRoutingContext.url(react_core_1.SCRoutes.GROUPS_SUBSCRIBED_ROUTE_NAME, {}), component: react_core_1.Link },
139
- react_1.default.createElement(Icon_1.default, null, "groups")))));
143
+ react_1.default.createElement(Icon_1.default, null, "groups"))),
144
+ eventsEnabled && scUserContext.user && (react_1.default.createElement(material_1.IconButton, { className: (0, classnames_1.default)(classes.events, {
145
+ [classes.active]: value.startsWith(scRoutingContext.url(react_core_1.SCRoutes.EVENT_ROUTE_NAME, {}))
146
+ }), "aria-label": "Groups", to: scRoutingContext.url(react_core_1.SCRoutes.EVENTS_ROUTE_NAME, {}), component: react_core_1.Link },
147
+ react_1.default.createElement(Icon_1.default, null, "CalendarIcon")))));
140
148
  return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(className, classes.root) }, rest),
141
149
  react_1.default.createElement(NavigationMenuIconButtonComponent, null),
142
150
  react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.HOME_ROUTE_NAME, {}), className: classes.logo },
@@ -14,6 +14,7 @@ const NavigationSettingsIconButton_1 = tslib_1.__importDefault(require("../Navig
14
14
  const NavigationMenuIconButton_1 = tslib_1.__importDefault(require("../NavigationMenuIconButton"));
15
15
  const constants_1 = require("./constants");
16
16
  const types_1 = require("@selfcommunity/types");
17
+ const ComposerIconButton_1 = tslib_1.__importDefault(require("../ComposerIconButton"));
17
18
  const classes = {
18
19
  root: `${constants_1.PREFIX}-root`,
19
20
  logo: `${constants_1.PREFIX}-logo`,
@@ -79,6 +80,10 @@ function NavigationToolbarMobile(inProps) {
79
80
  const [searchOpen, setSearchOpen] = (0, react_1.useState)(false);
80
81
  // MEMO
81
82
  const groupsEnabled = (0, react_1.useMemo)(() => features && features.includes(types_1.SCFeatureName.GROUPING) && features.includes(types_1.SCFeatureName.TAGGING), [features]);
83
+ const eventsEnabled = (0, react_1.useMemo)(() => features && features.includes(types_1.SCFeatureName.EVENT) && features.includes(types_1.SCFeatureName.TAGGING), [features]);
84
+ const exploreStreamEnabled = preferences[react_core_1.SCPreferences.CONFIGURATIONS_EXPLORE_STREAM_ENABLED].value;
85
+ const postOnlyStaffEnabled = preferences[react_core_1.SCPreferences.CONFIGURATIONS_POST_ONLY_STAFF_ENABLED].value;
86
+ const contentAvailable = preferences[react_core_1.SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY].value;
82
87
  // HANDLERS
83
88
  const handleOpenSearch = (0, react_1.useCallback)(() => {
84
89
  setSearchOpen(true);
@@ -100,12 +105,17 @@ function NavigationToolbarMobile(inProps) {
100
105
  return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(className, classes.root) }, rest),
101
106
  _children,
102
107
  startActions,
103
- (preferences[react_core_1.SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY].value || scUserContext.user) && !disableSearch && (react_1.default.createElement(react_1.default.Fragment, null,
108
+ (contentAvailable || scUserContext.user) && !disableSearch && (react_1.default.createElement(react_1.default.Fragment, null,
104
109
  react_1.default.createElement(material_1.IconButton, { className: classes.search, onClick: handleOpenSearch },
105
110
  react_1.default.createElement(Icon_1.default, null, "search")),
106
111
  react_1.default.createElement(SearchDialog_1.default, { className: classes.searchDialog, fullScreen: true, open: searchOpen, SearchAutocompleteProps: Object.assign(Object.assign({}, SearchAutocompleteProps), { onClear: handleCloseSearch }) }))),
107
112
  endActions,
108
- scUserContext.user && groupsEnabled && (react_1.default.createElement(material_1.IconButton, { className: classes.notifications, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_NOTIFICATIONS_ROUTE_NAME, {}) },
113
+ (!postOnlyStaffEnabled || (react_core_1.UserUtils.isStaff(scUserContext.user) && postOnlyStaffEnabled)) &&
114
+ groupsEnabled &&
115
+ eventsEnabled &&
116
+ (scUserContext.user || contentAvailable) &&
117
+ exploreStreamEnabled && react_1.default.createElement(ComposerIconButton_1.default, null),
118
+ scUserContext.user && (groupsEnabled || eventsEnabled) && (react_1.default.createElement(material_1.IconButton, { className: classes.notifications, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_NOTIFICATIONS_ROUTE_NAME, {}) },
109
119
  react_1.default.createElement(material_1.Badge, { badgeContent: scUserContext.user.unseen_notification_banners_counter + scUserContext.user.unseen_interactions_counter, color: "secondary" },
110
120
  react_1.default.createElement(Icon_1.default, null, "notifications_active")))),
111
121
  scUserContext.user ? (react_1.default.createElement(NavigationSettingsIconButtonComponent, { className: classes.settings })) : (react_1.default.createElement(material_1.Button, { className: classes.login, color: "inherit", component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.SIGNIN_ROUTE_NAME, {}) },
@@ -1,6 +1,6 @@
1
- import React from 'react';
2
1
  import { ButtonBaseProps } from '@mui/material';
3
2
  import { SCUserType } from '@selfcommunity/types';
3
+ import React, { ReactNode } from 'react';
4
4
  import { FollowUserButtonProps } from '../FollowUserButton/FollowUserButton';
5
5
  import { FriendshipButtonProps } from '../FriendshipUserButton/FriendshipUserButton';
6
6
  import { WidgetProps } from '../Widget';
@@ -49,6 +49,7 @@ export interface UserProps extends WidgetProps {
49
49
  * @default {}
50
50
  */
51
51
  buttonProps?: ButtonBaseProps | null;
52
+ secondary?: ReactNode | null;
52
53
  /**
53
54
  * Any other properties
54
55
  */
@@ -1,19 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
- const react_1 = tslib_1.__importStar(require("react"));
5
- const styles_1 = require("@mui/material/styles");
6
- const Skeleton_1 = tslib_1.__importDefault(require("./Skeleton"));
7
4
  const material_1 = require("@mui/material");
5
+ const styles_1 = require("@mui/material/styles");
6
+ const system_1 = require("@mui/system");
8
7
  const react_core_1 = require("@selfcommunity/react-core");
9
- const react_intl_1 = require("react-intl");
10
8
  const classnames_1 = tslib_1.__importDefault(require("classnames"));
11
- const ConnectionUserButton_1 = tslib_1.__importDefault(require("../ConnectionUserButton"));
12
- const system_1 = require("@mui/system");
9
+ const react_1 = tslib_1.__importStar(require("react"));
10
+ const react_intl_1 = require("react-intl");
13
11
  const BaseItemButton_1 = tslib_1.__importDefault(require("../../shared/BaseItemButton"));
14
- const UserDeletedSnackBar_1 = tslib_1.__importDefault(require("../../shared/UserDeletedSnackBar"));
15
12
  const UserAvatar_1 = tslib_1.__importDefault(require("../../shared/UserAvatar"));
13
+ const UserDeletedSnackBar_1 = tslib_1.__importDefault(require("../../shared/UserDeletedSnackBar"));
14
+ const ConnectionUserButton_1 = tslib_1.__importDefault(require("../ConnectionUserButton"));
16
15
  const constants_1 = require("./constants");
16
+ const Skeleton_1 = tslib_1.__importDefault(require("./Skeleton"));
17
17
  const messages = (0, react_intl_1.defineMessages)({
18
18
  userFollowers: {
19
19
  id: 'ui.user.userFollowers',
@@ -67,7 +67,7 @@ function User(inProps) {
67
67
  props: inProps,
68
68
  name: constants_1.PREFIX
69
69
  });
70
- const { userId = null, user = null, handleIgnoreAction, className = null, followConnectUserButtonProps = {}, showFollowers = false, elevation, badgeContent = null, actions = null, isGroupAdmin = false, buttonProps = null } = props, rest = tslib_1.__rest(props, ["userId", "user", "handleIgnoreAction", "className", "followConnectUserButtonProps", "showFollowers", "elevation", "badgeContent", "actions", "isGroupAdmin", "buttonProps"]);
70
+ 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"]);
71
71
  // STATE
72
72
  const { scUser, setSCUser } = (0, react_core_1.useSCFetchUser)({ id: userId, user });
73
73
  // CONTEXT
@@ -109,7 +109,7 @@ function User(inProps) {
109
109
  react_1.default.createElement(material_1.Avatar, { alt: scUser.username, src: scUser.avatar, className: classes.avatar }))) : (react_1.default.createElement(UserAvatar_1.default, { hide: !hasBadge },
110
110
  react_1.default.createElement(material_1.Avatar, { alt: scUser.username, src: scUser.avatar, className: classes.avatar }))), primary: (hasBadge && preferences) || isGroupAdmin ? (react_1.default.createElement(react_1.default.Fragment, null,
111
111
  scUser.username,
112
- react_1.default.createElement(material_1.Chip, { component: "span", className: isGroupAdmin ? classes.groupAdminBadgeLabel : classes.staffBadgeLabel, size: "small", label: isGroupAdmin ? (react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.user.group.admin", id: "ui.user.group.admin" })) : (preferences[react_core_1.SCPreferences.STAFF_STAFF_BADGE_LABEL]) }))) : (scUser.username), secondary: showFollowers ? `${intl.formatMessage(messages.userFollowers, { total: scUser.followers_counter })}` : scUser.description, actions: actions !== null && actions !== void 0 ? actions : renderAuthenticatedActions() })),
112
+ react_1.default.createElement(material_1.Chip, { component: "span", className: isGroupAdmin ? classes.groupAdminBadgeLabel : classes.staffBadgeLabel, size: "small", label: isGroupAdmin ? (react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.user.group.admin", id: "ui.user.group.admin" })) : (preferences[react_core_1.SCPreferences.STAFF_STAFF_BADGE_LABEL]) }))) : (scUser.username), secondary: secondary || (showFollowers ? `${intl.formatMessage(messages.userFollowers, { total: scUser.followers_counter })}` : scUser.description), actions: actions !== null && actions !== void 0 ? actions : renderAuthenticatedActions() })),
113
113
  openAlert && react_1.default.createElement(UserDeletedSnackBar_1.default, { open: openAlert, handleClose: () => setOpenAlert(false) })));
114
114
  }
115
115
  exports.default = User;
@@ -1,4 +1,4 @@
1
- import { SCUserType, SCGroupType } from '@selfcommunity/types';
1
+ import { SCUserType, SCGroupType, SCEventType } from '@selfcommunity/types';
2
2
  /**
3
3
  * Define topics for pubsub
4
4
  */
@@ -21,3 +21,7 @@ export interface SCGroupMembersEventType {
21
21
  group: SCGroupType;
22
22
  user?: SCUserType;
23
23
  }
24
+ export interface SCEventMembersEventType {
25
+ event: SCEventType;
26
+ user?: SCUserType;
27
+ }