@selfcommunity/react-ui 0.7.50-events.55 → 0.7.50-events.57

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 (30) hide show
  1. package/lib/cjs/components/Event/Event.d.ts +2 -2
  2. package/lib/cjs/components/Event/Event.js +11 -11
  3. package/lib/cjs/components/Events/Events.d.ts +11 -1
  4. package/lib/cjs/components/Events/Events.js +30 -26
  5. package/lib/cjs/components/Events/PastEventsFilter.d.ts +6 -0
  6. package/lib/cjs/components/Events/PastEventsFilter.js +30 -0
  7. package/lib/cjs/components/SuggestedEventsWidget/Arrow.d.ts +8 -0
  8. package/lib/cjs/components/SuggestedEventsWidget/Arrow.js +30 -0
  9. package/lib/cjs/components/SuggestedEventsWidget/Skeleton.js +4 -4
  10. package/lib/cjs/components/SuggestedEventsWidget/SuggestedEventsWidget.d.ts +0 -1
  11. package/lib/cjs/components/SuggestedEventsWidget/SuggestedEventsWidget.js +16 -6
  12. package/lib/cjs/components/SuggestedEventsWidget/index.d.ts +2 -1
  13. package/lib/cjs/components/SuggestedEventsWidget/index.js +3 -1
  14. package/lib/esm/components/Event/Event.d.ts +2 -2
  15. package/lib/esm/components/Event/Event.js +11 -11
  16. package/lib/esm/components/Events/Events.d.ts +11 -1
  17. package/lib/esm/components/Events/Events.js +30 -27
  18. package/lib/esm/components/Events/PastEventsFilter.d.ts +6 -0
  19. package/lib/esm/components/Events/PastEventsFilter.js +27 -0
  20. package/lib/esm/components/SuggestedEventsWidget/Arrow.d.ts +8 -0
  21. package/lib/esm/components/SuggestedEventsWidget/Arrow.js +27 -0
  22. package/lib/esm/components/SuggestedEventsWidget/Skeleton.js +4 -4
  23. package/lib/esm/components/SuggestedEventsWidget/SuggestedEventsWidget.d.ts +0 -1
  24. package/lib/esm/components/SuggestedEventsWidget/SuggestedEventsWidget.js +16 -6
  25. package/lib/esm/components/SuggestedEventsWidget/index.d.ts +2 -1
  26. package/lib/esm/components/SuggestedEventsWidget/index.js +2 -1
  27. package/lib/umd/{224.js → 401.js} +2 -2
  28. package/lib/umd/react-ui.js +1 -1
  29. package/package.json +7 -7
  30. /package/lib/umd/{224.js.LICENSE.txt → 401.js.LICENSE.txt} +0 -0
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  import { Box, Button, Chip, FormControl, Grid, Icon, InputLabel, MenuItem, Radio, Select, TextField, Typography } from '@mui/material';
4
4
  import { styled } from '@mui/material/styles';
5
5
  import { useThemeProps } from '@mui/system';
6
- import { Endpoints, EventService, http } from '@selfcommunity/api-services';
6
+ import { Endpoints, http } from '@selfcommunity/api-services';
7
7
  import { SCPreferences, SCPreferencesContext, SCUserContext, UserUtils } from '@selfcommunity/react-core';
8
8
  import { SCEventDateFilterType, SCEventSubscriptionStatusType } from '@selfcommunity/types';
9
9
  import { Logger, sortByAttr } from '@selfcommunity/utils';
@@ -16,6 +16,7 @@ import CreateEventButton from '../CreateEventButton';
16
16
  import Event, { EventSkeleton } from '../Event';
17
17
  import Skeleton from '../Events/Skeleton';
18
18
  import { PREFIX } from './constants';
19
+ import PastEventsFilter from './PastEventsFilter';
19
20
  const classes = {
20
21
  root: `${PREFIX}-root`,
21
22
  filters: `${PREFIX}-filters`,
@@ -37,9 +38,10 @@ const Root = styled(Box, {
37
38
  name: PREFIX,
38
39
  slot: 'Root'
39
40
  })(() => ({}));
40
- const ChipRoot = styled(Chip, {
41
+ export const EventsChipRoot = styled(Chip, {
41
42
  name: PREFIX,
42
- slot: 'ChipRoot'
43
+ slot: 'EventsChipRoot',
44
+ shouldForwardProp: (prop) => prop !== 'showFollowed' && prop !== 'showPastEvents'
43
45
  })(() => ({}));
44
46
  /**
45
47
  * > API documentation for the Community-JS Events component. Learn about the available props and the CSS API.
@@ -74,19 +76,15 @@ export default function Events(inProps) {
74
76
  props: inProps,
75
77
  name: PREFIX
76
78
  });
77
- // TODO:
78
- /**
79
- * Add as prop API Endpoint
80
- * endpoint: EndpointType;
81
- */
82
- const { endpointQueryParams = { limit: 8, offset: DEFAULT_PAGINATION_OFFSET }, className, EventComponentProps = { elevation: 0, square: true }, EventSkeletonComponentProps = { elevation: 0, square: true }, showFilters = false, filters, general = true } = props, rest = __rest(props, ["endpointQueryParams", "className", "EventComponentProps", "EventSkeletonComponentProps", "showFilters", "filters", "general"]);
79
+ const { endpoint = Endpoints.SearchEvents, endpointQueryParams = { limit: 8, offset: DEFAULT_PAGINATION_OFFSET }, className, EventComponentProps = { elevation: 0, square: true }, EventSkeletonComponentProps = { elevation: 0, square: true }, showFilters = false, filters, general = true } = props, rest = __rest(props, ["endpoint", "endpointQueryParams", "className", "EventComponentProps", "EventSkeletonComponentProps", "showFilters", "filters", "general"]);
83
80
  // STATE
84
81
  const [events, setEvents] = useState([]);
85
82
  const [loading, setLoading] = useState(true);
86
83
  const [next, setNext] = useState(null);
87
84
  const [search, setSearch] = useState('');
88
85
  const [dateSearch, setDateSearch] = useState(options[0].value);
89
- const [selected, setSelected] = useState(false);
86
+ const [showFollowed, setShowFollowed] = useState(false);
87
+ const [showPastEvents, setShowPastEvents] = useState(false);
90
88
  // CONTEXT
91
89
  const scUserContext = useContext(SCUserContext);
92
90
  const scPreferencesContext = useContext(SCPreferencesContext);
@@ -98,26 +96,31 @@ export default function Events(inProps) {
98
96
  const authUserId = scUserContext.user ? scUserContext.user.id : null;
99
97
  // HANDLERS
100
98
  const handleChipClick = () => {
101
- setSelected(!selected);
99
+ setShowFollowed(!showFollowed);
102
100
  };
103
101
  const handleDeleteClick = () => {
104
- setSelected(false);
102
+ setShowFollowed(false);
103
+ };
104
+ const handleChipPastClick = () => {
105
+ setShowPastEvents(!showPastEvents);
106
+ };
107
+ const handleDeletePastClick = () => {
108
+ setShowPastEvents(false);
105
109
  };
106
110
  /**
107
111
  * Fetches events list
108
112
  */
109
113
  const fetchEvents = () => {
110
- let eventService;
111
- if (general) {
112
- eventService = EventService.searchEvents(Object.assign(Object.assign(Object.assign(Object.assign({}, endpointQueryParams), (search !== '' && { search: search })), (dateSearch !== SCEventDateFilterType.ANY && { date_filter: dateSearch })), (selected && { follows: selected })));
113
- }
114
- else {
115
- eventService = EventService.getUserEvents(Object.assign(Object.assign(Object.assign({}, endpointQueryParams), { subscription_status: SCEventSubscriptionStatusType.GOING }), (search !== '' && { search: search })));
116
- }
117
- eventService
114
+ return http
115
+ .request({
116
+ url: endpoint.url({}),
117
+ method: endpoint.method,
118
+ params: Object.assign(Object.assign({}, endpointQueryParams), (general
119
+ ? Object.assign(Object.assign(Object.assign(Object.assign({}, (search !== '' && { search: search })), (dateSearch !== SCEventDateFilterType.ANY && { date_filter: dateSearch })), (showFollowed && { follows: showFollowed })), (showPastEvents && { past: showPastEvents })) : Object.assign(Object.assign({ subscription_status: SCEventSubscriptionStatusType.GOING }, (showPastEvents && { past: showPastEvents })), (search !== '' && { search: search }))))
120
+ })
118
121
  .then((res) => {
119
- setEvents(res.results);
120
- setNext(res.next);
122
+ setEvents(res.data.results);
123
+ setNext(res.data.next);
121
124
  setLoading(false);
122
125
  })
123
126
  .catch((error) => {
@@ -134,7 +137,7 @@ export default function Events(inProps) {
134
137
  else {
135
138
  fetchEvents();
136
139
  }
137
- }, [contentAvailability, authUserId, search, dateSearch, selected]);
140
+ }, [contentAvailability, authUserId, search, dateSearch, showFollowed, showPastEvents]);
138
141
  const handleNext = useMemo(() => () => {
139
142
  if (!next) {
140
143
  return;
@@ -178,19 +181,19 @@ export default function Events(inProps) {
178
181
  * Renders events list
179
182
  */
180
183
  const filteredEvents = sortByAttr(getFilteredEvents(), 'order');
181
- const c = (_jsxs(_Fragment, { children: [showFilters && (_jsx(Grid, Object.assign({ container: true, className: classes.filters, gap: 2 }, { children: filters ? (filters) : (_jsxs(_Fragment, { children: [_jsx(Grid, Object.assign({ item: true, xs: 12, md: 4 }, { children: _jsx(TextField, { size: 'small', fullWidth: true, value: search, label: _jsx(FormattedMessage, { id: "ui.events.filterByName", defaultMessage: "ui.events.filterByName" }), variant: "outlined", onChange: handleOnChangeFilterName, disabled: loading }) })), _jsx(Grid, Object.assign({ item: true, xs: 12, md: 2 }, { children: _jsxs(FormControl, Object.assign({ fullWidth: true }, { children: [_jsx(InputLabel, { children: _jsx(FormattedMessage, { id: "ui.events.filterByDate", defaultMessage: "ui.events.filterByDate" }) }), _jsx(Select, Object.assign({ size: 'small', label: _jsx(FormattedMessage, { id: "ui.events.filterByDate", defaultMessage: "ui.events.filterByDate" }), value: dateSearch, onChange: handleOnChangeTimeFrame, renderValue: (selected) => options.find((option) => option.value === selected).label }, { children: options.map((option) => (_jsxs(MenuItem, Object.assign({ value: option.value }, { children: [_jsx(Radio, { checked: dateSearch === option.value, value: option.value, name: "radio-button-select", inputProps: { 'aria-label': option.label } }), option.label] }), option.value))) }))] })) })), _jsx(Grid, Object.assign({ item: true, xs: 12, md: 2 }, { children: _jsx(ChipRoot
184
+ const c = (_jsxs(_Fragment, { children: [showFilters && (_jsx(Grid, Object.assign({ container: true, className: classes.filters, gap: 2 }, { children: filters ? (filters) : !general ? (_jsx(Grid, Object.assign({ item: true }, { children: _jsx(PastEventsFilter, { showPastEvents: showPastEvents, handleClick: handleChipPastClick, handleDeleteClick: handleDeletePastClick }) }))) : (_jsxs(_Fragment, { children: [_jsx(Grid, Object.assign({ item: true, xs: 12, md: 4 }, { children: _jsx(TextField, { size: 'small', fullWidth: true, value: search, label: _jsx(FormattedMessage, { id: "ui.events.filterByName", defaultMessage: "ui.events.filterByName" }), variant: "outlined", onChange: handleOnChangeFilterName, disabled: loading }) })), _jsx(Grid, Object.assign({ item: true, xs: 12, md: 2 }, { children: _jsxs(FormControl, Object.assign({ fullWidth: true }, { children: [_jsx(InputLabel, { children: _jsx(FormattedMessage, { id: "ui.events.filterByDate", defaultMessage: "ui.events.filterByDate" }) }), _jsx(Select, Object.assign({ disabled: showPastEvents, size: 'small', label: _jsx(FormattedMessage, { id: "ui.events.filterByDate", defaultMessage: "ui.events.filterByDate" }), value: dateSearch, onChange: handleOnChangeTimeFrame, renderValue: (selected) => options.find((option) => option.value === selected).label }, { children: options.map((option) => (_jsxs(MenuItem, Object.assign({ value: option.value }, { children: [_jsx(Radio, { checked: dateSearch === option.value, value: option.value, name: "radio-button-select", inputProps: { 'aria-label': option.label } }), option.label] }), option.value))) }))] })) })), _jsx(Grid, Object.assign({ item: true }, { children: _jsx(EventsChipRoot
182
185
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
183
186
  // @ts-ignore
184
187
  , {
185
188
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
186
189
  // @ts-ignore
187
- color: selected ? 'secondary' : 'default',
190
+ color: showFollowed ? 'secondary' : 'default',
188
191
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
189
192
  // @ts-ignore
190
- variant: selected ? 'filled' : 'outlined', label: _jsx(FormattedMessage, { id: "ui.events.filterByFollowedInterest", defaultMessage: "ui.events.filterByFollowedInterest" }), onClick: handleChipClick,
193
+ variant: showFollowed ? 'filled' : 'outlined', label: _jsx(FormattedMessage, { id: "ui.events.filterByFollowedInterest", defaultMessage: "ui.events.filterByFollowedInterest" }), onClick: handleChipClick,
191
194
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
192
195
  // @ts-ignore
193
- selected: selected, deleteIcon: selected ? _jsx(Icon, { children: "close" }) : null, onDelete: selected ? handleDeleteClick : null }) }))] })) }))), _jsx(_Fragment, { children: !events.length ? (_jsx(Box, Object.assign({ className: classes.noResults }, { children: (onlyStaffEnabled && !UserUtils.isStaff(scUserContext.user)) ||
196
+ showFollowed: showFollowed, deleteIcon: showFollowed ? _jsx(Icon, { children: "close" }) : null, onDelete: showFollowed ? handleDeleteClick : null }) })), _jsx(Grid, Object.assign({ item: true }, { children: _jsx(PastEventsFilter, { showPastEvents: showPastEvents, handleClick: handleChipPastClick, handleDeleteClick: handleDeletePastClick }) }))] })) }))), _jsx(_Fragment, { children: !events.length ? (_jsx(Box, Object.assign({ className: classes.noResults }, { children: (onlyStaffEnabled && !UserUtils.isStaff(scUserContext.user)) ||
194
197
  (onlyStaffEnabled && UserUtils.isStaff(scUserContext.user) && general) ? (_jsxs(_Fragment, { children: [_jsx(EventSkeleton, Object.assign({}, EventSkeletonComponentProps)), _jsx(Typography, Object.assign({ variant: "body1" }, { children: _jsx(FormattedMessage, { id: "ui.events.noEvents.title", defaultMessage: "ui.events.noEvents.title" }) }))] })) : (_jsxs(_Fragment, { children: [_jsx(EventSkeleton, Object.assign({}, EventSkeletonComponentProps, { actions: _jsx(CreateEventButton, {}) })), _jsx(Typography, Object.assign({ variant: "body1" }, { children: _jsx(FormattedMessage, { id: "ui.events.noEvents.title.onlyStaff", defaultMessage: "ui.events.noEvents.title.onlyStaff" }) }))] })) }))) : (_jsxs(_Fragment, { children: [_jsx(Grid, Object.assign({ container: true, spacing: { xs: 2 }, className: classes.events }, { children: _jsxs(_Fragment, { children: [filteredEvents.map((event) => (_jsx(Grid, Object.assign({ item: true, xs: 12, sm: 8, md: 6, className: classes.item }, { children: _jsx(Event, Object.assign({ event: event, eventId: event.id }, EventComponentProps)) }), event.id))), filteredEvents.length % 2 !== 0 && (_jsx(Grid, Object.assign({ item: true, xs: 12, sm: 8, md: 6, className: classes.itemSkeleton }, { children: _jsx(EventSkeleton, Object.assign({}, EventSkeletonComponentProps, { actions: _jsx(CreateEventButton, Object.assign({ variant: "outlined", color: "primary", size: "small" }, { children: _jsx(FormattedMessage, { id: "ui.events.skeleton.action.add", defaultMessage: "ui.events.skeleton.action.add" }) })) })) }), 'skeleton-item'))] }) })), Boolean(next) && (_jsx(Button, Object.assign({ color: "secondary", variant: "text", onClick: handleNext, className: classes.showMore }, { children: _jsx(FormattedMessage, { id: "ui.events.button.seeMore", defaultMessage: "ui.events.button.seeMore" }) })))] })) })] }));
195
198
  /**
196
199
  * Renders root object (if content availability community option is false and user is anonymous, component is hidden)
@@ -0,0 +1,6 @@
1
+ export interface PastEventsFilterProps {
2
+ showPastEvents: boolean;
3
+ handleClick: () => void;
4
+ handleDeleteClick?: () => void;
5
+ }
6
+ export default function PastEventsFilter(inProps: PastEventsFilterProps): JSX.Element;
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Icon } from '@mui/material';
3
+ import { FormattedMessage } from 'react-intl';
4
+ import { useThemeProps } from '@mui/system';
5
+ import { PREFIX } from './constants';
6
+ import { EventsChipRoot } from './Events';
7
+ export default function PastEventsFilter(inProps) {
8
+ // PROPS
9
+ const props = useThemeProps({
10
+ props: inProps,
11
+ name: PREFIX
12
+ });
13
+ const { showPastEvents, handleClick, handleDeleteClick } = props;
14
+ return (_jsx(EventsChipRoot
15
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
16
+ // @ts-ignore
17
+ , {
18
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
19
+ // @ts-ignore
20
+ color: showPastEvents ? 'secondary' : 'default',
21
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
22
+ // @ts-ignore
23
+ variant: showPastEvents ? 'filled' : 'outlined', label: _jsx(FormattedMessage, { id: "ui.events.filterByPastEvents", defaultMessage: "ui.events.filterByPastEvents" }), onClick: handleClick,
24
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
25
+ // @ts-ignore
26
+ showPastEvents: showPastEvents, deleteIcon: showPastEvents ? _jsx(Icon, { children: "close" }) : null, onDelete: showPastEvents ? handleDeleteClick : undefined }));
27
+ }
@@ -0,0 +1,8 @@
1
+ import { Dispatch, HTMLAttributes, SetStateAction } from 'react';
2
+ export interface ArrowProps {
3
+ type: 'prev' | 'next';
4
+ currentItem: number;
5
+ setCurrentItem: Dispatch<SetStateAction<number>>;
6
+ className?: HTMLAttributes<HTMLButtonElement>['className'];
7
+ }
8
+ export default function Arrow(props: ArrowProps): JSX.Element;
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Icon, IconButton } from '@mui/material';
3
+ import { useCallback, useEffect, useState } from 'react';
4
+ import { useSwiper } from 'swiper/react';
5
+ export default function Arrow(props) {
6
+ const { type, currentItem, setCurrentItem, className } = props;
7
+ // STATE
8
+ const [itemsLength, setItemsLength] = useState(0);
9
+ // HOOKS
10
+ const swiper = useSwiper();
11
+ useEffect(() => {
12
+ setItemsLength(swiper.slides.length);
13
+ }, []);
14
+ const handleChange = useCallback((type) => {
15
+ if (type === 'prev') {
16
+ swiper.slidePrev();
17
+ }
18
+ else {
19
+ swiper.slideNext();
20
+ }
21
+ setCurrentItem(swiper.snapIndex);
22
+ }, [type]);
23
+ if (type === 'prev') {
24
+ return (currentItem > 0 && (_jsx(IconButton, Object.assign({ className: className, size: "medium", onClick: () => handleChange('prev') }, { children: _jsx(Icon, { children: "chevron_left" }) }))));
25
+ }
26
+ return (currentItem < itemsLength - 1 && (_jsx(IconButton, Object.assign({ className: className, size: "medium", onClick: () => handleChange('next') }, { children: _jsx(Icon, { children: "chevron_right" }) }))));
27
+ }
@@ -3,15 +3,15 @@ import { CardActions, CardContent, Skeleton } from '@mui/material';
3
3
  import { styled } from '@mui/system';
4
4
  import 'swiper/css';
5
5
  import { Swiper, SwiperSlide } from 'swiper/react';
6
+ import { SCEventTemplateType } from '../../types/event';
7
+ import { EventSkeleton } from '../Event';
6
8
  import Widget from '../Widget';
7
9
  import { PREFIX } from './constants';
8
- import { EventSkeleton } from '../Event';
9
- import { SCEventTemplateType } from '../../types/event';
10
10
  const classes = {
11
11
  root: `${PREFIX}-skeleton-root`,
12
12
  content: `${PREFIX}-content`,
13
13
  title: `${PREFIX}-title`,
14
- swiper: `${PREFIX}-swiper`,
14
+ swiperSlide: `${PREFIX}-swiper-slide`,
15
15
  actions: `${PREFIX}-actions`
16
16
  };
17
17
  const Root = styled(Widget, {
@@ -20,5 +20,5 @@ const Root = styled(Widget, {
20
20
  overridesResolver: (_props, styles) => styles.skeletonRoot
21
21
  })(() => ({}));
22
22
  export default function SuggestedEventsWidgetSkeleton() {
23
- return (_jsxs(Root, Object.assign({ className: classes.root }, { children: [_jsxs(CardContent, Object.assign({ className: classes.content }, { children: [_jsx(Skeleton, { className: classes.title, animation: "wave", width: "141px", height: "23px" }), _jsx(Swiper, Object.assign({ spaceBetween: 8, slidesPerView: "auto" }, { children: [1, 2, 3, 4, 5, 6, 7].map((_element, i) => (_jsx(SwiperSlide, Object.assign({ className: classes.swiper }, { children: _jsx(EventSkeleton, { template: SCEventTemplateType.PREVIEW, variant: "outlined", actions: _jsx(_Fragment, {}) }) }), i))) }))] })), _jsx(CardActions, Object.assign({ className: classes.actions }, { children: _jsx(Skeleton, { animation: "wave", width: "52px", height: "20px" }) }))] })));
23
+ return (_jsxs(Root, Object.assign({ className: classes.root }, { children: [_jsxs(CardContent, Object.assign({ className: classes.content }, { children: [_jsx(Skeleton, { className: classes.title, animation: "wave", width: "141px", height: "23px" }), _jsx(Swiper, Object.assign({ spaceBetween: 8, slidesPerView: "auto" }, { children: [1, 2, 3, 4, 5, 6, 7].map((_element, i) => (_jsx(SwiperSlide, Object.assign({ className: classes.swiperSlide }, { children: _jsx(EventSkeleton, { template: SCEventTemplateType.PREVIEW, variant: "outlined", actions: _jsx(_Fragment, {}) }) }), i))) }))] })), _jsx(CardActions, Object.assign({ className: classes.actions }, { children: _jsx(Skeleton, { animation: "wave", width: "52px", height: "20px" }) }))] })));
24
24
  }
@@ -1,4 +1,3 @@
1
- import 'swiper/css';
2
1
  import { WidgetProps } from '../Widget';
3
2
  export interface SuggestedEventsWidgetProps extends WidgetProps {
4
3
  /**
@@ -7,21 +7,25 @@ import { Link, SCRoutes, useSCRouting } from '@selfcommunity/react-core';
7
7
  import { Logger } from '@selfcommunity/utils';
8
8
  import { useCallback, useEffect, useState } from 'react';
9
9
  import { FormattedMessage } from 'react-intl';
10
- import 'swiper/css';
10
+ import { Navigation } from 'swiper/modules';
11
11
  import { Swiper, SwiperSlide } from 'swiper/react';
12
12
  import { SCOPE_SC_UI } from '../../constants/Errors';
13
13
  import { DEFAULT_PAGINATION_LIMIT, DEFAULT_PAGINATION_OFFSET } from '../../constants/Pagination';
14
14
  import HiddenPlaceholder from '../../shared/HiddenPlaceholder';
15
+ import { SCEventTemplateType } from '../../types/event';
16
+ import Event from '../Event';
15
17
  import Widget from '../Widget';
18
+ import Arrow from './Arrow';
16
19
  import { PREFIX } from './constants';
17
20
  import Skeleton from './Skeleton';
18
- import { SCEventTemplateType } from '../../types/event';
19
- import Event from '../Event';
20
21
  const classes = {
21
22
  root: `${PREFIX}-root`,
22
23
  content: `${PREFIX}-content`,
23
24
  title: `${PREFIX}-title`,
24
25
  swiper: `${PREFIX}-swiper`,
26
+ swiperSlide: `${PREFIX}-swiper-slide`,
27
+ swiperPrevArrow: `${PREFIX}-swiper-prev-arrow`,
28
+ swiperNextArrow: `${PREFIX}-swiper-next-arrow`,
25
29
  event: `${PREFIX}-event`,
26
30
  actions: `${PREFIX}-actions`,
27
31
  actionButton: `${PREFIX}-action-button`
@@ -41,6 +45,8 @@ export default function SuggestedEventsWidget(inProps) {
41
45
  // STATE
42
46
  const [eventsData, setEventsData] = useState(null);
43
47
  const [loading, setLoading] = useState(true);
48
+ const [showSkeleton, setShowSkeleton] = useState(false);
49
+ const [currentItem, setCurrentItem] = useState(0);
44
50
  // CONTEXT
45
51
  const scRoutingContext = useSCRouting();
46
52
  useEffect(() => {
@@ -54,13 +60,17 @@ export default function SuggestedEventsWidget(inProps) {
54
60
  });
55
61
  }, []);
56
62
  const handleReachEnd = useCallback(() => {
57
- if (eventsData.count > eventsData.results.length) {
63
+ if (eventsData.count > eventsData.results.length && eventsData.next) {
64
+ setShowSkeleton(true);
58
65
  http
59
66
  .request({
60
67
  url: eventsData.next,
61
68
  method: Endpoints.GetEventSuggestedUsers.method
62
69
  })
63
- .then((res) => console.log('*** res ***', res))
70
+ .then((res) => {
71
+ setEventsData(res.data);
72
+ setShowSkeleton(false);
73
+ })
64
74
  .catch((error) => {
65
75
  Logger.error(SCOPE_SC_UI, error);
66
76
  });
@@ -73,5 +83,5 @@ export default function SuggestedEventsWidget(inProps) {
73
83
  if (!eventsData) {
74
84
  return _jsx(HiddenPlaceholder, {});
75
85
  }
76
- 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.suggestedEventsWidget.title", defaultMessage: "ui.suggestedEventsWidget.title" }) })), _jsx(Swiper, Object.assign({ spaceBetween: 8, slidesPerView: "auto", onReachEnd: handleReachEnd }, { children: eventsData === null || eventsData === void 0 ? void 0 : eventsData.results.map((event, i) => (_jsx(SwiperSlide, Object.assign({ className: classes.swiper }, { children: _jsx(Event, { event: event, template: SCEventTemplateType.PREVIEW, actions: _jsx(_Fragment, {}), variant: "outlined", className: classes.event }) }), i))) }))] })), _jsx(CardActions, Object.assign({ className: classes.actions }, { children: _jsx(Button, Object.assign({ component: Link, to: scRoutingContext.url(SCRoutes.EVENT_ROUTE_NAME, {}), className: classes.actionButton }, { children: _jsx(Typography, Object.assign({ variant: "caption" }, { children: _jsx(FormattedMessage, { id: "ui.suggestedEventsWidget.showAll", defaultMessage: "ui.suggestedEventsWidget.showAll" }) })) })) }))] })));
86
+ 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.suggestedEventsWidget.title", defaultMessage: "ui.suggestedEventsWidget.title" }) })), _jsxs(Swiper, Object.assign({ spaceBetween: 8, slidesPerView: "auto", grabCursor: true, modules: [Navigation], onReachEnd: handleReachEnd, className: classes.swiper }, { children: [(showSkeleton ? [...eventsData.results, undefined] : eventsData.results).map((event, i) => (_jsx(SwiperSlide, Object.assign({ className: classes.swiperSlide }, { children: _jsx(Event, { event: event, template: SCEventTemplateType.PREVIEW, actions: _jsx(_Fragment, {}), variant: "outlined", className: classes.event }) }), i))), _jsx(Arrow, { className: classes.swiperPrevArrow, type: "prev", currentItem: currentItem, setCurrentItem: setCurrentItem }), _jsx(Arrow, { className: classes.swiperNextArrow, type: "next", currentItem: currentItem, setCurrentItem: setCurrentItem })] }))] })), _jsx(CardActions, Object.assign({ className: classes.actions }, { children: _jsx(Button, Object.assign({ component: Link, to: scRoutingContext.url(SCRoutes.EVENTS_SUGGESTED_ROUTE_NAME, {}), className: classes.actionButton }, { children: _jsx(Typography, Object.assign({ variant: "caption" }, { children: _jsx(FormattedMessage, { id: "ui.suggestedEventsWidget.showAll", defaultMessage: "ui.suggestedEventsWidget.showAll" }) })) })) }))] })));
77
87
  }
@@ -1,4 +1,5 @@
1
+ import Arrow, { ArrowProps } from './Arrow';
1
2
  import SuggestedEventsWidgetSkeleton from './Skeleton';
2
3
  import SuggestedEventsWidget, { SuggestedEventsWidgetProps } from './SuggestedEventsWidget';
3
4
  export default SuggestedEventsWidget;
4
- export { SuggestedEventsWidgetSkeleton, type SuggestedEventsWidgetProps };
5
+ export { Arrow, SuggestedEventsWidgetSkeleton, type ArrowProps, type SuggestedEventsWidgetProps };
@@ -1,4 +1,5 @@
1
+ import Arrow from './Arrow';
1
2
  import SuggestedEventsWidgetSkeleton from './Skeleton';
2
3
  import SuggestedEventsWidget from './SuggestedEventsWidget';
3
4
  export default SuggestedEventsWidget;
4
- export { SuggestedEventsWidgetSkeleton };
5
+ export { Arrow, SuggestedEventsWidgetSkeleton };