@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.
- package/lib/cjs/components/CreateEventButton/CreateEventButton.js +1 -1
- package/lib/cjs/components/EditEventButton/EditEventButton.d.ts +43 -0
- package/lib/cjs/components/EditEventButton/EditEventButton.js +61 -0
- package/lib/cjs/components/EditEventButton/index.d.ts +3 -0
- package/lib/cjs/components/EditEventButton/index.js +5 -0
- package/lib/cjs/components/EventForm/EventAddress.d.ts +2 -1
- package/lib/cjs/components/EventForm/EventAddress.js +4 -4
- package/lib/cjs/components/EventForm/EventForm.d.ts +6 -0
- package/lib/cjs/components/EventForm/EventForm.js +51 -25
- package/lib/cjs/components/EventForm/UploadEventCover.d.ts +10 -0
- package/lib/cjs/components/EventForm/UploadEventCover.js +34 -7
- package/lib/cjs/components/EventHeader/EventHeader.d.ts +67 -0
- package/lib/cjs/components/EventHeader/EventHeader.js +175 -0
- package/lib/cjs/components/EventHeader/Skeleton.d.ts +25 -0
- package/lib/cjs/components/EventHeader/Skeleton.js +56 -0
- package/lib/cjs/components/EventHeader/constants.d.ts +1 -0
- package/lib/cjs/components/EventHeader/constants.js +4 -0
- package/lib/cjs/components/EventHeader/index.d.ts +4 -0
- package/lib/cjs/components/EventHeader/index.js +8 -0
- package/lib/cjs/components/EventLocationWidget/EventLocationWidget.js +1 -0
- package/lib/cjs/components/EventSubscribeButton/EventSubscribeButton.d.ts +56 -0
- package/lib/cjs/components/EventSubscribeButton/EventSubscribeButton.js +193 -0
- package/lib/cjs/components/EventSubscribeButton/index.d.ts +3 -0
- package/lib/cjs/components/EventSubscribeButton/index.js +5 -0
- package/lib/cjs/components/Events/Events.js +3 -2
- package/lib/cjs/components/FeedObject/FeedObject.js +1 -1
- package/lib/cjs/constants/PubSub.d.ts +5 -1
- package/lib/cjs/index.d.ts +4 -1
- package/lib/cjs/index.js +9 -2
- package/lib/esm/components/CreateEventButton/CreateEventButton.js +1 -1
- package/lib/esm/components/EditEventButton/EditEventButton.d.ts +43 -0
- package/lib/esm/components/EditEventButton/EditEventButton.js +58 -0
- package/lib/esm/components/EditEventButton/index.d.ts +3 -0
- package/lib/esm/components/EditEventButton/index.js +2 -0
- package/lib/esm/components/EventForm/EventAddress.d.ts +2 -1
- package/lib/esm/components/EventForm/EventAddress.js +4 -4
- package/lib/esm/components/EventForm/EventForm.d.ts +6 -0
- package/lib/esm/components/EventForm/EventForm.js +51 -25
- package/lib/esm/components/EventForm/UploadEventCover.d.ts +10 -0
- package/lib/esm/components/EventForm/UploadEventCover.js +34 -7
- package/lib/esm/components/EventHeader/EventHeader.d.ts +67 -0
- package/lib/esm/components/EventHeader/EventHeader.js +172 -0
- package/lib/esm/components/EventHeader/Skeleton.d.ts +25 -0
- package/lib/esm/components/EventHeader/Skeleton.js +53 -0
- package/lib/esm/components/EventHeader/constants.d.ts +1 -0
- package/lib/esm/components/EventHeader/constants.js +1 -0
- package/lib/esm/components/EventHeader/index.d.ts +4 -0
- package/lib/esm/components/EventHeader/index.js +4 -0
- package/lib/esm/components/EventLocationWidget/EventLocationWidget.js +1 -0
- package/lib/esm/components/EventSubscribeButton/EventSubscribeButton.d.ts +56 -0
- package/lib/esm/components/EventSubscribeButton/EventSubscribeButton.js +190 -0
- package/lib/esm/components/EventSubscribeButton/index.d.ts +3 -0
- package/lib/esm/components/EventSubscribeButton/index.js +2 -0
- package/lib/esm/components/Events/Events.js +3 -2
- package/lib/esm/components/FeedObject/FeedObject.js +1 -1
- package/lib/esm/constants/PubSub.d.ts +5 -1
- package/lib/esm/index.d.ts +4 -1
- package/lib/esm/index.js +5 -2
- package/lib/umd/react-ui.js +1 -1
- 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,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;
|
|
@@ -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;
|
|
@@ -76,7 +76,7 @@ function Events(inProps) {
|
|
|
76
76
|
props: inProps,
|
|
77
77
|
name: constants_1.PREFIX
|
|
78
78
|
});
|
|
79
|
-
const { endpointQueryParams = { limit:
|
|
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,
|
|
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
|
+
}
|