@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.
Files changed (68) hide show
  1. package/lib/cjs/components/Event/Event.d.ts +6 -0
  2. package/lib/cjs/components/Event/Event.js +4 -4
  3. package/lib/cjs/components/EventMembersWidget/EventMembersWidget.d.ts +44 -0
  4. package/lib/cjs/components/EventMembersWidget/EventMembersWidget.js +150 -0
  5. package/lib/cjs/components/EventMembersWidget/Skeleton.d.ts +2 -0
  6. package/lib/cjs/components/EventMembersWidget/Skeleton.js +29 -0
  7. package/lib/cjs/components/EventMembersWidget/constants.d.ts +1 -0
  8. package/lib/cjs/components/EventMembersWidget/constants.js +4 -0
  9. package/lib/cjs/components/EventMembersWidget/index.d.ts +4 -0
  10. package/lib/cjs/components/EventMembersWidget/index.js +8 -0
  11. package/lib/cjs/components/{EventPartecipantsButton/EventPartecipantsButton.d.ts → EventParticipantsButton/EventParticipantsButton.d.ts} +13 -8
  12. package/lib/cjs/components/{EventPartecipantsButton/EventPartecipantsButton.js → EventParticipantsButton/EventParticipantsButton.js} +12 -12
  13. package/lib/cjs/components/EventParticipantsButton/index.d.ts +3 -0
  14. package/lib/cjs/components/EventParticipantsButton/index.js +5 -0
  15. package/lib/cjs/components/InviteEventButton/InviteEventButton.d.ts +60 -0
  16. package/lib/cjs/components/InviteEventButton/InviteEventButton.js +82 -0
  17. package/lib/cjs/components/InviteEventButton/index.d.ts +3 -0
  18. package/lib/cjs/components/InviteEventButton/index.js +5 -0
  19. package/lib/cjs/components/RelatedEventsWidget/RelatedEventsWidget.d.ts +44 -0
  20. package/lib/cjs/components/RelatedEventsWidget/RelatedEventsWidget.js +125 -0
  21. package/lib/cjs/components/RelatedEventsWidget/Skeleton.d.ts +2 -0
  22. package/lib/cjs/components/RelatedEventsWidget/Skeleton.js +28 -0
  23. package/lib/cjs/components/RelatedEventsWidget/constants.d.ts +1 -0
  24. package/lib/cjs/components/RelatedEventsWidget/constants.js +4 -0
  25. package/lib/cjs/components/RelatedEventsWidget/index.d.ts +4 -0
  26. package/lib/cjs/components/RelatedEventsWidget/index.js +8 -0
  27. package/lib/cjs/components/SuggestedEventsWidget/Arrow.js +2 -2
  28. package/lib/cjs/components/SuggestedEventsWidget/SuggestedEventsWidget.js +18 -11
  29. package/lib/cjs/index.d.ts +6 -3
  30. package/lib/cjs/index.js +21 -12
  31. package/lib/esm/components/Event/Event.d.ts +6 -0
  32. package/lib/esm/components/Event/Event.js +4 -4
  33. package/lib/esm/components/EventMembersWidget/EventMembersWidget.d.ts +44 -0
  34. package/lib/esm/components/EventMembersWidget/EventMembersWidget.js +147 -0
  35. package/lib/esm/components/EventMembersWidget/Skeleton.d.ts +2 -0
  36. package/lib/esm/components/EventMembersWidget/Skeleton.js +25 -0
  37. package/lib/esm/components/EventMembersWidget/constants.d.ts +1 -0
  38. package/lib/esm/components/EventMembersWidget/constants.js +1 -0
  39. package/lib/esm/components/EventMembersWidget/index.d.ts +4 -0
  40. package/lib/esm/components/EventMembersWidget/index.js +4 -0
  41. package/lib/esm/components/{EventPartecipantsButton/EventPartecipantsButton.d.ts → EventParticipantsButton/EventParticipantsButton.d.ts} +13 -8
  42. package/lib/esm/components/{EventPartecipantsButton/EventPartecipantsButton.js → EventParticipantsButton/EventParticipantsButton.js} +11 -11
  43. package/lib/esm/components/EventParticipantsButton/index.d.ts +3 -0
  44. package/lib/esm/components/EventParticipantsButton/index.js +2 -0
  45. package/lib/esm/components/InviteEventButton/InviteEventButton.d.ts +60 -0
  46. package/lib/esm/components/InviteEventButton/InviteEventButton.js +79 -0
  47. package/lib/esm/components/InviteEventButton/index.d.ts +3 -0
  48. package/lib/esm/components/InviteEventButton/index.js +2 -0
  49. package/lib/esm/components/RelatedEventsWidget/RelatedEventsWidget.d.ts +44 -0
  50. package/lib/esm/components/RelatedEventsWidget/RelatedEventsWidget.js +122 -0
  51. package/lib/esm/components/RelatedEventsWidget/Skeleton.d.ts +2 -0
  52. package/lib/esm/components/RelatedEventsWidget/Skeleton.js +24 -0
  53. package/lib/esm/components/RelatedEventsWidget/constants.d.ts +1 -0
  54. package/lib/esm/components/RelatedEventsWidget/constants.js +1 -0
  55. package/lib/esm/components/RelatedEventsWidget/index.d.ts +4 -0
  56. package/lib/esm/components/RelatedEventsWidget/index.js +4 -0
  57. package/lib/esm/components/SuggestedEventsWidget/Arrow.js +3 -3
  58. package/lib/esm/components/SuggestedEventsWidget/SuggestedEventsWidget.js +19 -12
  59. package/lib/esm/index.d.ts +6 -3
  60. package/lib/esm/index.js +8 -5
  61. package/lib/umd/{401.js → 224.js} +2 -2
  62. package/lib/umd/react-ui.js +1 -1
  63. package/package.json +7 -7
  64. package/lib/cjs/components/EventPartecipantsButton/index.d.ts +0 -3
  65. package/lib/cjs/components/EventPartecipantsButton/index.js +0 -5
  66. package/lib/esm/components/EventPartecipantsButton/index.d.ts +0 -3
  67. package/lib/esm/components/EventPartecipantsButton/index.js +0 -2
  68. /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,2 @@
1
+ import 'swiper/css';
2
+ export default function EventMembersWidgetSkeleton(): JSX.Element;
@@ -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';
@@ -0,0 +1,4 @@
1
+ import EventMembersWidget, { EventMembersWidgetProps } from './EventMembersWidget';
2
+ import EventMembersWidgetSkeleton from './Skeleton';
3
+ export default EventMembersWidget;
4
+ export { EventMembersWidgetSkeleton, type EventMembersWidgetProps };
@@ -0,0 +1,4 @@
1
+ import EventMembersWidget from './EventMembersWidget';
2
+ import EventMembersWidgetSkeleton from './Skeleton';
3
+ export default EventMembersWidget;
4
+ export { EventMembersWidgetSkeleton };
@@ -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 EventPartecipantsButtonProps extends Pick<ButtonProps, Exclude<keyof ButtonProps, 'onClick' | 'disabled'>> {
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 Partecipants Button component. Learn about the available props and the CSS API.
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 {EventPartecipantsButton} from '@selfcommunity/react-ui';
35
+ import {EventParticipantsButton} from '@selfcommunity/react-ui';
31
36
  ```
32
37
  #### Component Name
33
38
 
34
- The name `SCEventPartecipantsButton` can be used when providing style overrides in the theme.
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|.SCEventPartecipantsButton-root|Styles applied to the root element.|
41
- |dialogRoot|.SCEventPartecipantsButton-dialog-root|Styles applied to the root element.|
42
- |endMessage|.SCEventPartecipantsButton-end-message|Styles applied to the end message element.|
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 EventPartecipantsButton(inProps: EventPartecipantsButtonProps): JSX.Element;
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 = 'SCEventPartecipantsButton';
18
+ const PREFIX = 'SCEventParticipantsButton';
19
19
  const classes = {
20
20
  root: `${PREFIX}-root`,
21
21
  avatar: `${PREFIX}-avatar`,
22
- partecipants: `${PREFIX}-partecipants`,
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 Partecipants Button component. Learn about the available props and the CSS API.
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 {EventPartecipantsButton} from '@selfcommunity/react-ui';
42
+ import {EventParticipantsButton} from '@selfcommunity/react-ui';
43
43
  ```
44
44
  #### Component Name
45
45
 
46
- The name `SCEventPartecipantsButton` can be used when providing style overrides in the theme.
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|.SCEventPartecipantsButton-root|Styles applied to the root element.|
53
- |dialogRoot|.SCEventPartecipantsButton-dialog-root|Styles applied to the root element.|
54
- |endMessage|.SCEventPartecipantsButton-end-message|Styles applied to the end message element.|
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 EventPartecipantsButton(inProps) {
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.partecipants, variant: "caption" }, { children: _jsx(FormattedMessage, { defaultMessage: "ui.eventPartecipantsButton.partecipants", id: "ui.eventPartecipantsButton.partecipants" }) })), 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.eventPartecipantsButton.dialogTitle", id: "ui.eventPartecipantsButton.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.eventPartecipantsButton.noOtherPartecipants", defaultMessage: "ui.eventPartecipantsButton.noOtherPartecipants" }) })) }, { children: _jsx(List, { children: followers.map((follower) => (_jsx(ListItem, { children: _jsx(User, { elevation: 0, user: follower }) }, follower.id))) }) })) })))] }));
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,3 @@
1
+ import EventParticipantsButton, { EventParticipantsButtonProps } from './EventParticipantsButton';
2
+ export default EventParticipantsButton;
3
+ export { EventParticipantsButtonProps };
@@ -0,0 +1,2 @@
1
+ import EventParticipantsButton from './EventParticipantsButton';
2
+ export default EventParticipantsButton;
@@ -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,3 @@
1
+ import InviteEventButton, { InviteEventButtonProps } from './InviteEventButton';
2
+ export default InviteEventButton;
3
+ export { InviteEventButtonProps };
@@ -0,0 +1,2 @@
1
+ import InviteEventButton from './InviteEventButton';
2
+ export default InviteEventButton;
@@ -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;