@selfcommunity/react-ui 0.7.50-events.60 → 0.7.50-events.63
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/Event/Event.d.ts +6 -0
- package/lib/cjs/components/Event/Event.js +4 -4
- package/lib/cjs/components/EventMembersWidget/EventMembersWidget.d.ts +44 -0
- package/lib/cjs/components/EventMembersWidget/EventMembersWidget.js +150 -0
- package/lib/cjs/components/EventMembersWidget/Skeleton.d.ts +2 -0
- package/lib/cjs/components/EventMembersWidget/Skeleton.js +29 -0
- package/lib/cjs/components/EventMembersWidget/constants.d.ts +1 -0
- package/lib/cjs/components/EventMembersWidget/constants.js +4 -0
- package/lib/cjs/components/EventMembersWidget/index.d.ts +4 -0
- package/lib/cjs/components/EventMembersWidget/index.js +8 -0
- package/lib/cjs/components/{EventPartecipantsButton/EventPartecipantsButton.d.ts → EventParticipantsButton/EventParticipantsButton.d.ts} +13 -8
- package/lib/cjs/components/{EventPartecipantsButton/EventPartecipantsButton.js → EventParticipantsButton/EventParticipantsButton.js} +12 -12
- package/lib/cjs/components/EventParticipantsButton/index.d.ts +3 -0
- package/lib/cjs/components/EventParticipantsButton/index.js +5 -0
- package/lib/cjs/components/InviteEventButton/InviteEventButton.d.ts +60 -0
- package/lib/cjs/components/InviteEventButton/InviteEventButton.js +82 -0
- package/lib/cjs/components/InviteEventButton/index.d.ts +3 -0
- package/lib/cjs/components/InviteEventButton/index.js +5 -0
- package/lib/cjs/components/RelatedEventsWidget/RelatedEventsWidget.d.ts +44 -0
- package/lib/cjs/components/RelatedEventsWidget/RelatedEventsWidget.js +125 -0
- package/lib/cjs/components/RelatedEventsWidget/Skeleton.d.ts +2 -0
- package/lib/cjs/components/RelatedEventsWidget/Skeleton.js +28 -0
- package/lib/cjs/components/RelatedEventsWidget/constants.d.ts +1 -0
- package/lib/cjs/components/RelatedEventsWidget/constants.js +4 -0
- package/lib/cjs/components/RelatedEventsWidget/index.d.ts +4 -0
- package/lib/cjs/components/RelatedEventsWidget/index.js +8 -0
- package/lib/cjs/components/SuggestedEventsWidget/Arrow.js +2 -2
- package/lib/cjs/components/SuggestedEventsWidget/SuggestedEventsWidget.js +18 -11
- package/lib/cjs/index.d.ts +6 -3
- package/lib/cjs/index.js +21 -12
- package/lib/esm/components/Event/Event.d.ts +6 -0
- package/lib/esm/components/Event/Event.js +4 -4
- package/lib/esm/components/EventMembersWidget/EventMembersWidget.d.ts +44 -0
- package/lib/esm/components/EventMembersWidget/EventMembersWidget.js +147 -0
- package/lib/esm/components/EventMembersWidget/Skeleton.d.ts +2 -0
- package/lib/esm/components/EventMembersWidget/Skeleton.js +25 -0
- package/lib/esm/components/EventMembersWidget/constants.d.ts +1 -0
- package/lib/esm/components/EventMembersWidget/constants.js +1 -0
- package/lib/esm/components/EventMembersWidget/index.d.ts +4 -0
- package/lib/esm/components/EventMembersWidget/index.js +4 -0
- package/lib/esm/components/{EventPartecipantsButton/EventPartecipantsButton.d.ts → EventParticipantsButton/EventParticipantsButton.d.ts} +13 -8
- package/lib/esm/components/{EventPartecipantsButton/EventPartecipantsButton.js → EventParticipantsButton/EventParticipantsButton.js} +11 -11
- package/lib/esm/components/EventParticipantsButton/index.d.ts +3 -0
- package/lib/esm/components/EventParticipantsButton/index.js +2 -0
- package/lib/esm/components/InviteEventButton/InviteEventButton.d.ts +60 -0
- package/lib/esm/components/InviteEventButton/InviteEventButton.js +79 -0
- package/lib/esm/components/InviteEventButton/index.d.ts +3 -0
- package/lib/esm/components/InviteEventButton/index.js +2 -0
- package/lib/esm/components/RelatedEventsWidget/RelatedEventsWidget.d.ts +44 -0
- package/lib/esm/components/RelatedEventsWidget/RelatedEventsWidget.js +122 -0
- package/lib/esm/components/RelatedEventsWidget/Skeleton.d.ts +2 -0
- package/lib/esm/components/RelatedEventsWidget/Skeleton.js +24 -0
- package/lib/esm/components/RelatedEventsWidget/constants.d.ts +1 -0
- package/lib/esm/components/RelatedEventsWidget/constants.js +1 -0
- package/lib/esm/components/RelatedEventsWidget/index.d.ts +4 -0
- package/lib/esm/components/RelatedEventsWidget/index.js +4 -0
- package/lib/esm/components/SuggestedEventsWidget/Arrow.js +3 -3
- package/lib/esm/components/SuggestedEventsWidget/SuggestedEventsWidget.js +19 -12
- package/lib/esm/index.d.ts +6 -3
- package/lib/esm/index.js +8 -5
- package/lib/umd/{401.js → 224.js} +2 -2
- package/lib/umd/react-ui.js +1 -1
- package/package.json +7 -7
- package/lib/cjs/components/EventPartecipantsButton/index.d.ts +0 -3
- package/lib/cjs/components/EventPartecipantsButton/index.js +0 -5
- package/lib/esm/components/EventPartecipantsButton/index.d.ts +0 -3
- package/lib/esm/components/EventPartecipantsButton/index.js +0 -2
- /package/lib/umd/{401.js.LICENSE.txt → 224.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { SCEventType } from '@selfcommunity/types';
|
|
2
|
+
import { CacheStrategies } from '@selfcommunity/utils';
|
|
3
|
+
import 'swiper/css';
|
|
4
|
+
import { BaseDialogProps } from '../../shared/BaseDialog';
|
|
5
|
+
import { UserProps } from '../User';
|
|
6
|
+
import { WidgetProps } from '../Widget';
|
|
7
|
+
export interface EventMembersWidgetProps extends WidgetProps {
|
|
8
|
+
/**
|
|
9
|
+
* Event Object
|
|
10
|
+
* @default null
|
|
11
|
+
*/
|
|
12
|
+
event?: SCEventType;
|
|
13
|
+
/**
|
|
14
|
+
* Id of event object
|
|
15
|
+
* @default null
|
|
16
|
+
*/
|
|
17
|
+
eventId?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Props to spread to single user object
|
|
20
|
+
* @default empty object
|
|
21
|
+
*/
|
|
22
|
+
userProps?: UserProps;
|
|
23
|
+
/**
|
|
24
|
+
* Feed API Query Params
|
|
25
|
+
* @default [{'limit': 20, 'offset': 0}]
|
|
26
|
+
*/
|
|
27
|
+
endpointQueryParams?: Record<string, string | number>;
|
|
28
|
+
/**
|
|
29
|
+
* Caching strategies
|
|
30
|
+
* @default CacheStrategies.CACHE_FIRST
|
|
31
|
+
*/
|
|
32
|
+
cacheStrategy?: CacheStrategies;
|
|
33
|
+
/**
|
|
34
|
+
* Props to spread to users suggestion dialog
|
|
35
|
+
* @default {}
|
|
36
|
+
*/
|
|
37
|
+
dialogProps?: BaseDialogProps;
|
|
38
|
+
limit?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Other props
|
|
41
|
+
*/
|
|
42
|
+
[p: string]: any;
|
|
43
|
+
}
|
|
44
|
+
export default function EventMembersWidget(inProps: EventMembersWidgetProps): JSX.Element;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { __rest } from "tslib";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { TabContext, TabList, TabPanel } from '@mui/lab';
|
|
4
|
+
import { Box, Button, CardActions, CardContent, List, ListItem, Stack, Tab, Typography, useThemeProps } from '@mui/material';
|
|
5
|
+
import { styled } from '@mui/system';
|
|
6
|
+
import { Endpoints, EventService, http } from '@selfcommunity/api-services';
|
|
7
|
+
import { SCCache, useSCFetchEvent, useSCUser } from '@selfcommunity/react-core';
|
|
8
|
+
import { Logger } from '@selfcommunity/utils';
|
|
9
|
+
import { useCallback, useEffect, useMemo, useReducer, useState } from 'react';
|
|
10
|
+
import { FormattedMessage } from 'react-intl';
|
|
11
|
+
import 'swiper/css';
|
|
12
|
+
import { SCOPE_SC_UI } from '../../constants/Errors';
|
|
13
|
+
import { DEFAULT_PAGINATION_LIMIT, DEFAULT_PAGINATION_OFFSET } from '../../constants/Pagination';
|
|
14
|
+
import BaseDialog from '../../shared/BaseDialog';
|
|
15
|
+
import HiddenPlaceholder from '../../shared/HiddenPlaceholder';
|
|
16
|
+
import InfiniteScroll from '../../shared/InfiniteScroll';
|
|
17
|
+
import { actionWidgetTypes, dataWidgetReducer, stateWidgetInitializer } from '../../utils/widget';
|
|
18
|
+
import InviteEventButton from '../InviteEventButton';
|
|
19
|
+
import User, { UserSkeleton } from '../User';
|
|
20
|
+
import Widget from '../Widget';
|
|
21
|
+
import { PREFIX } from './constants';
|
|
22
|
+
import Skeleton from './Skeleton';
|
|
23
|
+
const classes = {
|
|
24
|
+
root: `${PREFIX}-root`,
|
|
25
|
+
content: `${PREFIX}-content`,
|
|
26
|
+
title: `${PREFIX}-title`,
|
|
27
|
+
tabsWrapper: `${PREFIX}-tabs-wrapper`,
|
|
28
|
+
tabLabelWrapper: `${PREFIX}-tab-label-wrapper`,
|
|
29
|
+
tabPanel: `${PREFIX}-tab-panel`,
|
|
30
|
+
actions: `${PREFIX}-actions`,
|
|
31
|
+
actionButton: `${PREFIX}-action-button`,
|
|
32
|
+
dialogRoot: `${PREFIX}-dialog-root`,
|
|
33
|
+
infiniteScroll: `${PREFIX}-infinite-scroll`,
|
|
34
|
+
endMessage: `${PREFIX}-end-message`
|
|
35
|
+
};
|
|
36
|
+
const Root = styled(Widget, {
|
|
37
|
+
name: PREFIX,
|
|
38
|
+
slot: 'Root',
|
|
39
|
+
overridesResolver: (_props, styles) => styles.root
|
|
40
|
+
})();
|
|
41
|
+
const DialogRoot = styled(BaseDialog, {
|
|
42
|
+
name: PREFIX,
|
|
43
|
+
slot: 'DialogRoot',
|
|
44
|
+
overridesResolver: (_props, styles) => styles.dialogRoot
|
|
45
|
+
})();
|
|
46
|
+
export default function EventMembersWidget(inProps) {
|
|
47
|
+
// PROPS
|
|
48
|
+
const props = useThemeProps({
|
|
49
|
+
props: inProps,
|
|
50
|
+
name: PREFIX
|
|
51
|
+
});
|
|
52
|
+
const { event, eventId, userProps = {}, endpointQueryParams = { limit: DEFAULT_PAGINATION_LIMIT, offset: DEFAULT_PAGINATION_OFFSET }, cacheStrategy, dialogProps, limit } = props, rest = __rest(props, ["event", "eventId", "userProps", "endpointQueryParams", "cacheStrategy", "dialogProps", "limit"]);
|
|
53
|
+
// STATE
|
|
54
|
+
const [participants, dispatchParticipants] = useReducer(dataWidgetReducer, {
|
|
55
|
+
isLoadingNext: false,
|
|
56
|
+
next: null,
|
|
57
|
+
cacheKey: SCCache.getWidgetStateCacheKey(SCCache.USER_PARTECIPANTS_EVENTS_STATE_CACHE_PREFIX_KEY, eventId || event.id),
|
|
58
|
+
cacheStrategy,
|
|
59
|
+
visibleItems: limit
|
|
60
|
+
}, stateWidgetInitializer);
|
|
61
|
+
const [invited, dispatchInvited] = useReducer(dataWidgetReducer, {
|
|
62
|
+
isLoadingNext: false,
|
|
63
|
+
next: null,
|
|
64
|
+
cacheKey: SCCache.getWidgetStateCacheKey(SCCache.USER_INVITED_EVENTS_STATE_CACHE_PREFIX_KEY, eventId || event.id),
|
|
65
|
+
cacheStrategy,
|
|
66
|
+
visibleItems: DEFAULT_PAGINATION_LIMIT
|
|
67
|
+
}, stateWidgetInitializer);
|
|
68
|
+
const [openDialog, setOpenDialog] = useState(false);
|
|
69
|
+
const [invitedNumber, setInvitedNumber] = useState(0);
|
|
70
|
+
const [tabValue, setTabValue] = useState('1');
|
|
71
|
+
const state = useMemo(() => (tabValue === '1' ? participants : invited), [tabValue, participants, invited]);
|
|
72
|
+
const dispatch = useCallback((value) => (tabValue === '1' ? dispatchParticipants(value) : dispatchInvited(value)), [tabValue, dispatchParticipants, dispatchInvited]);
|
|
73
|
+
// CONTEXT
|
|
74
|
+
const scUserContext = useSCUser();
|
|
75
|
+
// HOOKS
|
|
76
|
+
const { scEvent } = useSCFetchEvent({ id: eventId, event });
|
|
77
|
+
const _initParticipants = useCallback(() => {
|
|
78
|
+
if (!participants.initialized && !participants.isLoadingNext) {
|
|
79
|
+
dispatchParticipants({ type: actionWidgetTypes.LOADING_NEXT });
|
|
80
|
+
EventService.getUsersGoingToEvent(scEvent.id, Object.assign({}, endpointQueryParams))
|
|
81
|
+
.then((payload) => {
|
|
82
|
+
dispatchParticipants({ type: actionWidgetTypes.LOAD_NEXT_SUCCESS, payload: Object.assign(Object.assign({}, payload), { initialized: true }) });
|
|
83
|
+
})
|
|
84
|
+
.catch((error) => {
|
|
85
|
+
dispatchParticipants({ type: actionWidgetTypes.LOAD_NEXT_FAILURE, payload: { errorLoadNext: error } });
|
|
86
|
+
Logger.error(SCOPE_SC_UI, error);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}, [participants.isLoadingNext, participants.initialized, dispatchParticipants, scEvent]);
|
|
90
|
+
const _initInvited = useCallback(() => {
|
|
91
|
+
var _a;
|
|
92
|
+
if (!invited.initialized && !invited.isLoadingNext && ((_a = scUserContext.user) === null || _a === void 0 ? void 0 : _a.id) === scEvent.managed_by.id) {
|
|
93
|
+
dispatchInvited({ type: actionWidgetTypes.LOADING_NEXT });
|
|
94
|
+
EventService.getEventInvitedUsers(scEvent.id, Object.assign({}, endpointQueryParams))
|
|
95
|
+
.then((payload) => {
|
|
96
|
+
dispatchInvited({ type: actionWidgetTypes.LOAD_NEXT_SUCCESS, payload: Object.assign(Object.assign({}, payload), { initialized: true }) });
|
|
97
|
+
setInvitedNumber(payload.count);
|
|
98
|
+
})
|
|
99
|
+
.catch((error) => {
|
|
100
|
+
dispatchInvited({ type: actionWidgetTypes.LOAD_NEXT_FAILURE, payload: { errorLoadNext: error } });
|
|
101
|
+
Logger.error(SCOPE_SC_UI, error);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}, [invited.isLoadingNext, invited.initialized, dispatchInvited, scUserContext.user, scEvent]);
|
|
105
|
+
// EFFECTS
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
let _t;
|
|
108
|
+
if (scUserContext.user && scEvent) {
|
|
109
|
+
_t = setTimeout(() => {
|
|
110
|
+
_initParticipants();
|
|
111
|
+
_initInvited();
|
|
112
|
+
});
|
|
113
|
+
return () => {
|
|
114
|
+
clearTimeout(_t);
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}, [scUserContext.user, scEvent]);
|
|
118
|
+
// HANDLERS
|
|
119
|
+
/**
|
|
120
|
+
* Handles pagination
|
|
121
|
+
*/
|
|
122
|
+
const handleNext = useCallback(() => {
|
|
123
|
+
dispatch({ type: actionWidgetTypes.LOADING_NEXT });
|
|
124
|
+
http
|
|
125
|
+
.request({
|
|
126
|
+
url: state.next,
|
|
127
|
+
method: Endpoints.UserSuggestion.method
|
|
128
|
+
})
|
|
129
|
+
.then((res) => {
|
|
130
|
+
dispatch({ type: actionWidgetTypes.LOAD_NEXT_SUCCESS, payload: res.data });
|
|
131
|
+
});
|
|
132
|
+
}, [dispatch, state.next, state.isLoadingNext, state.initialized]);
|
|
133
|
+
const handleToggleDialogOpen = useCallback(() => {
|
|
134
|
+
setOpenDialog((prev) => !prev);
|
|
135
|
+
}, []);
|
|
136
|
+
const handleTabChange = useCallback((_evt, newTabValue) => {
|
|
137
|
+
setTabValue(newTabValue);
|
|
138
|
+
}, []);
|
|
139
|
+
if (!scEvent && !state.initialized) {
|
|
140
|
+
return _jsx(Skeleton, {});
|
|
141
|
+
}
|
|
142
|
+
// RENDER
|
|
143
|
+
if (!scEvent) {
|
|
144
|
+
return _jsx(HiddenPlaceholder, {});
|
|
145
|
+
}
|
|
146
|
+
return (_jsxs(Root, Object.assign({ className: classes.root }, rest, { children: [_jsxs(CardContent, Object.assign({ className: classes.content }, { children: [_jsx(Typography, Object.assign({ variant: "h5", className: classes.title }, { children: _jsx(FormattedMessage, { id: "ui.eventMembersWidget.invited", defaultMessage: "ui.eventMembersWidget.invited" }) })), _jsxs(TabContext, Object.assign({ value: tabValue }, { children: [_jsx(Box, Object.assign({ className: classes.tabsWrapper }, { children: _jsxs(TabList, Object.assign({ onChange: handleTabChange, textColor: "secondary", indicatorColor: "secondary", variant: "fullWidth" }, { children: [_jsx(Tab, { label: _jsxs(Stack, Object.assign({ className: classes.tabLabelWrapper }, { children: [_jsx(Typography, Object.assign({ variant: "h3" }, { children: participants.count })), _jsx(Typography, Object.assign({ variant: "subtitle2" }, { children: _jsx(FormattedMessage, { id: "ui.eventMembersWidget.participants", defaultMessage: "ui.eventMembersWidget.participants" }) }))] })), value: "1" }), invited && (_jsx(Tab, { label: _jsxs(Stack, Object.assign({ className: classes.tabLabelWrapper }, { children: [_jsx(Typography, Object.assign({ variant: "h3" }, { children: invitedNumber })), _jsx(Typography, Object.assign({ variant: "subtitle2" }, { children: _jsx(FormattedMessage, { id: "ui.eventMembersWidget.invited", defaultMessage: "ui.eventMembersWidget.invited" }) }))] })), value: "2" }))] })) })), _jsx(TabPanel, Object.assign({ value: "1", className: classes.tabPanel }, { children: _jsx(List, { children: participants.results.map((user) => (_jsx(ListItem, { children: _jsx(User, Object.assign({ elevation: 0, user: user }, userProps)) }, user.id))) }) })), invited && (_jsx(TabPanel, Object.assign({ value: "2", className: classes.tabPanel }, { children: _jsx(List, { children: invited.results.map((user) => (_jsx(ListItem, { children: _jsx(User, Object.assign({ elevation: 0, user: user }, userProps, { actions: _jsx(InviteEventButton, { event: scEvent, userId: user.id, setInvitedNumber: setInvitedNumber }) })) }, user.id))) }) })))] }))] })), state.count > state.visibleItems && (_jsx(CardActions, Object.assign({ className: classes.actions }, { children: _jsx(Button, Object.assign({ onClick: handleToggleDialogOpen, className: classes.actionButton }, { children: _jsx(Typography, Object.assign({ variant: "caption" }, { children: _jsx(FormattedMessage, { id: "ui.eventMembersWidget.showAll", defaultMessage: "ui.eventMembersWidget.showAll" }) })) })) }))), openDialog && (_jsx(DialogRoot, Object.assign({ className: classes.dialogRoot, title: _jsx(FormattedMessage, { defaultMessage: "ui.eventMembersWidget.title", id: "ui.eventMembersWidget.title" }), onClose: handleToggleDialogOpen, open: openDialog }, dialogProps, { children: _jsx(InfiniteScroll, Object.assign({ dataLength: state.results.length, next: handleNext, hasMoreNext: Boolean(state.next), loaderNext: _jsx(UserSkeleton, Object.assign({ elevation: 0 }, userProps)), className: classes.infiniteScroll, endMessage: _jsx(Typography, Object.assign({ className: classes.endMessage }, { children: _jsx(FormattedMessage, { id: "ui.eventMembersWidget.noMoreResults", defaultMessage: "ui.eventMembersWidget.noMoreResults" }) })) }, { children: _jsx(List, { children: state.results.map((user) => (_jsx(ListItem, { children: _jsx(User, Object.assign({ elevation: 0, user: user }, userProps)) }, user.id))) }) })) })))] })));
|
|
147
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { TabContext, TabList, TabPanel } from '@mui/lab';
|
|
3
|
+
import { CardActions, CardContent, List, ListItem, Skeleton, Stack, Tab } from '@mui/material';
|
|
4
|
+
import { Box, styled } from '@mui/system';
|
|
5
|
+
import 'swiper/css';
|
|
6
|
+
import { UserSkeleton } from '../User';
|
|
7
|
+
import Widget from '../Widget';
|
|
8
|
+
import { PREFIX } from './constants';
|
|
9
|
+
const classes = {
|
|
10
|
+
root: `${PREFIX}-skeleton-root`,
|
|
11
|
+
content: `${PREFIX}-content`,
|
|
12
|
+
title: `${PREFIX}-title`,
|
|
13
|
+
tabsWrapper: `${PREFIX}-tabs-wrapper`,
|
|
14
|
+
tabLabelWrapper: `${PREFIX}-tab-label-wrapper`,
|
|
15
|
+
tabPanel: `${PREFIX}-tab-panel`,
|
|
16
|
+
actions: `${PREFIX}-actions`
|
|
17
|
+
};
|
|
18
|
+
const Root = styled(Widget, {
|
|
19
|
+
name: PREFIX,
|
|
20
|
+
slot: 'SkeletonRoot',
|
|
21
|
+
overridesResolver: (_props, styles) => styles.skeletonRoot
|
|
22
|
+
})();
|
|
23
|
+
export default function EventMembersWidgetSkeleton() {
|
|
24
|
+
return (_jsxs(Root, Object.assign({ className: classes.root }, { children: [_jsxs(CardContent, Object.assign({ className: classes.content }, { children: [_jsx(Skeleton, { animation: "wave", width: "53px", height: "25px", className: classes.title }), _jsxs(TabContext, Object.assign({ value: "1" }, { children: [_jsx(Box, Object.assign({ className: classes.tabsWrapper }, { children: _jsxs(TabList, Object.assign({ variant: "fullWidth" }, { children: [_jsx(Tab, { label: _jsxs(Stack, Object.assign({ className: classes.tabLabelWrapper }, { children: [_jsx(Skeleton, { animation: "wave", width: "26px", height: "24px" }), _jsx(Skeleton, { animation: "wave", width: "106px", height: "19px" })] })), value: "1" }), _jsx(Tab, { label: _jsxs(Stack, Object.assign({ className: classes.tabLabelWrapper }, { children: [_jsx(Skeleton, { animation: "wave", width: "26px", height: "24px" }), _jsx(Skeleton, { animation: "wave", width: "106px", height: "19px" })] })), value: "2" })] })) })), _jsx(TabPanel, Object.assign({ value: "1", className: classes.tabPanel }, { children: _jsx(List, { children: [1, 2, 3, 4].map((_element, i) => (_jsx(ListItem, { children: _jsx(UserSkeleton, {}) }, i))) }) })), _jsx(TabPanel, Object.assign({ value: "2", className: classes.tabPanel }, { children: _jsx(List, { children: [1, 2, 3, 4].map((_element, i) => (_jsx(ListItem, { children: _jsx(UserSkeleton, {}) }, i))) }) }))] }))] })), _jsx(CardActions, Object.assign({ className: classes.actions }, { children: _jsx(Skeleton, { animation: "wave", width: "52px", height: "20px" }) }))] })));
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const PREFIX = "SCEventMembersWidget";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const PREFIX = 'SCEventMembersWidget';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ButtonProps } from '@mui/material/Button/Button';
|
|
2
2
|
import { SCEventType } from '@selfcommunity/types';
|
|
3
3
|
import { BaseDialogProps } from '../../shared/BaseDialog';
|
|
4
|
-
export interface
|
|
4
|
+
export interface EventParticipantsButtonProps extends Pick<ButtonProps, Exclude<keyof ButtonProps, 'onClick' | 'disabled'>> {
|
|
5
5
|
/**
|
|
6
6
|
* Event Object
|
|
7
7
|
* @default null
|
|
@@ -12,6 +12,11 @@ export interface EventPartecipantsButtonProps extends Pick<ButtonProps, Exclude<
|
|
|
12
12
|
* @default null
|
|
13
13
|
*/
|
|
14
14
|
eventId?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Hide button label
|
|
17
|
+
* @default false
|
|
18
|
+
*/
|
|
19
|
+
hideCaption?: boolean;
|
|
15
20
|
/**
|
|
16
21
|
* Props to spread to followedBy dialog
|
|
17
22
|
* @default {}
|
|
@@ -23,24 +28,24 @@ export interface EventPartecipantsButtonProps extends Pick<ButtonProps, Exclude<
|
|
|
23
28
|
[p: string]: any;
|
|
24
29
|
}
|
|
25
30
|
/**
|
|
26
|
-
*> API documentation for the Community-JS Event
|
|
31
|
+
*> API documentation for the Community-JS Event Participants Button component. Learn about the available props and the CSS API.
|
|
27
32
|
*
|
|
28
33
|
#### Import
|
|
29
34
|
```jsx
|
|
30
|
-
import {
|
|
35
|
+
import {EventParticipantsButton} from '@selfcommunity/react-ui';
|
|
31
36
|
```
|
|
32
37
|
#### Component Name
|
|
33
38
|
|
|
34
|
-
The name `
|
|
39
|
+
The name `SCEventParticipantsButton` can be used when providing style overrides in the theme.
|
|
35
40
|
|
|
36
41
|
* #### CSS
|
|
37
42
|
*
|
|
38
43
|
|Rule Name|Global class|Description|
|
|
39
44
|
|---|---|---|
|
|
40
|
-
|root|.
|
|
41
|
-
|dialogRoot|.
|
|
42
|
-
|endMessage|.
|
|
45
|
+
|root|.SCEventParticipantsButton-root|Styles applied to the root element.|
|
|
46
|
+
|dialogRoot|.SCEventParticipantsButton-dialog-root|Styles applied to the root element.|
|
|
47
|
+
|endMessage|.SCEventParticipantsButton-end-message|Styles applied to the end message element.|
|
|
43
48
|
|
|
44
49
|
* @param inProps
|
|
45
50
|
*/
|
|
46
|
-
export default function
|
|
51
|
+
export default function EventParticipantsButton(inProps: EventParticipantsButtonProps): JSX.Element;
|
|
@@ -15,11 +15,11 @@ import BaseDialog from '../../shared/BaseDialog';
|
|
|
15
15
|
import InfiniteScroll from '../../shared/InfiniteScroll';
|
|
16
16
|
import AvatarGroupSkeleton from '../Skeleton/AvatarGroupSkeleton';
|
|
17
17
|
import User, { UserSkeleton } from '../User';
|
|
18
|
-
const PREFIX = '
|
|
18
|
+
const PREFIX = 'SCEventParticipantsButton';
|
|
19
19
|
const classes = {
|
|
20
20
|
root: `${PREFIX}-root`,
|
|
21
21
|
avatar: `${PREFIX}-avatar`,
|
|
22
|
-
|
|
22
|
+
participants: `${PREFIX}-participants`,
|
|
23
23
|
dialogRoot: `${PREFIX}-dialog-root`,
|
|
24
24
|
infiniteScroll: `${PREFIX}-infinite-scroll`,
|
|
25
25
|
endMessage: `${PREFIX}-end-message`
|
|
@@ -35,33 +35,33 @@ const DialogRoot = styled(BaseDialog, {
|
|
|
35
35
|
overridesResolver: (_props, styles) => styles.dialogRoot
|
|
36
36
|
})(() => ({}));
|
|
37
37
|
/**
|
|
38
|
-
*> API documentation for the Community-JS Event
|
|
38
|
+
*> API documentation for the Community-JS Event Participants Button component. Learn about the available props and the CSS API.
|
|
39
39
|
*
|
|
40
40
|
#### Import
|
|
41
41
|
```jsx
|
|
42
|
-
import {
|
|
42
|
+
import {EventParticipantsButton} from '@selfcommunity/react-ui';
|
|
43
43
|
```
|
|
44
44
|
#### Component Name
|
|
45
45
|
|
|
46
|
-
The name `
|
|
46
|
+
The name `SCEventParticipantsButton` can be used when providing style overrides in the theme.
|
|
47
47
|
|
|
48
48
|
* #### CSS
|
|
49
49
|
*
|
|
50
50
|
|Rule Name|Global class|Description|
|
|
51
51
|
|---|---|---|
|
|
52
|
-
|root|.
|
|
53
|
-
|dialogRoot|.
|
|
54
|
-
|endMessage|.
|
|
52
|
+
|root|.SCEventParticipantsButton-root|Styles applied to the root element.|
|
|
53
|
+
|dialogRoot|.SCEventParticipantsButton-dialog-root|Styles applied to the root element.|
|
|
54
|
+
|endMessage|.SCEventParticipantsButton-end-message|Styles applied to the end message element.|
|
|
55
55
|
|
|
56
56
|
* @param inProps
|
|
57
57
|
*/
|
|
58
|
-
export default function
|
|
58
|
+
export default function EventParticipantsButton(inProps) {
|
|
59
59
|
// PROPS
|
|
60
60
|
const props = useThemeProps({
|
|
61
61
|
props: inProps,
|
|
62
62
|
name: PREFIX
|
|
63
63
|
});
|
|
64
|
-
const { className, eventId, event, DialogProps = {} } = props, rest = __rest(props, ["className", "eventId", "event", "DialogProps"]);
|
|
64
|
+
const { className, eventId, event, hideCaption = false, DialogProps = {} } = props, rest = __rest(props, ["className", "eventId", "event", "hideCaption", "DialogProps"]);
|
|
65
65
|
// STATE
|
|
66
66
|
const [loading, setLoading] = useState(true);
|
|
67
67
|
const [next, setNext] = useState(null);
|
|
@@ -122,5 +122,5 @@ export default function EventPartecipantsButton(inProps) {
|
|
|
122
122
|
const handleToggleDialogOpen = useCallback(() => {
|
|
123
123
|
setOpen((prev) => !prev);
|
|
124
124
|
}, [setOpen]);
|
|
125
|
-
return (_jsxs(_Fragment, { children: [_jsxs(Root, Object.assign({ className: classNames(classes.root, className), onClick: handleToggleDialogOpen, disabled: loading || !scEvent || scEvent.goings_counter === 0 }, rest, { children: [_jsx(Typography, Object.assign({ className: classes.
|
|
125
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Root, Object.assign({ className: classNames(classes.root, className), onClick: handleToggleDialogOpen, disabled: loading || !scEvent || scEvent.goings_counter === 0 }, rest, { children: [!hideCaption && (_jsx(Typography, Object.assign({ className: classes.participants, variant: "caption" }, { children: _jsx(FormattedMessage, { defaultMessage: "ui.eventParticipantsButton.participants", id: "ui.eventParticipantsButton.participants" }) }))), loading || !scEvent ? (_jsx(AvatarGroupSkeleton, Object.assign({}, rest))) : (_jsx(AvatarGroup, Object.assign({ total: scEvent.goings_counter }, { children: followers.map((c) => (_jsx(Avatar, { alt: c.username, src: c.avatar, className: classes.avatar }, c.id))) })))] })), open && (_jsx(DialogRoot, Object.assign({ className: classes.dialogRoot, title: _jsx(FormattedMessage, { defaultMessage: "ui.eventParticipantsButton.dialogTitle", id: "ui.eventParticipantsButton.dialogTitle", values: { total: scEvent.goings_counter } }), onClose: handleToggleDialogOpen, open: open }, DialogProps, { children: _jsx(InfiniteScroll, Object.assign({ dataLength: followers.length, next: fetchFollowers, hasMoreNext: next !== null || loading, loaderNext: _jsx(UserSkeleton, { elevation: 0 }), className: classes.infiniteScroll, endMessage: _jsx(Typography, Object.assign({ className: classes.endMessage }, { children: _jsx(FormattedMessage, { id: "ui.eventParticipantsButton.noOtherParticipants", defaultMessage: "ui.eventParticipantsButton.noOtherParticipants" }) })) }, { children: _jsx(List, { children: followers.map((follower) => (_jsx(ListItem, { children: _jsx(User, { elevation: 0, user: follower }) }, follower.id))) }) })) })))] }));
|
|
126
126
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { SCEventType, SCUserType } from '@selfcommunity/types';
|
|
2
|
+
import { Dispatch, HTMLAttributes, SetStateAction } from 'react';
|
|
3
|
+
export interface InviteEventButtonProps {
|
|
4
|
+
/**
|
|
5
|
+
* Overrides or extends the styles applied to the component.
|
|
6
|
+
* @default null
|
|
7
|
+
*/
|
|
8
|
+
className?: HTMLAttributes<HTMLButtonElement>['className'];
|
|
9
|
+
/**
|
|
10
|
+
* Id of the event
|
|
11
|
+
* @default null
|
|
12
|
+
*/
|
|
13
|
+
eventId?: number;
|
|
14
|
+
/**
|
|
15
|
+
* Event
|
|
16
|
+
* @default null
|
|
17
|
+
*/
|
|
18
|
+
event?: SCEventType;
|
|
19
|
+
/**
|
|
20
|
+
* Id of the user
|
|
21
|
+
* @default null
|
|
22
|
+
*/
|
|
23
|
+
userId?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Event
|
|
26
|
+
* @default null
|
|
27
|
+
*/
|
|
28
|
+
user?: SCUserType;
|
|
29
|
+
/**
|
|
30
|
+
* setInvitedNumber set state action
|
|
31
|
+
*/
|
|
32
|
+
setInvitedNumber?: Dispatch<SetStateAction<number>>;
|
|
33
|
+
/**
|
|
34
|
+
* Others properties
|
|
35
|
+
*/
|
|
36
|
+
[p: string]: any;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* > API documentation for the Community-JS Invite Event Button component. Learn about the available props and the CSS API.
|
|
40
|
+
|
|
41
|
+
#### Import
|
|
42
|
+
|
|
43
|
+
```jsx
|
|
44
|
+
import {InviteEventButton} from '@selfcommunity/react-ui';
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
#### Component Name
|
|
48
|
+
|
|
49
|
+
The name `SCInviteEventButton` can be used when providing style overrides in the theme.
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
#### CSS
|
|
53
|
+
|
|
54
|
+
|Rule Name|Global class|Description|
|
|
55
|
+
|---|---|---|
|
|
56
|
+
|root|.SCInviteEventButton-root|Styles applied to the root element.|
|
|
57
|
+
|
|
58
|
+
* @param inProps
|
|
59
|
+
*/
|
|
60
|
+
export default function InviteEventButton(inProps: InviteEventButtonProps): JSX.Element;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { __rest } from "tslib";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { LoadingButton } from '@mui/lab';
|
|
4
|
+
import { styled } from '@mui/material/styles';
|
|
5
|
+
import { useThemeProps } from '@mui/system';
|
|
6
|
+
import { EventService } from '@selfcommunity/api-services';
|
|
7
|
+
import { useSCFetchEvent, useSCFetchUser } from '@selfcommunity/react-core';
|
|
8
|
+
import { Logger } from '@selfcommunity/utils';
|
|
9
|
+
import classNames from 'classnames';
|
|
10
|
+
import { useCallback, useState } from 'react';
|
|
11
|
+
import { FormattedMessage } from 'react-intl';
|
|
12
|
+
import { SCOPE_SC_UI } from '../../constants/Errors';
|
|
13
|
+
const PREFIX = 'SCInviteEventButton';
|
|
14
|
+
const classes = {
|
|
15
|
+
root: `${PREFIX}-root`
|
|
16
|
+
};
|
|
17
|
+
const InviteButton = styled(LoadingButton, {
|
|
18
|
+
name: PREFIX,
|
|
19
|
+
slot: 'Root',
|
|
20
|
+
overridesResolver: (_props, styles) => styles.root
|
|
21
|
+
})();
|
|
22
|
+
/**
|
|
23
|
+
* > API documentation for the Community-JS Invite Event Button component. Learn about the available props and the CSS API.
|
|
24
|
+
|
|
25
|
+
#### Import
|
|
26
|
+
|
|
27
|
+
```jsx
|
|
28
|
+
import {InviteEventButton} from '@selfcommunity/react-ui';
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
#### Component Name
|
|
32
|
+
|
|
33
|
+
The name `SCInviteEventButton` can be used when providing style overrides in the theme.
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
#### CSS
|
|
37
|
+
|
|
38
|
+
|Rule Name|Global class|Description|
|
|
39
|
+
|---|---|---|
|
|
40
|
+
|root|.SCInviteEventButton-root|Styles applied to the root element.|
|
|
41
|
+
|
|
42
|
+
* @param inProps
|
|
43
|
+
*/
|
|
44
|
+
export default function InviteEventButton(inProps) {
|
|
45
|
+
// PROPS
|
|
46
|
+
const props = useThemeProps({
|
|
47
|
+
props: inProps,
|
|
48
|
+
name: PREFIX
|
|
49
|
+
});
|
|
50
|
+
const { className, eventId, event, userId, user, setInvitedNumber } = props, rest = __rest(props, ["className", "eventId", "event", "userId", "user", "setInvitedNumber"]);
|
|
51
|
+
// STATE
|
|
52
|
+
const { scEvent } = useSCFetchEvent({ id: eventId, event });
|
|
53
|
+
const { scUser } = useSCFetchUser({ id: userId, user });
|
|
54
|
+
const [invited, setInvited] = useState(true);
|
|
55
|
+
const handleInviteAction = useCallback(() => {
|
|
56
|
+
setInvited(null);
|
|
57
|
+
if (invited) {
|
|
58
|
+
EventService.removeInviteEvent(scEvent.id, { users: [scUser.id] })
|
|
59
|
+
.then(() => {
|
|
60
|
+
setInvited(!invited);
|
|
61
|
+
setInvitedNumber((prev) => prev - 1);
|
|
62
|
+
})
|
|
63
|
+
.catch((_error) => {
|
|
64
|
+
Logger.error(SCOPE_SC_UI, _error);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
EventService.inviteOrAcceptEventRequest(scEvent.id, { users: [scUser.id] })
|
|
69
|
+
.then(() => {
|
|
70
|
+
setInvited(!invited);
|
|
71
|
+
setInvitedNumber((prev) => prev + 1);
|
|
72
|
+
})
|
|
73
|
+
.catch((_error) => {
|
|
74
|
+
Logger.error(SCOPE_SC_UI, _error);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}, [scEvent, scUser]);
|
|
78
|
+
return (_jsx(InviteButton, Object.assign({ size: "small", variant: "outlined", onClick: handleInviteAction, loading: invited === null, className: classNames(classes.root, className) }, rest, { children: invited ? (_jsx(FormattedMessage, { defaultMessage: "ui.inviteEventButton.remove", id: "ui.inviteEventButton.remove" })) : (_jsx(FormattedMessage, { defaultMessage: "ui.inviteEventButton.invite", id: "ui.inviteEventButton.invite" })) })));
|
|
79
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { SCEventType } from '@selfcommunity/types';
|
|
2
|
+
import { CacheStrategies } from '@selfcommunity/utils';
|
|
3
|
+
import 'swiper/css';
|
|
4
|
+
import { BaseDialogProps } from '../../shared/BaseDialog';
|
|
5
|
+
import { EventProps } from '../Event';
|
|
6
|
+
import { WidgetProps } from '../Widget';
|
|
7
|
+
export interface RelatedEventsWidgetProps extends WidgetProps {
|
|
8
|
+
/**
|
|
9
|
+
* Event Object
|
|
10
|
+
* @default null
|
|
11
|
+
*/
|
|
12
|
+
event?: SCEventType;
|
|
13
|
+
/**
|
|
14
|
+
* Id of event object
|
|
15
|
+
* @default null
|
|
16
|
+
*/
|
|
17
|
+
eventId?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Props to spread to single event object
|
|
20
|
+
* @default {}
|
|
21
|
+
*/
|
|
22
|
+
eventComponentProps?: EventProps;
|
|
23
|
+
/**
|
|
24
|
+
* Feed API Query Params
|
|
25
|
+
* @default [{'limit': 20, 'offset': 0}]
|
|
26
|
+
*/
|
|
27
|
+
endpointQueryParams?: Record<string, string | number>;
|
|
28
|
+
/**
|
|
29
|
+
* Caching strategies
|
|
30
|
+
* @default CacheStrategies.CACHE_FIRST
|
|
31
|
+
*/
|
|
32
|
+
cacheStrategy?: CacheStrategies;
|
|
33
|
+
/**
|
|
34
|
+
* Props to spread to users suggestion dialog
|
|
35
|
+
* @default {}
|
|
36
|
+
*/
|
|
37
|
+
dialogProps?: BaseDialogProps;
|
|
38
|
+
limit?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Other props
|
|
41
|
+
*/
|
|
42
|
+
[p: string]: any;
|
|
43
|
+
}
|
|
44
|
+
export default function RelatedEventsWidget(inProps: RelatedEventsWidgetProps): JSX.Element;
|