@selfcommunity/react-ui 0.9.1 → 0.10.0-alpha.0

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 (26) hide show
  1. package/lib/cjs/components/CategoryFollowersButton/CategoryFollowersButton.d.ts +2 -2
  2. package/lib/cjs/components/CategoryFollowersButton/CategoryFollowersButton.js +14 -12
  3. package/lib/cjs/components/CreateEventButton/CreateEventButton.d.ts +1 -1
  4. package/lib/cjs/components/CreateEventButton/CreateEventButton.js +1 -1
  5. package/lib/cjs/components/EventParticipantsButton/EventParticipantsButton.js +5 -3
  6. package/lib/cjs/components/Events/Events.js +9 -29
  7. package/lib/cjs/components/Events/PastEventsFilter.js +2 -12
  8. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.d.ts +2 -2
  9. package/lib/cjs/components/GroupMembersButton/GroupMembersButton.js +16 -14
  10. package/lib/cjs/components/SuggestedEventsWidget/Arrow.js +2 -1
  11. package/lib/cjs/utils/buttonCounters.d.ts +1 -0
  12. package/lib/cjs/utils/buttonCounters.js +15 -0
  13. package/lib/esm/components/CategoryFollowersButton/CategoryFollowersButton.d.ts +2 -2
  14. package/lib/esm/components/CategoryFollowersButton/CategoryFollowersButton.js +14 -12
  15. package/lib/esm/components/CreateEventButton/CreateEventButton.d.ts +1 -1
  16. package/lib/esm/components/CreateEventButton/CreateEventButton.js +1 -1
  17. package/lib/esm/components/EventParticipantsButton/EventParticipantsButton.js +5 -3
  18. package/lib/esm/components/Events/Events.js +8 -28
  19. package/lib/esm/components/Events/PastEventsFilter.js +2 -12
  20. package/lib/esm/components/GroupMembersButton/GroupMembersButton.d.ts +2 -2
  21. package/lib/esm/components/GroupMembersButton/GroupMembersButton.js +16 -14
  22. package/lib/esm/components/SuggestedEventsWidget/Arrow.js +2 -1
  23. package/lib/esm/utils/buttonCounters.d.ts +1 -0
  24. package/lib/esm/utils/buttonCounters.js +11 -0
  25. package/lib/umd/react-ui.js +1 -1
  26. package/package.json +7 -7
@@ -1,6 +1,6 @@
1
- import { BaseDialogProps } from '../../shared/BaseDialog';
2
- import { SCCategoryType } from '@selfcommunity/types';
3
1
  import { ButtonProps } from '@mui/material/Button/Button';
2
+ import { SCCategoryType } from '@selfcommunity/types';
3
+ import { BaseDialogProps } from '../../shared/BaseDialog';
4
4
  export interface CategoryFollowersButtonProps extends Pick<ButtonProps, Exclude<keyof ButtonProps, 'onClick' | 'disabled'>> {
5
5
  /**
6
6
  * Category Object
@@ -2,22 +2,23 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const react_1 = require("react");
6
- const styles_1 = require("@mui/material/styles");
7
5
  const material_1 = require("@mui/material");
8
- const BaseDialog_1 = tslib_1.__importDefault(require("../../shared/BaseDialog"));
9
- const react_intl_1 = require("react-intl");
10
- const InfiniteScroll_1 = tslib_1.__importDefault(require("../../shared/InfiniteScroll"));
11
- const User_1 = tslib_1.__importStar(require("../User"));
6
+ const styles_1 = require("@mui/material/styles");
7
+ const useMediaQuery_1 = tslib_1.__importDefault(require("@mui/material/useMediaQuery"));
8
+ const system_1 = require("@mui/system");
12
9
  const api_services_1 = require("@selfcommunity/api-services");
13
10
  const react_core_1 = require("@selfcommunity/react-core");
14
- const AvatarGroupSkeleton_1 = tslib_1.__importDefault(require("../Skeleton/AvatarGroupSkeleton"));
15
- const classnames_1 = tslib_1.__importDefault(require("classnames"));
16
- const system_1 = require("@mui/system");
17
- const useMediaQuery_1 = tslib_1.__importDefault(require("@mui/material/useMediaQuery"));
18
11
  const utils_1 = require("@selfcommunity/utils");
19
- const Errors_1 = require("../../constants/Errors");
12
+ const classnames_1 = tslib_1.__importDefault(require("classnames"));
13
+ const react_1 = require("react");
14
+ const react_intl_1 = require("react-intl");
20
15
  const use_deep_compare_effect_1 = require("use-deep-compare-effect");
16
+ const Errors_1 = require("../../constants/Errors");
17
+ const BaseDialog_1 = tslib_1.__importDefault(require("../../shared/BaseDialog"));
18
+ const InfiniteScroll_1 = tslib_1.__importDefault(require("../../shared/InfiniteScroll"));
19
+ const buttonCounters_1 = require("../../utils/buttonCounters");
20
+ const AvatarGroupSkeleton_1 = tslib_1.__importDefault(require("../Skeleton/AvatarGroupSkeleton"));
21
+ const User_1 = tslib_1.__importStar(require("../User"));
21
22
  const PREFIX = 'SCCategoryFollowersButton';
22
23
  const classes = {
23
24
  root: `${PREFIX}-root`,
@@ -122,9 +123,10 @@ function CategoryFollowersButton(inProps) {
122
123
  const handleToggleDialogOpen = (0, react_1.useMemo)(() => () => {
123
124
  setOpen((prev) => !prev);
124
125
  }, [setOpen]);
126
+ const renderSurplus = (0, react_1.useCallback)(() => (0, buttonCounters_1.numberFormatter)(scCategory.followers_counter), [scCategory]);
125
127
  // RENDER
126
128
  const theme = (0, material_1.useTheme)();
127
129
  const isMobile = (0, useMediaQuery_1.default)(theme.breakpoints.down('md'));
128
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className), onClick: handleToggleDialogOpen, disabled: loading || !scCategory || scCategory.followers_counter === 0 }, rest, { children: loading || !scCategory ? ((0, jsx_runtime_1.jsx)(AvatarGroupSkeleton_1.default, Object.assign({}, rest))) : ((0, jsx_runtime_1.jsx)(material_1.AvatarGroup, Object.assign({ total: scCategory.followers_counter }, { children: followers.map((c) => ((0, jsx_runtime_1.jsx)(material_1.Avatar, { alt: c.username, src: c.avatar }, c.id))) }))) })), open && ((0, jsx_runtime_1.jsx)(DialogRoot, Object.assign({ className: classes.dialogRoot, title: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { defaultMessage: "ui.categoryFollowersButton.dialogTitle", id: "ui.categoryFollowersButton.dialogTitle", values: { total: scCategory.followers_counter } }), onClose: handleToggleDialogOpen, open: open }, DialogProps, { children: (0, jsx_runtime_1.jsx)(InfiniteScroll_1.default, Object.assign({ dataLength: followers.length, next: fetchFollowers, hasMoreNext: next !== null || loading, loaderNext: (0, jsx_runtime_1.jsx)(User_1.UserSkeleton, { elevation: 0 }), height: isMobile ? '100%' : 400, endMessage: (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ className: classes.endMessage }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.categoryFollowersButton.noOtherFollowers", defaultMessage: "ui.categoryFollowersButton.noOtherFollowers" }) })) }, { children: (0, jsx_runtime_1.jsx)(material_1.List, { children: followers.map((follower) => ((0, jsx_runtime_1.jsx)(material_1.ListItem, { children: (0, jsx_runtime_1.jsx)(User_1.default, { elevation: 0, user: follower }) }, follower.id))) }) })) })))] }));
130
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className), onClick: handleToggleDialogOpen, disabled: loading || !scCategory || scCategory.followers_counter === 0 }, rest, { children: loading || !scCategory ? ((0, jsx_runtime_1.jsx)(AvatarGroupSkeleton_1.default, Object.assign({}, rest))) : ((0, jsx_runtime_1.jsx)(material_1.AvatarGroup, Object.assign({ total: scCategory.followers_counter, renderSurplus: renderSurplus }, { children: followers.map((c) => ((0, jsx_runtime_1.jsx)(material_1.Avatar, { alt: c.username, src: c.avatar }, c.id))) }))) })), open && ((0, jsx_runtime_1.jsx)(DialogRoot, Object.assign({ className: classes.dialogRoot, title: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { defaultMessage: "ui.categoryFollowersButton.dialogTitle", id: "ui.categoryFollowersButton.dialogTitle", values: { total: scCategory.followers_counter } }), onClose: handleToggleDialogOpen, open: open }, DialogProps, { children: (0, jsx_runtime_1.jsx)(InfiniteScroll_1.default, Object.assign({ dataLength: followers.length, next: fetchFollowers, hasMoreNext: next !== null || loading, loaderNext: (0, jsx_runtime_1.jsx)(User_1.UserSkeleton, { elevation: 0 }), height: isMobile ? '100%' : 400, endMessage: (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ className: classes.endMessage }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.categoryFollowersButton.noOtherFollowers", defaultMessage: "ui.categoryFollowersButton.noOtherFollowers" }) })) }, { children: (0, jsx_runtime_1.jsx)(material_1.List, { children: followers.map((follower) => ((0, jsx_runtime_1.jsx)(material_1.ListItem, { children: (0, jsx_runtime_1.jsx)(User_1.default, { elevation: 0, user: follower }) }, follower.id))) }) })) })))] }));
129
131
  }
130
132
  exports.default = CategoryFollowersButton;
@@ -1,4 +1,4 @@
1
- import { ButtonProps } from '@mui/material/Button/Button';
1
+ import { ButtonProps } from '@mui/material';
2
2
  import { EventFormDialogProps } from '../EventFormDialog';
3
3
  export interface CreateEventButtonProps extends ButtonProps {
4
4
  /**
@@ -6,11 +6,11 @@ const material_1 = require("@mui/material");
6
6
  const styles_1 = require("@mui/material/styles");
7
7
  const system_1 = require("@mui/system");
8
8
  const react_core_1 = require("@selfcommunity/react-core");
9
+ const types_1 = require("@selfcommunity/types");
9
10
  const classnames_1 = tslib_1.__importDefault(require("classnames"));
10
11
  const react_1 = tslib_1.__importStar(require("react"));
11
12
  const react_intl_1 = require("react-intl");
12
13
  const EventFormDialog_1 = tslib_1.__importDefault(require("../EventFormDialog"));
13
- const types_1 = require("@selfcommunity/types");
14
14
  const PREFIX = 'SCCreateEventButton';
15
15
  const classes = {
16
16
  root: `${PREFIX}-root`
@@ -16,6 +16,7 @@ const use_deep_compare_effect_1 = require("use-deep-compare-effect");
16
16
  const Errors_1 = require("../../constants/Errors");
17
17
  const BaseDialog_1 = tslib_1.__importDefault(require("../../shared/BaseDialog"));
18
18
  const InfiniteScroll_1 = tslib_1.__importDefault(require("../../shared/InfiniteScroll"));
19
+ const buttonCounters_1 = require("../../utils/buttonCounters");
19
20
  const AvatarGroupSkeleton_1 = tslib_1.__importDefault(require("../Skeleton/AvatarGroupSkeleton"));
20
21
  const User_1 = tslib_1.__importStar(require("../User"));
21
22
  const PREFIX = 'SCEventParticipantsButton';
@@ -73,8 +74,8 @@ function EventParticipantsButton(inProps) {
73
74
  const [open, setOpen] = (0, react_1.useState)(false);
74
75
  // HOOKS
75
76
  const { scEvent } = (0, react_core_1.useSCFetchEvent)({ id: eventId, event });
76
- const participantsAvailable = (0, react_1.useMemo)(() => scEvent.privacy === types_1.SCEventPrivacyType.PUBLIC ||
77
- [types_1.SCEventSubscriptionStatusType.SUBSCRIBED, types_1.SCEventSubscriptionStatusType.GOING, types_1.SCEventSubscriptionStatusType.NOT_GOING].indexOf(scEvent.subscription_status) > -1, [scEvent]);
77
+ const participantsAvailable = (0, react_1.useMemo)(() => (scEvent === null || scEvent === void 0 ? void 0 : scEvent.privacy) === types_1.SCEventPrivacyType.PUBLIC ||
78
+ [types_1.SCEventSubscriptionStatusType.SUBSCRIBED, types_1.SCEventSubscriptionStatusType.GOING, types_1.SCEventSubscriptionStatusType.NOT_GOING].indexOf(scEvent === null || scEvent === void 0 ? void 0 : scEvent.subscription_status) > -1, [scEvent]);
78
79
  (0, use_deep_compare_effect_1.useDeepCompareEffectNoCheck)(() => {
79
80
  setFollowers([]);
80
81
  setLoading(true);
@@ -125,12 +126,13 @@ function EventParticipantsButton(inProps) {
125
126
  .catch((error) => utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error))
126
127
  .then(() => setLoading(false));
127
128
  }, [followers, scEvent, next]);
129
+ const renderSurplus = (0, react_1.useCallback)(() => (0, buttonCounters_1.numberFormatter)(followers.length), [followers]);
128
130
  /**
129
131
  * Opens dialog votes
130
132
  */
131
133
  const handleToggleDialogOpen = (0, react_1.useCallback)(() => {
132
134
  setOpen((prev) => !prev);
133
135
  }, [setOpen]);
134
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className), onClick: handleToggleDialogOpen, disabled: loading || !scEvent || scEvent.goings_counter === 0 }, rest, { children: [!hideCaption && ((0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ className: classes.participants, variant: "caption" }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { defaultMessage: "ui.eventParticipantsButton.participants", id: "ui.eventParticipantsButton.participants" }) }))), !followers.length && (loading || !scEvent) ? ((0, jsx_runtime_1.jsx)(AvatarGroupSkeleton_1.default, Object.assign({}, rest, (!participantsAvailable && { skeletonsAnimation: false })))) : ((0, jsx_runtime_1.jsx)(material_1.AvatarGroup, Object.assign({ total: followers.length }, { children: followers.map((c) => ((0, jsx_runtime_1.jsx)(material_1.Avatar, { alt: c.username, src: c.avatar, className: classes.avatar }, c.id))) })))] })), open && ((0, jsx_runtime_1.jsx)(DialogRoot, Object.assign({ className: classes.dialogRoot, title: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { defaultMessage: "ui.eventParticipantsButton.dialogTitle", id: "ui.eventParticipantsButton.dialogTitle", values: { total: scEvent.goings_counter } }), onClose: handleToggleDialogOpen, open: open }, DialogProps, { children: (0, jsx_runtime_1.jsx)(InfiniteScroll_1.default, Object.assign({ dataLength: followers.length, next: fetchFollowers, hasMoreNext: next !== null || loading, loaderNext: (0, jsx_runtime_1.jsx)(User_1.UserSkeleton, { elevation: 0 }), className: classes.infiniteScroll, endMessage: (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ className: classes.endMessage }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.eventParticipantsButton.noOtherParticipants", defaultMessage: "ui.eventParticipantsButton.noOtherParticipants" }) })) }, { children: (0, jsx_runtime_1.jsx)(material_1.List, { children: followers.map((follower) => ((0, jsx_runtime_1.jsx)(material_1.ListItem, { children: (0, jsx_runtime_1.jsx)(User_1.default, { elevation: 0, user: follower }) }, follower.id))) }) })) })))] }));
136
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className), onClick: handleToggleDialogOpen, disabled: loading || !scEvent || scEvent.goings_counter === 0 }, rest, { children: [!hideCaption && ((0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ className: classes.participants, variant: "caption" }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { defaultMessage: "ui.eventParticipantsButton.participants", id: "ui.eventParticipantsButton.participants" }) }))), !followers.length && (loading || !scEvent) ? ((0, jsx_runtime_1.jsx)(AvatarGroupSkeleton_1.default, Object.assign({}, rest, (!participantsAvailable && { skeletonsAnimation: false })))) : ((0, jsx_runtime_1.jsx)(material_1.AvatarGroup, Object.assign({ total: followers.length, renderSurplus: renderSurplus }, { children: followers.map((c) => ((0, jsx_runtime_1.jsx)(material_1.Avatar, { alt: c.username, src: c.avatar, className: classes.avatar }, c.id))) })))] })), open && ((0, jsx_runtime_1.jsx)(DialogRoot, Object.assign({ className: classes.dialogRoot, title: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { defaultMessage: "ui.eventParticipantsButton.dialogTitle", id: "ui.eventParticipantsButton.dialogTitle", values: { total: scEvent.goings_counter } }), onClose: handleToggleDialogOpen, open: open }, DialogProps, { children: (0, jsx_runtime_1.jsx)(InfiniteScroll_1.default, Object.assign({ dataLength: followers.length, next: fetchFollowers, hasMoreNext: next !== null || loading, loaderNext: (0, jsx_runtime_1.jsx)(User_1.UserSkeleton, { elevation: 0 }), className: classes.infiniteScroll, endMessage: (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ className: classes.endMessage }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.eventParticipantsButton.noOtherParticipants", defaultMessage: "ui.eventParticipantsButton.noOtherParticipants" }) })) }, { children: (0, jsx_runtime_1.jsx)(material_1.List, { children: followers.map((follower) => ((0, jsx_runtime_1.jsx)(material_1.ListItem, { children: (0, jsx_runtime_1.jsx)(User_1.default, { elevation: 0, user: follower }) }, follower.id))) }) })) })))] }));
135
137
  }
136
138
  exports.default = EventParticipantsButton;
@@ -4,25 +4,23 @@ exports.EventsChipRoot = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const jsx_runtime_1 = require("react/jsx-runtime");
6
6
  const material_1 = require("@mui/material");
7
- const styles_1 = require("@mui/material/styles");
8
- const system_1 = require("@mui/system");
9
7
  const api_services_1 = require("@selfcommunity/api-services");
10
8
  const react_core_1 = require("@selfcommunity/react-core");
11
9
  const types_1 = require("@selfcommunity/types");
12
10
  const utils_1 = require("@selfcommunity/utils");
13
11
  const classnames_1 = tslib_1.__importDefault(require("classnames"));
12
+ const pubsub_js_1 = tslib_1.__importDefault(require("pubsub-js"));
14
13
  const react_1 = require("react");
15
14
  const react_intl_1 = require("react-intl");
16
15
  const Errors_1 = require("../../constants/Errors");
17
16
  const Pagination_1 = require("../../constants/Pagination");
17
+ const PubSub_1 = require("../../constants/PubSub");
18
18
  const CreateEventButton_1 = tslib_1.__importDefault(require("../CreateEventButton"));
19
19
  const Event_1 = tslib_1.__importStar(require("../Event"));
20
20
  const Skeleton_1 = tslib_1.__importDefault(require("../Events/Skeleton"));
21
21
  const constants_1 = require("./constants");
22
- const PastEventsFilter_1 = tslib_1.__importDefault(require("./PastEventsFilter"));
23
- const pubsub_js_1 = tslib_1.__importDefault(require("pubsub-js"));
24
- const PubSub_1 = require("../../constants/PubSub");
25
22
  const LocationEventsFilter_1 = tslib_1.__importDefault(require("./LocationEventsFilter"));
23
+ const PastEventsFilter_1 = tslib_1.__importDefault(require("./PastEventsFilter"));
26
24
  const classes = {
27
25
  root: `${constants_1.PREFIX}-root`,
28
26
  filters: `${constants_1.PREFIX}-filters`,
@@ -41,11 +39,11 @@ const options = [
41
39
  { value: types_1.SCEventDateFilterType.NEXT_WEEK, label: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.select.nextWeek", defaultMessage: "ui.events.select.nextWeek" }) },
42
40
  { value: types_1.SCEventDateFilterType.THIS_MONTH, label: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.select.thisMonth", defaultMessage: "ui.events.select.thisMonth" }) }
43
41
  ];
44
- const Root = (0, styles_1.styled)(material_1.Box, {
42
+ const Root = (0, material_1.styled)(material_1.Box, {
45
43
  name: constants_1.PREFIX,
46
44
  slot: 'Root'
47
45
  })(() => ({}));
48
- exports.EventsChipRoot = (0, styles_1.styled)(material_1.Chip, {
46
+ exports.EventsChipRoot = (0, material_1.styled)(material_1.Chip, {
49
47
  name: constants_1.PREFIX,
50
48
  slot: 'EventsChipRoot',
51
49
  shouldForwardProp: (prop) => prop !== 'showFollowed' && prop !== 'showPastEvents'
@@ -79,7 +77,7 @@ exports.EventsChipRoot = (0, styles_1.styled)(material_1.Chip, {
79
77
  */
80
78
  function Events(inProps) {
81
79
  // PROPS
82
- const props = (0, system_1.useThemeProps)({
80
+ const props = (0, material_1.useThemeProps)({
83
81
  props: inProps,
84
82
  name: constants_1.PREFIX
85
83
  });
@@ -214,35 +212,17 @@ function Events(inProps) {
214
212
  /**
215
213
  * Renders events list
216
214
  */
217
- const c = ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [showFilters && ((0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ container: true, className: classes.filters, gap: 2 }, { children: filters ? (filters) : !general ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(events.length !== 0 || (events.length === 0 && showMyEvents)) && ((0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true }, { children: (0, jsx_runtime_1.jsx)(exports.EventsChipRoot
218
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
219
- // @ts-ignore
220
- , {
221
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
222
- // @ts-ignore
223
- color: showMyEvents ? 'secondary' : 'default',
224
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
225
- // @ts-ignore
226
- variant: showMyEvents ? 'filled' : 'outlined', label: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.filterByCreatedByMe", defaultMessage: "ui.events.filterByCreatedByMe" }), onClick: () => setShowMyEvents(!showMyEvents),
215
+ const c = ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [showFilters && ((0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ container: true, className: classes.filters, gap: 2 }, { children: filters ? (filters) : !general ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(events.length !== 0 || (events.length === 0 && showMyEvents)) && ((0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true }, { children: (0, jsx_runtime_1.jsx)(exports.EventsChipRoot, { color: showMyEvents ? 'secondary' : 'default', variant: showMyEvents ? 'filled' : 'outlined', label: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.filterByCreatedByMe", defaultMessage: "ui.events.filterByCreatedByMe" }), onClick: () => setShowMyEvents(!showMyEvents),
227
216
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
228
217
  // @ts-ignore
229
- showFollowed: showMyEvents, deleteIcon: showMyEvents ? (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "close" }) : null, onDelete: showMyEvents ? handleDeleteClick : null, autoHide: !loading && !events.length, disabled: loading }) }))), (0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true }, { children: (0, jsx_runtime_1.jsx)(PastEventsFilter_1.default, { showPastEvents: showPastEvents, handleClick: handleChipPastClick, handleDeleteClick: handleDeletePastClick, autoHide: !loading && !events.length && !showPastEvents, disabled: loading }) })), (0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true, xs: 12, md: 2 }, { children: (0, jsx_runtime_1.jsx)(LocationEventsFilter_1.default, { value: location, autoHide: !loading && !events.length, disabled: loading || (!events.length && !location), handleOnChange: handleOnChangeLocation }) }))] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true, xs: 12, md: 3 }, { children: (0, jsx_runtime_1.jsx)(material_1.TextField, { className: classes.search, size: 'small', fullWidth: true, value: query, label: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.filterByName", defaultMessage: "ui.events.filterByName" }), variant: "outlined", onChange: handleOnChangeFilterName, disabled: loading || (!events.length && !query), onKeyUp: (e) => {
218
+ showFollowed: showMyEvents, deleteIcon: showMyEvents ? (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "close" }) : null, onDelete: showMyEvents ? handleDeleteClick : null, disabled: loading }) }))), (0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true }, { children: (0, jsx_runtime_1.jsx)(PastEventsFilter_1.default, { showPastEvents: showPastEvents, handleClick: handleChipPastClick, handleDeleteClick: handleDeletePastClick, autoHide: !loading && !events.length && !showPastEvents, disabled: loading }) })), (0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true, xs: 12, md: 2 }, { children: (0, jsx_runtime_1.jsx)(LocationEventsFilter_1.default, { value: location, autoHide: !loading && !events.length, disabled: loading || (!events.length && !location), handleOnChange: handleOnChangeLocation }) }))] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true, xs: 12, md: 3 }, { children: (0, jsx_runtime_1.jsx)(material_1.TextField, { className: classes.search, size: 'small', fullWidth: true, value: query, label: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.filterByName", defaultMessage: "ui.events.filterByName" }), variant: "outlined", onChange: handleOnChangeFilterName, disabled: loading || (!events.length && !query), onKeyUp: (e) => {
230
219
  e.preventDefault();
231
220
  if (e.key === 'Enter') {
232
221
  fetchEvents(true);
233
222
  }
234
223
  }, InputProps: {
235
224
  endAdornment: ((0, jsx_runtime_1.jsx)(material_1.InputAdornment, Object.assign({ position: "end" }, { children: isMobile ? ((0, jsx_runtime_1.jsx)(material_1.IconButton, Object.assign({ onClick: () => fetchEvents(true), disabled: loading || (!events.length && !query) }, { children: (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "search" }) }))) : ((0, jsx_runtime_1.jsx)(material_1.Button, { size: "small", variant: "contained", color: "secondary", onClick: () => fetchEvents(true), endIcon: (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "search" }), disabled: loading || (!events.length && !query) })) })))
236
- } }) })), (0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true, xs: 12, md: 2 }, { children: (0, jsx_runtime_1.jsxs)(material_1.FormControl, Object.assign({ fullWidth: true }, { children: [(0, jsx_runtime_1.jsx)(material_1.InputLabel, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.filterByDate", defaultMessage: "ui.events.filterByDate" }) }), (0, jsx_runtime_1.jsx)(material_1.Select, Object.assign({ disabled: showPastEvents || loading || (!events.length && dateSearch === types_1.SCEventDateFilterType.ANY), size: 'small', label: (0, jsx_runtime_1.jsx)(react_intl_1.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) => ((0, jsx_runtime_1.jsxs)(material_1.MenuItem, Object.assign({ value: option.value }, { children: [(0, jsx_runtime_1.jsx)(material_1.Radio, { checked: dateSearch === option.value, value: option.value, name: "radio-button-select", inputProps: { 'aria-label': option.label } }), option.label] }), option.value))) }))] })) })), (0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true, xs: 12, md: 2 }, { children: (0, jsx_runtime_1.jsx)(LocationEventsFilter_1.default, { value: location, disabled: loading || (!events.length && !location), handleOnChange: handleOnChangeLocation }) })), authUserId && ((0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true }, { children: (0, jsx_runtime_1.jsx)(exports.EventsChipRoot
237
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
238
- // @ts-ignore
239
- , {
240
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
241
- // @ts-ignore
242
- color: showFollowed ? 'secondary' : 'default',
243
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
244
- // @ts-ignore
245
- variant: showFollowed ? 'filled' : 'outlined', label: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.filterByFollowedInterest", defaultMessage: "ui.events.filterByFollowedInterest" }), onClick: handleChipClick,
225
+ } }) })), (0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true, xs: 12, md: 2 }, { children: (0, jsx_runtime_1.jsxs)(material_1.FormControl, Object.assign({ fullWidth: true }, { children: [(0, jsx_runtime_1.jsx)(material_1.InputLabel, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.filterByDate", defaultMessage: "ui.events.filterByDate" }) }), (0, jsx_runtime_1.jsx)(material_1.Select, Object.assign({ disabled: showPastEvents || loading || (!events.length && dateSearch === types_1.SCEventDateFilterType.ANY), size: 'small', label: (0, jsx_runtime_1.jsx)(react_intl_1.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) => ((0, jsx_runtime_1.jsxs)(material_1.MenuItem, Object.assign({ value: option.value }, { children: [(0, jsx_runtime_1.jsx)(material_1.Radio, { checked: dateSearch === option.value, value: option.value, name: "radio-button-select", inputProps: { 'aria-label': option.label } }), option.label] }), option.value))) }))] })) })), (0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true, xs: 12, md: 2 }, { children: (0, jsx_runtime_1.jsx)(LocationEventsFilter_1.default, { value: location, disabled: loading || (!events.length && !location), handleOnChange: handleOnChangeLocation }) })), authUserId && ((0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true }, { children: (0, jsx_runtime_1.jsx)(exports.EventsChipRoot, { color: showFollowed ? 'secondary' : 'default', variant: showFollowed ? 'filled' : 'outlined', label: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.filterByFollowedInterest", defaultMessage: "ui.events.filterByFollowedInterest" }), onClick: handleChipClick,
246
226
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
247
227
  // @ts-ignore
248
228
  showFollowed: showFollowed, deleteIcon: showFollowed ? (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "close" }) : null, onDelete: showFollowed ? handleDeleteClick : null, disabled: loading || (!events.length && !showFollowed) }) }))), (0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true }, { children: (0, jsx_runtime_1.jsx)(PastEventsFilter_1.default, { showPastEvents: showPastEvents, handleClick: handleChipPastClick, handleDeleteClick: handleDeletePastClick, disabled: dateSearch !== types_1.SCEventDateFilterType.ANY || loading || (!events.length && !showPastEvents) }) }))] })) }))), (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: loading ? ((0, jsx_runtime_1.jsx)(Skeleton_1.default, Object.assign({}, EventsSkeletonComponentProps, { EventSkeletonProps: EventSkeletonComponentProps }))) : ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: !events.length ? ((0, jsx_runtime_1.jsx)(material_1.Box, Object.assign({ className: classes.noResults }, { children: general ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Event_1.EventSkeleton, Object.assign({}, EventSkeletonComponentProps, { skeletonsAnimation: false, actions: (onlyStaffEnabled && react_core_1.UserUtils.isStaff(scUserContext.user)) || !onlyStaffEnabled ? (0, jsx_runtime_1.jsx)(CreateEventButton_1.default, {}) : null })), (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "body1" }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.noEvents.title", defaultMessage: "ui.events.noEvents.title" }) }))] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Event_1.EventSkeleton, Object.assign({}, EventSkeletonComponentProps, { skeletonsAnimation: false, actions: (onlyStaffEnabled && react_core_1.UserUtils.isStaff(scUserContext.user)) || !onlyStaffEnabled ? (0, jsx_runtime_1.jsx)(CreateEventButton_1.default, {}) : null })), (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ variant: "body1" }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.noEvents.title.personal", defaultMessage: "ui.events.noEvents.title.personal" }) }))] })) }))) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ container: true, spacing: { xs: 2 }, className: classes.events }, GridContainerComponentProps, { children: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [events.map((event) => ((0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true, xs: 12, sm: 12, md: 6, className: classes.item }, GridItemComponentProps, { children: (0, jsx_runtime_1.jsx)(Event_1.default, Object.assign({ event: event, eventId: event.id }, EventComponentProps)) }), event.id))), authUserId && events.length % 2 !== 0 && ((0, jsx_runtime_1.jsx)(material_1.Grid, Object.assign({ item: true, xs: 12, sm: 12, md: 6, className: classes.itemSkeleton }, GridItemComponentProps, { children: (0, jsx_runtime_1.jsx)(Event_1.EventSkeleton, Object.assign({}, EventSkeletonComponentProps, { skeletonsAnimation: false, actions: (0, jsx_runtime_1.jsx)(CreateEventButton_1.default, Object.assign({ variant: "outlined", color: "primary", size: "small" }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.skeleton.action.add", defaultMessage: "ui.events.skeleton.action.add" }) })) })) }), 'skeleton-item'))] }) })), Boolean(next) && ((0, jsx_runtime_1.jsx)(material_1.Button, Object.assign({ color: "secondary", variant: "text", onClick: handleNext, className: classes.showMore }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.button.seeMore", defaultMessage: "ui.events.button.seeMore" }) })))] })) })) })] }));
@@ -4,12 +4,11 @@ const tslib_1 = require("tslib");
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const material_1 = require("@mui/material");
6
6
  const react_intl_1 = require("react-intl");
7
- const system_1 = require("@mui/system");
8
7
  const constants_1 = require("./constants");
9
8
  const Events_1 = require("./Events");
10
9
  function PastEventsFilter(inProps) {
11
10
  // PROPS
12
- const props = (0, system_1.useThemeProps)({
11
+ const props = (0, material_1.useThemeProps)({
13
12
  props: inProps,
14
13
  name: constants_1.PREFIX
15
14
  });
@@ -17,16 +16,7 @@ function PastEventsFilter(inProps) {
17
16
  if (autoHide) {
18
17
  return null;
19
18
  }
20
- return ((0, jsx_runtime_1.jsx)(Events_1.EventsChipRoot
21
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
22
- // @ts-ignore
23
- , Object.assign({
24
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
25
- // @ts-ignore
26
- color: showPastEvents ? 'secondary' : 'default',
27
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
28
- // @ts-ignore
29
- variant: showPastEvents ? 'filled' : 'outlined', label: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.filterByPastEvents", defaultMessage: "ui.events.filterByPastEvents" }), onClick: handleClick,
19
+ return ((0, jsx_runtime_1.jsx)(Events_1.EventsChipRoot, Object.assign({ color: showPastEvents ? 'secondary' : 'default', variant: showPastEvents ? 'filled' : 'outlined', label: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.events.filterByPastEvents", defaultMessage: "ui.events.filterByPastEvents" }), onClick: handleClick,
30
20
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
31
21
  // @ts-ignore
32
22
  showPastEvents: showPastEvents, deleteIcon: showPastEvents ? (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "close" }) : null, onDelete: showPastEvents ? handleDeleteClick : undefined }, rest)));
@@ -1,6 +1,6 @@
1
- import { BaseDialogProps } from '../../shared/BaseDialog';
2
- import { SCGroupType } from '@selfcommunity/types';
3
1
  import { ButtonProps } from '@mui/material/Button/Button';
2
+ import { SCGroupType } from '@selfcommunity/types';
3
+ import { BaseDialogProps } from '../../shared/BaseDialog';
4
4
  export interface GroupMembersButtonProps extends Pick<ButtonProps, Exclude<keyof ButtonProps, 'onClick' | 'disabled'>> {
5
5
  /**
6
6
  * Group Object
@@ -2,23 +2,24 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const react_1 = require("react");
6
- const styles_1 = require("@mui/material/styles");
7
5
  const material_1 = require("@mui/material");
8
- const BaseDialog_1 = tslib_1.__importDefault(require("../../shared/BaseDialog"));
9
- const react_intl_1 = require("react-intl");
10
- const InfiniteScroll_1 = tslib_1.__importDefault(require("../../shared/InfiniteScroll"));
11
- const User_1 = tslib_1.__importStar(require("../User"));
6
+ const styles_1 = require("@mui/material/styles");
7
+ const useMediaQuery_1 = tslib_1.__importDefault(require("@mui/material/useMediaQuery"));
8
+ const system_1 = require("@mui/system");
12
9
  const api_services_1 = require("@selfcommunity/api-services");
13
10
  const react_core_1 = require("@selfcommunity/react-core");
14
11
  const types_1 = require("@selfcommunity/types");
15
- const AvatarGroupSkeleton_1 = tslib_1.__importDefault(require("../Skeleton/AvatarGroupSkeleton"));
16
- const classnames_1 = tslib_1.__importDefault(require("classnames"));
17
- const system_1 = require("@mui/system");
18
- const useMediaQuery_1 = tslib_1.__importDefault(require("@mui/material/useMediaQuery"));
19
12
  const utils_1 = require("@selfcommunity/utils");
20
- const Errors_1 = require("../../constants/Errors");
13
+ const classnames_1 = tslib_1.__importDefault(require("classnames"));
14
+ const react_1 = require("react");
15
+ const react_intl_1 = require("react-intl");
21
16
  const use_deep_compare_effect_1 = require("use-deep-compare-effect");
17
+ const Errors_1 = require("../../constants/Errors");
18
+ const BaseDialog_1 = tslib_1.__importDefault(require("../../shared/BaseDialog"));
19
+ const InfiniteScroll_1 = tslib_1.__importDefault(require("../../shared/InfiniteScroll"));
20
+ const buttonCounters_1 = require("../../utils/buttonCounters");
21
+ const AvatarGroupSkeleton_1 = tslib_1.__importDefault(require("../Skeleton/AvatarGroupSkeleton"));
22
+ const User_1 = tslib_1.__importStar(require("../User"));
22
23
  const PREFIX = 'SCGroupMembersButton';
23
24
  const classes = {
24
25
  root: `${PREFIX}-root`,
@@ -28,12 +29,12 @@ const classes = {
28
29
  const Root = (0, styles_1.styled)(material_1.Button, {
29
30
  name: PREFIX,
30
31
  slot: 'Root',
31
- overridesResolver: (props, styles) => styles.root
32
+ overridesResolver: (_props, styles) => styles.root
32
33
  })(() => ({}));
33
34
  const DialogRoot = (0, styles_1.styled)(BaseDialog_1.default, {
34
35
  name: PREFIX,
35
36
  slot: 'Root',
36
- overridesResolver: (props, styles) => styles.dialogRoot
37
+ overridesResolver: (_props, styles) => styles.dialogRoot
37
38
  })(() => ({}));
38
39
  /**
39
40
  *> API documentation for the Community-JS Group Members Button component. Learn about the available props and the CSS API.
@@ -127,9 +128,10 @@ function GroupMembersButton(inProps) {
127
128
  const handleToggleDialogOpen = (0, react_1.useMemo)(() => () => {
128
129
  setOpen((prev) => !prev);
129
130
  }, [setOpen]);
131
+ const renderSurplus = (0, react_1.useCallback)(() => (0, buttonCounters_1.numberFormatter)(scGroup.subscribers_counter), [scGroup]);
130
132
  // RENDER
131
133
  const theme = (0, material_1.useTheme)();
132
134
  const isMobile = (0, useMediaQuery_1.default)(theme.breakpoints.down('md'));
133
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className), onClick: handleToggleDialogOpen, disabled: loading || !scGroup || scGroup.subscribers_counter === 0 }, rest, { children: loading || !scGroup ? ((0, jsx_runtime_1.jsx)(AvatarGroupSkeleton_1.default, Object.assign({}, rest))) : ((0, jsx_runtime_1.jsx)(material_1.AvatarGroup, Object.assign({ total: scGroup.subscribers_counter }, { children: members.map((c) => ((0, jsx_runtime_1.jsx)(material_1.Avatar, { alt: c.username, src: c.avatar }, c.id))) }))) })), open && ((0, jsx_runtime_1.jsx)(DialogRoot, Object.assign({ className: classes.dialogRoot, title: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupMembersButton.dialogTitle", id: "ui.groupMembersButton.dialogTitle", values: { total: scGroup.subscribers_counter } }), onClose: handleToggleDialogOpen, open: open }, DialogProps, { children: (0, jsx_runtime_1.jsx)(InfiniteScroll_1.default, Object.assign({ dataLength: members.length, next: fetchMembers, hasMoreNext: next !== null || loading, loaderNext: (0, jsx_runtime_1.jsx)(User_1.UserSkeleton, { elevation: 0 }), height: isMobile ? '100%' : 400, endMessage: (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ className: classes.endMessage }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.groupMembersButton.noOtherMembers", defaultMessage: "ui.groupMembersButton.noOtherMembers" }) })) }, { children: (0, jsx_runtime_1.jsx)(material_1.List, { children: members.map((member) => ((0, jsx_runtime_1.jsx)(material_1.ListItem, { children: (0, jsx_runtime_1.jsx)(User_1.default, { elevation: 0, user: member, onClick: handleToggleDialogOpen }) }, member.id))) }) })) })))] }));
135
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className), onClick: handleToggleDialogOpen, disabled: loading || !scGroup || scGroup.subscribers_counter === 0 }, rest, { children: loading || !scGroup ? ((0, jsx_runtime_1.jsx)(AvatarGroupSkeleton_1.default, Object.assign({}, rest))) : ((0, jsx_runtime_1.jsx)(material_1.AvatarGroup, Object.assign({ total: scGroup.subscribers_counter, renderSurplus: renderSurplus }, { children: members.map((c) => ((0, jsx_runtime_1.jsx)(material_1.Avatar, { alt: c.username, src: c.avatar }, c.id))) }))) })), open && ((0, jsx_runtime_1.jsx)(DialogRoot, Object.assign({ className: classes.dialogRoot, title: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupMembersButton.dialogTitle", id: "ui.groupMembersButton.dialogTitle", values: { total: scGroup.subscribers_counter } }), onClose: handleToggleDialogOpen, open: open }, DialogProps, { children: (0, jsx_runtime_1.jsx)(InfiniteScroll_1.default, Object.assign({ dataLength: members.length, next: fetchMembers, hasMoreNext: next !== null || loading, loaderNext: (0, jsx_runtime_1.jsx)(User_1.UserSkeleton, { elevation: 0 }), height: isMobile ? '100%' : 400, endMessage: (0, jsx_runtime_1.jsx)(material_1.Typography, Object.assign({ className: classes.endMessage }, { children: (0, jsx_runtime_1.jsx)(react_intl_1.FormattedMessage, { id: "ui.groupMembersButton.noOtherMembers", defaultMessage: "ui.groupMembersButton.noOtherMembers" }) })) }, { children: (0, jsx_runtime_1.jsx)(material_1.List, { children: members.map((member) => ((0, jsx_runtime_1.jsx)(material_1.ListItem, { children: (0, jsx_runtime_1.jsx)(User_1.default, { elevation: 0, user: member, onClick: handleToggleDialogOpen }) }, member.id))) }) })) })))] }));
134
136
  }
135
137
  exports.default = GroupMembersButton;
@@ -25,6 +25,7 @@ function Arrow(props) {
25
25
  if (type === 'prev') {
26
26
  return (currentItem > 0 && ((0, jsx_runtime_1.jsx)(material_1.Button, Object.assign({ variant: "contained", className: className, size: "medium", onClick: () => handleChange('prev') }, { children: (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "chevron_left" }) }))));
27
27
  }
28
- return (currentItem < itemsLength - 1 && ((0, jsx_runtime_1.jsx)(material_1.Button, Object.assign({ variant: "contained", className: className, size: "medium", onClick: () => handleChange('next') }, { children: (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "chevron_right" }) }))));
28
+ return (itemsLength > 2 &&
29
+ currentItem < itemsLength - 1 && ((0, jsx_runtime_1.jsx)(material_1.Button, Object.assign({ variant: "contained", className: className, size: "medium", onClick: () => handleChange('next') }, { children: (0, jsx_runtime_1.jsx)(material_1.Icon, { children: "chevron_right" }) }))));
29
30
  }
30
31
  exports.default = Arrow;
@@ -0,0 +1 @@
1
+ export declare function numberFormatter(num: number): JSX.Element;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.numberFormatter = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ function numberFormatter(num) {
6
+ const surplus = num - 3;
7
+ if (surplus > 999999) {
8
+ return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["+", (Math.abs(surplus) / 1000000).toFixed(1), "M"] });
9
+ }
10
+ else if (num > 999) {
11
+ return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["+", (Math.abs(surplus) / 1000).toFixed(1), "K"] });
12
+ }
13
+ return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["+", surplus] });
14
+ }
15
+ exports.numberFormatter = numberFormatter;
@@ -1,6 +1,6 @@
1
- import { BaseDialogProps } from '../../shared/BaseDialog';
2
- import { SCCategoryType } from '@selfcommunity/types';
3
1
  import { ButtonProps } from '@mui/material/Button/Button';
2
+ import { SCCategoryType } from '@selfcommunity/types';
3
+ import { BaseDialogProps } from '../../shared/BaseDialog';
4
4
  export interface CategoryFollowersButtonProps extends Pick<ButtonProps, Exclude<keyof ButtonProps, 'onClick' | 'disabled'>> {
5
5
  /**
6
6
  * Category Object
@@ -1,21 +1,22 @@
1
1
  import { __rest } from "tslib";
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useEffect, useMemo, useState } from 'react';
4
- import { styled } from '@mui/material/styles';
5
3
  import { Avatar, AvatarGroup, Button, List, ListItem, Typography, useTheme } from '@mui/material';
6
- import BaseDialog from '../../shared/BaseDialog';
7
- import { FormattedMessage } from 'react-intl';
8
- import InfiniteScroll from '../../shared/InfiniteScroll';
9
- import User, { UserSkeleton } from '../User';
4
+ import { styled } from '@mui/material/styles';
5
+ import useMediaQuery from '@mui/material/useMediaQuery';
6
+ import { useThemeProps } from '@mui/system';
10
7
  import { CategoryService, Endpoints, http } from '@selfcommunity/api-services';
11
8
  import { useSCFetchCategory } from '@selfcommunity/react-core';
12
- import AvatarGroupSkeleton from '../Skeleton/AvatarGroupSkeleton';
13
- import classNames from 'classnames';
14
- import { useThemeProps } from '@mui/system';
15
- import useMediaQuery from '@mui/material/useMediaQuery';
16
9
  import { Logger } from '@selfcommunity/utils';
17
- import { SCOPE_SC_UI } from '../../constants/Errors';
10
+ import classNames from 'classnames';
11
+ import { useCallback, useEffect, useMemo, useState } from 'react';
12
+ import { FormattedMessage } from 'react-intl';
18
13
  import { useDeepCompareEffectNoCheck } from 'use-deep-compare-effect';
14
+ import { SCOPE_SC_UI } from '../../constants/Errors';
15
+ import BaseDialog from '../../shared/BaseDialog';
16
+ import InfiniteScroll from '../../shared/InfiniteScroll';
17
+ import { numberFormatter } from '../../utils/buttonCounters';
18
+ import AvatarGroupSkeleton from '../Skeleton/AvatarGroupSkeleton';
19
+ import User, { UserSkeleton } from '../User';
19
20
  const PREFIX = 'SCCategoryFollowersButton';
20
21
  const classes = {
21
22
  root: `${PREFIX}-root`,
@@ -120,8 +121,9 @@ export default function CategoryFollowersButton(inProps) {
120
121
  const handleToggleDialogOpen = useMemo(() => () => {
121
122
  setOpen((prev) => !prev);
122
123
  }, [setOpen]);
124
+ const renderSurplus = useCallback(() => numberFormatter(scCategory.followers_counter), [scCategory]);
123
125
  // RENDER
124
126
  const theme = useTheme();
125
127
  const isMobile = useMediaQuery(theme.breakpoints.down('md'));
126
- return (_jsxs(_Fragment, { children: [_jsx(Root, Object.assign({ className: classNames(classes.root, className), onClick: handleToggleDialogOpen, disabled: loading || !scCategory || scCategory.followers_counter === 0 }, rest, { children: loading || !scCategory ? (_jsx(AvatarGroupSkeleton, Object.assign({}, rest))) : (_jsx(AvatarGroup, Object.assign({ total: scCategory.followers_counter }, { children: followers.map((c) => (_jsx(Avatar, { alt: c.username, src: c.avatar }, c.id))) }))) })), open && (_jsx(DialogRoot, Object.assign({ className: classes.dialogRoot, title: _jsx(FormattedMessage, { defaultMessage: "ui.categoryFollowersButton.dialogTitle", id: "ui.categoryFollowersButton.dialogTitle", values: { total: scCategory.followers_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 }), height: isMobile ? '100%' : 400, endMessage: _jsx(Typography, Object.assign({ className: classes.endMessage }, { children: _jsx(FormattedMessage, { id: "ui.categoryFollowersButton.noOtherFollowers", defaultMessage: "ui.categoryFollowersButton.noOtherFollowers" }) })) }, { children: _jsx(List, { children: followers.map((follower) => (_jsx(ListItem, { children: _jsx(User, { elevation: 0, user: follower }) }, follower.id))) }) })) })))] }));
128
+ return (_jsxs(_Fragment, { children: [_jsx(Root, Object.assign({ className: classNames(classes.root, className), onClick: handleToggleDialogOpen, disabled: loading || !scCategory || scCategory.followers_counter === 0 }, rest, { children: loading || !scCategory ? (_jsx(AvatarGroupSkeleton, Object.assign({}, rest))) : (_jsx(AvatarGroup, Object.assign({ total: scCategory.followers_counter, renderSurplus: renderSurplus }, { children: followers.map((c) => (_jsx(Avatar, { alt: c.username, src: c.avatar }, c.id))) }))) })), open && (_jsx(DialogRoot, Object.assign({ className: classes.dialogRoot, title: _jsx(FormattedMessage, { defaultMessage: "ui.categoryFollowersButton.dialogTitle", id: "ui.categoryFollowersButton.dialogTitle", values: { total: scCategory.followers_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 }), height: isMobile ? '100%' : 400, endMessage: _jsx(Typography, Object.assign({ className: classes.endMessage }, { children: _jsx(FormattedMessage, { id: "ui.categoryFollowersButton.noOtherFollowers", defaultMessage: "ui.categoryFollowersButton.noOtherFollowers" }) })) }, { children: _jsx(List, { children: followers.map((follower) => (_jsx(ListItem, { children: _jsx(User, { elevation: 0, user: follower }) }, follower.id))) }) })) })))] }));
127
129
  }
@@ -1,4 +1,4 @@
1
- import { ButtonProps } from '@mui/material/Button/Button';
1
+ import { ButtonProps } from '@mui/material';
2
2
  import { EventFormDialogProps } from '../EventFormDialog';
3
3
  export interface CreateEventButtonProps extends ButtonProps {
4
4
  /**
@@ -4,11 +4,11 @@ import { Button, Icon } from '@mui/material';
4
4
  import { styled } from '@mui/material/styles';
5
5
  import { useThemeProps } from '@mui/system';
6
6
  import { SCPreferences, SCUserContext, useSCPreferences } from '@selfcommunity/react-core';
7
+ import { SCFeatureName } from '@selfcommunity/types';
7
8
  import classNames from 'classnames';
8
9
  import React, { useContext, useMemo } from 'react';
9
10
  import { FormattedMessage } from 'react-intl';
10
11
  import EventFormDialog from '../EventFormDialog';
11
- import { SCFeatureName } from '@selfcommunity/types';
12
12
  const PREFIX = 'SCCreateEventButton';
13
13
  const classes = {
14
14
  root: `${PREFIX}-root`
@@ -14,6 +14,7 @@ import { useDeepCompareEffectNoCheck } from 'use-deep-compare-effect';
14
14
  import { SCOPE_SC_UI } from '../../constants/Errors';
15
15
  import BaseDialog from '../../shared/BaseDialog';
16
16
  import InfiniteScroll from '../../shared/InfiniteScroll';
17
+ import { numberFormatter } from '../../utils/buttonCounters';
17
18
  import AvatarGroupSkeleton from '../Skeleton/AvatarGroupSkeleton';
18
19
  import User, { UserSkeleton } from '../User';
19
20
  const PREFIX = 'SCEventParticipantsButton';
@@ -71,8 +72,8 @@ export default function EventParticipantsButton(inProps) {
71
72
  const [open, setOpen] = useState(false);
72
73
  // HOOKS
73
74
  const { scEvent } = useSCFetchEvent({ id: eventId, event });
74
- const participantsAvailable = useMemo(() => scEvent.privacy === SCEventPrivacyType.PUBLIC ||
75
- [SCEventSubscriptionStatusType.SUBSCRIBED, SCEventSubscriptionStatusType.GOING, SCEventSubscriptionStatusType.NOT_GOING].indexOf(scEvent.subscription_status) > -1, [scEvent]);
75
+ const participantsAvailable = useMemo(() => (scEvent === null || scEvent === void 0 ? void 0 : scEvent.privacy) === SCEventPrivacyType.PUBLIC ||
76
+ [SCEventSubscriptionStatusType.SUBSCRIBED, SCEventSubscriptionStatusType.GOING, SCEventSubscriptionStatusType.NOT_GOING].indexOf(scEvent === null || scEvent === void 0 ? void 0 : scEvent.subscription_status) > -1, [scEvent]);
76
77
  useDeepCompareEffectNoCheck(() => {
77
78
  setFollowers([]);
78
79
  setLoading(true);
@@ -123,11 +124,12 @@ export default function EventParticipantsButton(inProps) {
123
124
  .catch((error) => Logger.error(SCOPE_SC_UI, error))
124
125
  .then(() => setLoading(false));
125
126
  }, [followers, scEvent, next]);
127
+ const renderSurplus = useCallback(() => numberFormatter(followers.length), [followers]);
126
128
  /**
127
129
  * Opens dialog votes
128
130
  */
129
131
  const handleToggleDialogOpen = useCallback(() => {
130
132
  setOpen((prev) => !prev);
131
133
  }, [setOpen]);
132
- 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" }) }))), !followers.length && (loading || !scEvent) ? (_jsx(AvatarGroupSkeleton, Object.assign({}, rest, (!participantsAvailable && { skeletonsAnimation: false })))) : (_jsx(AvatarGroup, Object.assign({ total: followers.length }, { 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))) }) })) })))] }));
134
+ 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" }) }))), !followers.length && (loading || !scEvent) ? (_jsx(AvatarGroupSkeleton, Object.assign({}, rest, (!participantsAvailable && { skeletonsAnimation: false })))) : (_jsx(AvatarGroup, Object.assign({ total: followers.length, renderSurplus: renderSurplus }, { 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))) }) })) })))] }));
133
135
  }
@@ -1,25 +1,23 @@
1
1
  import { __rest } from "tslib";
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Box, Button, Chip, FormControl, Grid, Icon, IconButton, InputAdornment, InputLabel, MenuItem, Radio, Select, TextField, Typography, useMediaQuery, useTheme } from '@mui/material';
4
- import { styled } from '@mui/material/styles';
5
- import { useThemeProps } from '@mui/system';
3
+ import { Box, Button, Chip, FormControl, Grid, Icon, IconButton, InputAdornment, InputLabel, MenuItem, Radio, Select, styled, TextField, Typography, useMediaQuery, useTheme, useThemeProps } from '@mui/material';
6
4
  import { Endpoints, http } from '@selfcommunity/api-services';
7
5
  import { SCPreferences, SCPreferencesContext, SCUserContext, UserUtils } from '@selfcommunity/react-core';
8
- import { SCEventDateFilterType, SCEventSubscriptionStatusType, SCEventLocationFilterType } from '@selfcommunity/types';
6
+ import { SCEventDateFilterType, SCEventLocationFilterType, SCEventSubscriptionStatusType } from '@selfcommunity/types';
9
7
  import { Logger } from '@selfcommunity/utils';
10
8
  import classNames from 'classnames';
9
+ import PubSub from 'pubsub-js';
11
10
  import { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
12
11
  import { FormattedMessage } from 'react-intl';
13
12
  import { SCOPE_SC_UI } from '../../constants/Errors';
14
13
  import { DEFAULT_PAGINATION_OFFSET } from '../../constants/Pagination';
14
+ import { SCGroupEventType, SCTopicType } from '../../constants/PubSub';
15
15
  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';
20
- import PubSub from 'pubsub-js';
21
- import { SCGroupEventType, SCTopicType } from '../../constants/PubSub';
22
19
  import LocationEventsFilter from './LocationEventsFilter';
20
+ import PastEventsFilter from './PastEventsFilter';
23
21
  const classes = {
24
22
  root: `${PREFIX}-root`,
25
23
  filters: `${PREFIX}-filters`,
@@ -211,35 +209,17 @@ export default function Events(inProps) {
211
209
  /**
212
210
  * Renders events list
213
211
  */
214
- const c = (_jsxs(_Fragment, { children: [showFilters && (_jsx(Grid, Object.assign({ container: true, className: classes.filters, gap: 2 }, { children: filters ? (filters) : !general ? (_jsxs(_Fragment, { children: [(events.length !== 0 || (events.length === 0 && showMyEvents)) && (_jsx(Grid, Object.assign({ item: true }, { children: _jsx(EventsChipRoot
215
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
216
- // @ts-ignore
217
- , {
218
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
219
- // @ts-ignore
220
- color: showMyEvents ? 'secondary' : 'default',
221
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
222
- // @ts-ignore
223
- variant: showMyEvents ? 'filled' : 'outlined', label: _jsx(FormattedMessage, { id: "ui.events.filterByCreatedByMe", defaultMessage: "ui.events.filterByCreatedByMe" }), onClick: () => setShowMyEvents(!showMyEvents),
212
+ const c = (_jsxs(_Fragment, { children: [showFilters && (_jsx(Grid, Object.assign({ container: true, className: classes.filters, gap: 2 }, { children: filters ? (filters) : !general ? (_jsxs(_Fragment, { children: [(events.length !== 0 || (events.length === 0 && showMyEvents)) && (_jsx(Grid, Object.assign({ item: true }, { children: _jsx(EventsChipRoot, { color: showMyEvents ? 'secondary' : 'default', variant: showMyEvents ? 'filled' : 'outlined', label: _jsx(FormattedMessage, { id: "ui.events.filterByCreatedByMe", defaultMessage: "ui.events.filterByCreatedByMe" }), onClick: () => setShowMyEvents(!showMyEvents),
224
213
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
225
214
  // @ts-ignore
226
- showFollowed: showMyEvents, deleteIcon: showMyEvents ? _jsx(Icon, { children: "close" }) : null, onDelete: showMyEvents ? handleDeleteClick : null, autoHide: !loading && !events.length, disabled: loading }) }))), _jsx(Grid, Object.assign({ item: true }, { children: _jsx(PastEventsFilter, { showPastEvents: showPastEvents, handleClick: handleChipPastClick, handleDeleteClick: handleDeletePastClick, autoHide: !loading && !events.length && !showPastEvents, disabled: loading }) })), _jsx(Grid, Object.assign({ item: true, xs: 12, md: 2 }, { children: _jsx(LocationEventsFilter, { value: location, autoHide: !loading && !events.length, disabled: loading || (!events.length && !location), handleOnChange: handleOnChangeLocation }) }))] })) : (_jsxs(_Fragment, { children: [_jsx(Grid, Object.assign({ item: true, xs: 12, md: 3 }, { children: _jsx(TextField, { className: classes.search, size: 'small', fullWidth: true, value: query, label: _jsx(FormattedMessage, { id: "ui.events.filterByName", defaultMessage: "ui.events.filterByName" }), variant: "outlined", onChange: handleOnChangeFilterName, disabled: loading || (!events.length && !query), onKeyUp: (e) => {
215
+ showFollowed: showMyEvents, deleteIcon: showMyEvents ? _jsx(Icon, { children: "close" }) : null, onDelete: showMyEvents ? handleDeleteClick : null, disabled: loading }) }))), _jsx(Grid, Object.assign({ item: true }, { children: _jsx(PastEventsFilter, { showPastEvents: showPastEvents, handleClick: handleChipPastClick, handleDeleteClick: handleDeletePastClick, autoHide: !loading && !events.length && !showPastEvents, disabled: loading }) })), _jsx(Grid, Object.assign({ item: true, xs: 12, md: 2 }, { children: _jsx(LocationEventsFilter, { value: location, autoHide: !loading && !events.length, disabled: loading || (!events.length && !location), handleOnChange: handleOnChangeLocation }) }))] })) : (_jsxs(_Fragment, { children: [_jsx(Grid, Object.assign({ item: true, xs: 12, md: 3 }, { children: _jsx(TextField, { className: classes.search, size: 'small', fullWidth: true, value: query, label: _jsx(FormattedMessage, { id: "ui.events.filterByName", defaultMessage: "ui.events.filterByName" }), variant: "outlined", onChange: handleOnChangeFilterName, disabled: loading || (!events.length && !query), onKeyUp: (e) => {
227
216
  e.preventDefault();
228
217
  if (e.key === 'Enter') {
229
218
  fetchEvents(true);
230
219
  }
231
220
  }, InputProps: {
232
221
  endAdornment: (_jsx(InputAdornment, Object.assign({ position: "end" }, { children: isMobile ? (_jsx(IconButton, Object.assign({ onClick: () => fetchEvents(true), disabled: loading || (!events.length && !query) }, { children: _jsx(Icon, { children: "search" }) }))) : (_jsx(Button, { size: "small", variant: "contained", color: "secondary", onClick: () => fetchEvents(true), endIcon: _jsx(Icon, { children: "search" }), disabled: loading || (!events.length && !query) })) })))
233
- } }) })), _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 || loading || (!events.length && dateSearch === SCEventDateFilterType.ANY), 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(LocationEventsFilter, { value: location, disabled: loading || (!events.length && !location), handleOnChange: handleOnChangeLocation }) })), authUserId && (_jsx(Grid, Object.assign({ item: true }, { children: _jsx(EventsChipRoot
234
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
235
- // @ts-ignore
236
- , {
237
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
238
- // @ts-ignore
239
- color: showFollowed ? 'secondary' : 'default',
240
- // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
241
- // @ts-ignore
242
- variant: showFollowed ? 'filled' : 'outlined', label: _jsx(FormattedMessage, { id: "ui.events.filterByFollowedInterest", defaultMessage: "ui.events.filterByFollowedInterest" }), onClick: handleChipClick,
222
+ } }) })), _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 || loading || (!events.length && dateSearch === SCEventDateFilterType.ANY), 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(LocationEventsFilter, { value: location, disabled: loading || (!events.length && !location), handleOnChange: handleOnChangeLocation }) })), authUserId && (_jsx(Grid, Object.assign({ item: true }, { children: _jsx(EventsChipRoot, { color: showFollowed ? 'secondary' : 'default', variant: showFollowed ? 'filled' : 'outlined', label: _jsx(FormattedMessage, { id: "ui.events.filterByFollowedInterest", defaultMessage: "ui.events.filterByFollowedInterest" }), onClick: handleChipClick,
243
223
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
244
224
  // @ts-ignore
245
225
  showFollowed: showFollowed, deleteIcon: showFollowed ? _jsx(Icon, { children: "close" }) : null, onDelete: showFollowed ? handleDeleteClick : null, disabled: loading || (!events.length && !showFollowed) }) }))), _jsx(Grid, Object.assign({ item: true }, { children: _jsx(PastEventsFilter, { showPastEvents: showPastEvents, handleClick: handleChipPastClick, handleDeleteClick: handleDeletePastClick, disabled: dateSearch !== SCEventDateFilterType.ANY || loading || (!events.length && !showPastEvents) }) }))] })) }))), _jsx(_Fragment, { children: loading ? (_jsx(Skeleton, Object.assign({}, EventsSkeletonComponentProps, { EventSkeletonProps: EventSkeletonComponentProps }))) : (_jsx(_Fragment, { children: !events.length ? (_jsx(Box, Object.assign({ className: classes.noResults }, { children: general ? (_jsxs(_Fragment, { children: [_jsx(EventSkeleton, Object.assign({}, EventSkeletonComponentProps, { skeletonsAnimation: false, actions: (onlyStaffEnabled && UserUtils.isStaff(scUserContext.user)) || !onlyStaffEnabled ? _jsx(CreateEventButton, {}) : null })), _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, { skeletonsAnimation: false, actions: (onlyStaffEnabled && UserUtils.isStaff(scUserContext.user)) || !onlyStaffEnabled ? _jsx(CreateEventButton, {}) : null })), _jsx(Typography, Object.assign({ variant: "body1" }, { children: _jsx(FormattedMessage, { id: "ui.events.noEvents.title.personal", defaultMessage: "ui.events.noEvents.title.personal" }) }))] })) }))) : (_jsxs(_Fragment, { children: [_jsx(Grid, Object.assign({ container: true, spacing: { xs: 2 }, className: classes.events }, GridContainerComponentProps, { children: _jsxs(_Fragment, { children: [events.map((event) => (_jsx(Grid, Object.assign({ item: true, xs: 12, sm: 12, md: 6, className: classes.item }, GridItemComponentProps, { children: _jsx(Event, Object.assign({ event: event, eventId: event.id }, EventComponentProps)) }), event.id))), authUserId && events.length % 2 !== 0 && (_jsx(Grid, Object.assign({ item: true, xs: 12, sm: 12, md: 6, className: classes.itemSkeleton }, GridItemComponentProps, { children: _jsx(EventSkeleton, Object.assign({}, EventSkeletonComponentProps, { skeletonsAnimation: false, 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" }) })))] })) })) })] }));