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

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 (60) hide show
  1. package/lib/cjs/components/CreateEventButton/CreateEventButton.js +1 -1
  2. package/lib/cjs/components/EditEventButton/EditEventButton.d.ts +43 -0
  3. package/lib/cjs/components/EditEventButton/EditEventButton.js +61 -0
  4. package/lib/cjs/components/EditEventButton/index.d.ts +3 -0
  5. package/lib/cjs/components/EditEventButton/index.js +5 -0
  6. package/lib/cjs/components/EventForm/EventAddress.d.ts +2 -1
  7. package/lib/cjs/components/EventForm/EventAddress.js +4 -4
  8. package/lib/cjs/components/EventForm/EventForm.d.ts +6 -0
  9. package/lib/cjs/components/EventForm/EventForm.js +51 -25
  10. package/lib/cjs/components/EventForm/UploadEventCover.d.ts +10 -0
  11. package/lib/cjs/components/EventForm/UploadEventCover.js +34 -7
  12. package/lib/cjs/components/EventHeader/EventHeader.d.ts +67 -0
  13. package/lib/cjs/components/EventHeader/EventHeader.js +175 -0
  14. package/lib/cjs/components/EventHeader/Skeleton.d.ts +25 -0
  15. package/lib/cjs/components/EventHeader/Skeleton.js +56 -0
  16. package/lib/cjs/components/EventHeader/constants.d.ts +1 -0
  17. package/lib/cjs/components/EventHeader/constants.js +4 -0
  18. package/lib/cjs/components/EventHeader/index.d.ts +4 -0
  19. package/lib/cjs/components/EventHeader/index.js +8 -0
  20. package/lib/cjs/components/EventLocationWidget/EventLocationWidget.js +1 -0
  21. package/lib/cjs/components/EventSubscribeButton/EventSubscribeButton.d.ts +56 -0
  22. package/lib/cjs/components/EventSubscribeButton/EventSubscribeButton.js +193 -0
  23. package/lib/cjs/components/EventSubscribeButton/index.d.ts +3 -0
  24. package/lib/cjs/components/EventSubscribeButton/index.js +5 -0
  25. package/lib/cjs/components/Events/Events.js +3 -2
  26. package/lib/cjs/components/FeedObject/FeedObject.js +1 -1
  27. package/lib/cjs/constants/PubSub.d.ts +5 -1
  28. package/lib/cjs/index.d.ts +4 -1
  29. package/lib/cjs/index.js +9 -2
  30. package/lib/esm/components/CreateEventButton/CreateEventButton.js +1 -1
  31. package/lib/esm/components/EditEventButton/EditEventButton.d.ts +43 -0
  32. package/lib/esm/components/EditEventButton/EditEventButton.js +58 -0
  33. package/lib/esm/components/EditEventButton/index.d.ts +3 -0
  34. package/lib/esm/components/EditEventButton/index.js +2 -0
  35. package/lib/esm/components/EventForm/EventAddress.d.ts +2 -1
  36. package/lib/esm/components/EventForm/EventAddress.js +4 -4
  37. package/lib/esm/components/EventForm/EventForm.d.ts +6 -0
  38. package/lib/esm/components/EventForm/EventForm.js +51 -25
  39. package/lib/esm/components/EventForm/UploadEventCover.d.ts +10 -0
  40. package/lib/esm/components/EventForm/UploadEventCover.js +34 -7
  41. package/lib/esm/components/EventHeader/EventHeader.d.ts +67 -0
  42. package/lib/esm/components/EventHeader/EventHeader.js +172 -0
  43. package/lib/esm/components/EventHeader/Skeleton.d.ts +25 -0
  44. package/lib/esm/components/EventHeader/Skeleton.js +53 -0
  45. package/lib/esm/components/EventHeader/constants.d.ts +1 -0
  46. package/lib/esm/components/EventHeader/constants.js +1 -0
  47. package/lib/esm/components/EventHeader/index.d.ts +4 -0
  48. package/lib/esm/components/EventHeader/index.js +4 -0
  49. package/lib/esm/components/EventLocationWidget/EventLocationWidget.js +1 -0
  50. package/lib/esm/components/EventSubscribeButton/EventSubscribeButton.d.ts +56 -0
  51. package/lib/esm/components/EventSubscribeButton/EventSubscribeButton.js +190 -0
  52. package/lib/esm/components/EventSubscribeButton/index.d.ts +3 -0
  53. package/lib/esm/components/EventSubscribeButton/index.js +2 -0
  54. package/lib/esm/components/Events/Events.js +3 -2
  55. package/lib/esm/components/FeedObject/FeedObject.js +1 -1
  56. package/lib/esm/constants/PubSub.d.ts +5 -1
  57. package/lib/esm/index.d.ts +4 -1
  58. package/lib/esm/index.js +5 -2
  59. package/lib/umd/react-ui.js +1 -1
  60. package/package.json +7 -7
@@ -0,0 +1,175 @@
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 material_1 = require("@mui/material");
7
+ const types_1 = require("@selfcommunity/types");
8
+ const react_core_1 = require("@selfcommunity/react-core");
9
+ const Skeleton_1 = tslib_1.__importDefault(require("./Skeleton"));
10
+ const classnames_1 = tslib_1.__importDefault(require("classnames"));
11
+ const system_1 = require("@mui/system");
12
+ const constants_1 = require("./constants");
13
+ const react_intl_1 = require("react-intl");
14
+ const Bullet_1 = tslib_1.__importDefault(require("../../shared/Bullet"));
15
+ const EventSubscribeButton_1 = tslib_1.__importDefault(require("../EventSubscribeButton"));
16
+ const EventInviteButton_1 = tslib_1.__importDefault(require("../EventInviteButton"));
17
+ const PubSub_1 = require("../../constants/PubSub");
18
+ const pubsub_js_1 = tslib_1.__importDefault(require("pubsub-js"));
19
+ const EditEventButton_1 = tslib_1.__importDefault(require("../EditEventButton"));
20
+ const User_1 = tslib_1.__importDefault(require("../User"));
21
+ const Calendar_1 = tslib_1.__importDefault(require("../../shared/Calendar"));
22
+ const classes = {
23
+ root: `${constants_1.PREFIX}-root`,
24
+ cover: `${constants_1.PREFIX}-cover`,
25
+ time: `${constants_1.PREFIX}-time`,
26
+ calendar: `${constants_1.PREFIX}-calendar`,
27
+ info: `${constants_1.PREFIX}-info`,
28
+ name: `${constants_1.PREFIX}-name`,
29
+ visibility: `${constants_1.PREFIX}-visibility`,
30
+ visibilityItem: `${constants_1.PREFIX}-visibility-item`,
31
+ multiActions: `${constants_1.PREFIX}-multi-actions`
32
+ };
33
+ const Root = (0, styles_1.styled)(material_1.Box, {
34
+ name: constants_1.PREFIX,
35
+ slot: 'Root'
36
+ })(() => ({}));
37
+ /**
38
+ * > API documentation for the Community-JS Event Header component. Learn about the available props and the CSS API.
39
+ *
40
+ *
41
+ * This component renders the events top section.
42
+
43
+ #### Import
44
+
45
+ ```jsx
46
+ import {UserProfileHeader} from '@selfcommunity/react-ui';
47
+ ```
48
+
49
+ #### Component Name
50
+
51
+ The name `SCEventHeader` can be used when providing style overrides in the theme.
52
+
53
+
54
+ #### CSS
55
+
56
+ |Rule Name|Global class|Description|
57
+ |---|---|---|
58
+ |root|.SCEventHeader-root|Styles applied to the root element.|
59
+ |cover|.SCEventHeader-cover|Styles applied to the cover element.|
60
+ |time|.SCEventHeader-time|Styles applied to the time element.|
61
+ |calendar|.SCEventHeader-calendar|Styles applied to the calendar element.|
62
+ |info|SCEventHeader-info|Styles applied to the info section.|
63
+ |name|SCEventHeader-username|Styles applied to the username element.|
64
+ |visibility|SCEventHeader-visibility|Styles applied to the visibility section.|
65
+ |visibilityItem|SCEventHeader-visibility-item|Styles applied to the visibility element.|
66
+ |multiActions|SCEventHeader-multi-action|Styles applied to the multi actions section.|
67
+
68
+ * @param inProps
69
+ */
70
+ function EventHeader(inProps) {
71
+ var _a, _b;
72
+ // PROPS
73
+ const props = (0, system_1.useThemeProps)({
74
+ props: inProps,
75
+ name: constants_1.PREFIX
76
+ });
77
+ const { id = null, className = null, event, eventId = null, EventSubscribeButtonProps = {} } = props, rest = tslib_1.__rest(props, ["id", "className", "event", "eventId", "EventSubscribeButtonProps"]);
78
+ // PREFERENCES
79
+ const scPreferences = (0, react_core_1.useSCPreferences)();
80
+ // CONTEXT
81
+ const scUserContext = (0, react_core_1.useSCUser)();
82
+ // HOOKS
83
+ const { scEvent, setSCEvent } = (0, react_core_1.useSCFetchEvent)({ id: eventId, event });
84
+ // INTL
85
+ const intl = (0, react_intl_1.useIntl)();
86
+ // REFS
87
+ const updatesSubscription = (0, react_1.useRef)(null);
88
+ // CONST
89
+ 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]);
90
+ /**
91
+ * Subscriber for pubsub callback
92
+ */
93
+ const onChangeEventMembersHandler = (0, react_1.useCallback)((msg, data) => {
94
+ var _a;
95
+ if (data && ((_a = data === null || data === void 0 ? void 0 : data.event) === null || _a === void 0 ? void 0 : _a.id) === (scEvent === null || scEvent === void 0 ? void 0 : scEvent.id)) {
96
+ let _event = Object.assign({}, scEvent);
97
+ if (msg === `${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCGroupEventType.ADD_MEMBER}`) {
98
+ _event.subscribers_counter = _event.subscribers_counter + 1;
99
+ }
100
+ else if (msg === `${PubSub_1.SCTopicType.GROUP}.${PubSub_1.SCGroupEventType.REMOVE_MEMBER}`) {
101
+ _event.subscribers_counter = Math.max(_event.subscribers_counter - 1, 0);
102
+ }
103
+ setSCEvent(_event);
104
+ }
105
+ }, [scEvent, setSCEvent]);
106
+ /**
107
+ * On mount, subscribe to receive events updates (only edit)
108
+ */
109
+ (0, react_1.useEffect)(() => {
110
+ if (scEvent) {
111
+ updatesSubscription.current = pubsub_js_1.default.subscribe(`${PubSub_1.SCTopicType.EVENT}.${PubSub_1.SCGroupEventType.MEMBERS}`, onChangeEventMembersHandler);
112
+ }
113
+ return () => {
114
+ updatesSubscription.current && pubsub_js_1.default.unsubscribe(updatesSubscription.current);
115
+ };
116
+ }, [scEvent]);
117
+ // RENDER
118
+ if (!scEvent) {
119
+ return react_1.default.createElement(Skeleton_1.default, null);
120
+ }
121
+ const _backgroundCover = Object.assign({}, (scEvent.image_bigger
122
+ ? { background: `url('${scEvent.image_bigger}') center / cover` }
123
+ : { background: `url('${scPreferences.preferences[react_core_1.SCPreferences.IMAGES_USER_DEFAULT_COVER].value}') center / cover` }));
124
+ return (react_1.default.createElement(Root, Object.assign({ id: id, className: (0, classnames_1.default)(classes.root, className) }, rest),
125
+ react_1.default.createElement(material_1.Paper, { style: _backgroundCover, classes: { root: classes.cover } },
126
+ react_1.default.createElement(material_1.Box, { className: classes.calendar },
127
+ react_1.default.createElement(Calendar_1.default, { day: new Date(scEvent.start_date).getDate() }))),
128
+ react_1.default.createElement(material_1.Box, { className: classes.info },
129
+ react_1.default.createElement(material_1.Typography, { className: classes.time }, scEvent.end_date && scEvent.end_date !== scEvent.start_date ? (new Date(scEvent.start_date).getDate() !== new Date(scEvent.end_date).getDate() ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventHeader.startEndTimeDiff", defaultMessage: "ui.eventHeader.startEndTimeDiff", values: {
130
+ startDate: intl.formatDate(scEvent.start_date, {
131
+ weekday: 'long',
132
+ day: 'numeric',
133
+ year: 'numeric',
134
+ month: 'long'
135
+ }),
136
+ endDate: intl.formatDate(scEvent.end_date, {
137
+ weekday: 'long',
138
+ day: 'numeric',
139
+ year: 'numeric',
140
+ month: 'long'
141
+ }),
142
+ startTime: intl.formatDate(scEvent.start_date, { hour: 'numeric', minute: 'numeric' }),
143
+ endTime: intl.formatDate(scEvent.end_date, { hour: 'numeric', minute: 'numeric' })
144
+ } })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventHeader.startEndTime", defaultMessage: "ui.eventHeader.startEndTime", values: {
145
+ date: intl.formatDate(scEvent.start_date, {
146
+ weekday: 'long',
147
+ day: 'numeric',
148
+ year: 'numeric',
149
+ month: 'long'
150
+ }),
151
+ start: intl.formatDate(scEvent.start_date, { hour: 'numeric', minute: 'numeric' }),
152
+ end: intl.formatDate(scEvent.end_date, { hour: 'numeric', minute: 'numeric' })
153
+ } }))) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventHeader.dateTime", defaultMessage: "ui.eventHeader.dateTime", values: {
154
+ date: intl.formatDate(scEvent.start_date, {
155
+ weekday: 'long',
156
+ day: 'numeric',
157
+ year: 'numeric',
158
+ month: 'long'
159
+ }),
160
+ hour: intl.formatDate(scEvent.start_date, { hour: 'numeric', minute: 'numeric' })
161
+ } }))),
162
+ react_1.default.createElement(material_1.Typography, { variant: "h5", className: classes.name }, scEvent.name),
163
+ react_1.default.createElement(material_1.Box, { className: classes.visibility },
164
+ react_1.default.createElement(react_1.default.Fragment, null, scEvent.privacy === types_1.SCEventPrivacyType.PUBLIC ? (react_1.default.createElement(material_1.Typography, { className: classes.visibilityItem },
165
+ react_1.default.createElement(material_1.Icon, null, "public"),
166
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventHeader.visibility.public", defaultMessage: "ui.eventHeader.visibility.public" }))) : (react_1.default.createElement(material_1.Typography, { className: classes.visibilityItem },
167
+ react_1.default.createElement(material_1.Icon, null, "private"),
168
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventHeader.visibility.private", defaultMessage: "ui.eventHeader.visibility.private" })))),
169
+ react_1.default.createElement(Bullet_1.default, null),
170
+ react_1.default.createElement(material_1.Typography, { className: classes.visibilityItem }, scEvent.location === types_1.SCEventLocationType.PERSON ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventHeader.location.live", defaultMessage: "ui.eventHeader.location.live" })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventHeader.location.live", defaultMessage: "ui.eventHeader.location.online" })))),
171
+ react_1.default.createElement(User_1.default, { userId: (_b = scEvent === null || scEvent === void 0 ? void 0 : scEvent.managed_by) === null || _b === void 0 ? void 0 : _b.id, elevation: 0, actions: react_1.default.createElement(react_1.default.Fragment, null, isEventAdmin ? (react_1.default.createElement(material_1.Box, { className: classes.multiActions },
172
+ react_1.default.createElement(EventInviteButton_1.default, { size: "small", event: scEvent, eventId: scEvent.id }),
173
+ react_1.default.createElement(EditEventButton_1.default, { size: "small", event: scEvent, eventId: scEvent.id, onEditSuccess: (data) => setSCEvent(data) }))) : (react_1.default.createElement(EventSubscribeButton_1.default, Object.assign({ event: scEvent }, EventSubscribeButtonProps)))) }))));
174
+ }
175
+ exports.default = EventHeader;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * > API documentation for the Community-JS Event Header Skeleton component. Learn about the available props and the CSS API.
3
+
4
+ #### Import
5
+
6
+ ```jsx
7
+ import {EventHeaderSkeleton} from '@selfcommunity/react-ui';
8
+ ```
9
+
10
+ #### Component Name
11
+
12
+ The name `SCEventHeader-skeleton-root` can be used when providing style overrides in the theme.
13
+
14
+ #### CSS
15
+
16
+ |Rule Name|Global class|Description|
17
+ |---|---|---|
18
+ |root|.SCEventHeader-skeleton-root|Styles applied to the root element.|
19
+ |avatar|.SCEventHeader-avatar|Styles applied to the avatar element.|
20
+ |cover|.SCEventHeader-cover|Styles applied to the cover element.|
21
+ |info|.SCEventHeader-info|Styles applied to the info info.|
22
+ *
23
+ */
24
+ declare function EventHeaderSkeleton(): JSX.Element;
25
+ export default EventHeaderSkeleton;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importDefault(require("react"));
5
+ const material_1 = require("@mui/material");
6
+ const styles_1 = require("@mui/material/styles");
7
+ const Skeleton_1 = tslib_1.__importDefault(require("@mui/material/Skeleton"));
8
+ const constants_1 = require("./constants");
9
+ const classes = {
10
+ root: `${constants_1.PREFIX}-skeleton-root`,
11
+ cover: `${constants_1.PREFIX}-cover`,
12
+ avatar: `${constants_1.PREFIX}-avatar`,
13
+ info: `${constants_1.PREFIX}-info`
14
+ };
15
+ const Root = (0, styles_1.styled)(material_1.Box, {
16
+ name: constants_1.PREFIX,
17
+ slot: 'SkeletonRoot'
18
+ })(() => ({}));
19
+ /**
20
+ * > API documentation for the Community-JS Event Header Skeleton component. Learn about the available props and the CSS API.
21
+
22
+ #### Import
23
+
24
+ ```jsx
25
+ import {EventHeaderSkeleton} from '@selfcommunity/react-ui';
26
+ ```
27
+
28
+ #### Component Name
29
+
30
+ The name `SCEventHeader-skeleton-root` can be used when providing style overrides in the theme.
31
+
32
+ #### CSS
33
+
34
+ |Rule Name|Global class|Description|
35
+ |---|---|---|
36
+ |root|.SCEventHeader-skeleton-root|Styles applied to the root element.|
37
+ |avatar|.SCEventHeader-avatar|Styles applied to the avatar element.|
38
+ |cover|.SCEventHeader-cover|Styles applied to the cover element.|
39
+ |info|.SCEventHeader-info|Styles applied to the info info.|
40
+ *
41
+ */
42
+ function EventHeaderSkeleton() {
43
+ const theme = (0, material_1.useTheme)();
44
+ return (react_1.default.createElement(Root, { className: classes.root },
45
+ react_1.default.createElement(Skeleton_1.default, { className: classes.cover, animation: "wave", variant: "rectangular" }),
46
+ react_1.default.createElement(material_1.Box, { className: classes.avatar },
47
+ react_1.default.createElement(Skeleton_1.default, { animation: "wave", variant: "rectangular", width: theme.selfcommunity.group.avatar.sizeLarge, height: theme.selfcommunity.group.avatar.sizeLarge })),
48
+ react_1.default.createElement(material_1.Box, { className: classes.info },
49
+ react_1.default.createElement(material_1.Typography, { variant: "h5", mb: 1 },
50
+ react_1.default.createElement(Skeleton_1.default, { animation: "wave", variant: "rectangular", sx: { height: 20, width: '50%' } })),
51
+ react_1.default.createElement(material_1.Typography, { mb: 1 },
52
+ react_1.default.createElement(Skeleton_1.default, { animation: "wave", variant: "rectangular", sx: { height: 30, width: '30%' } })),
53
+ react_1.default.createElement(material_1.Typography, null,
54
+ react_1.default.createElement(Skeleton_1.default, { animation: "wave", variant: "rectangular", sx: { height: 15, width: '20%' } })))));
55
+ }
56
+ exports.default = EventHeaderSkeleton;
@@ -0,0 +1 @@
1
+ export declare const PREFIX = "SCEventHeader";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PREFIX = void 0;
4
+ exports.PREFIX = 'SCEventHeader';
@@ -0,0 +1,4 @@
1
+ import EventHeader, { EventHeaderProps } from './EventHeader';
2
+ import EventHeaderSkeleton from './Skeleton';
3
+ export default EventHeader;
4
+ export { EventHeaderProps, EventHeaderSkeleton };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventHeaderSkeleton = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const EventHeader_1 = tslib_1.__importDefault(require("./EventHeader"));
6
+ const Skeleton_1 = tslib_1.__importDefault(require("./Skeleton"));
7
+ exports.EventHeaderSkeleton = Skeleton_1.default;
8
+ exports.default = EventHeader_1.default;
@@ -78,6 +78,7 @@ function EventLocationWidget(inProps) {
78
78
  /**
79
79
  * Loading event
80
80
  */
81
+ console.log(isLoaded, scEvent);
81
82
  if (!isLoaded || !scEvent) {
82
83
  return react_1.default.createElement(Skeleton_1.default, null);
83
84
  }
@@ -0,0 +1,56 @@
1
+ import { SCEventType, SCUserType } from '@selfcommunity/types';
2
+ export interface EventSubscribeButtonProps {
3
+ /**
4
+ * Overrides or extends the styles applied to the component.
5
+ * @default null
6
+ */
7
+ className?: string;
8
+ /**
9
+ * Event Object
10
+ * @default null
11
+ */
12
+ event?: SCEventType;
13
+ /**
14
+ * Id of the event
15
+ * @default null
16
+ */
17
+ eventId?: number;
18
+ /**
19
+ * The user to be accepted into the event
20
+ * @default null
21
+ */
22
+ user?: SCUserType;
23
+ /**
24
+ * onSubscribe callback
25
+ * @param user
26
+ * @param joined
27
+ */
28
+ onSubscribe?: (event: SCEventType, status: string | null) => any;
29
+ /**
30
+ * Others properties
31
+ */
32
+ [p: string]: any;
33
+ }
34
+ /**
35
+ * > API documentation for the Community-JS Event Subscribe Button component. Learn about the available props and the CSS API.
36
+
37
+ #### Import
38
+
39
+ ```jsx
40
+ import {EventSubscribeButton} from '@selfcommunity/react-ui';
41
+ ```
42
+
43
+ #### Component Name
44
+
45
+ The name `SCEventSubscribeButton` can be used when providing style overrides in the theme.
46
+
47
+
48
+ #### CSS
49
+
50
+ |Rule Name|Global class|Description|
51
+ |---|---|---|
52
+ |root|.SCEventSubscribeButton-root|Styles applied to the root element.|
53
+
54
+ * @param inProps
55
+ */
56
+ export default function EventSubscribeButton(inProps: EventSubscribeButtonProps): JSX.Element;
@@ -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;
@@ -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: 2, 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"]);
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 },
@@ -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
+ }