@selfcommunity/react-ui 0.8.0-embeds.17 → 0.8.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 (69) hide show
  1. package/lib/cjs/components/Composer/TypeSwitchButtonGroup/TypeSwitchButtonGroup.js +1 -1
  2. package/lib/cjs/components/Events/Events.js +15 -5
  3. package/lib/cjs/components/Events/LocationEventsFilter.d.ts +14 -0
  4. package/lib/cjs/components/Events/LocationEventsFilter.js +45 -0
  5. package/lib/cjs/components/Events/PastEventsFilter.js +1 -2
  6. package/lib/cjs/components/Feed/Feed.js +3 -2
  7. package/lib/cjs/components/GroupActionsMenu/index.d.ts +57 -0
  8. package/lib/cjs/components/GroupActionsMenu/index.js +157 -0
  9. package/lib/cjs/components/GroupHeader/GroupHeader.d.ts +6 -0
  10. package/lib/cjs/components/GroupHeader/GroupHeader.js +8 -4
  11. package/lib/cjs/components/Groups/Groups.js +26 -0
  12. package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuDrawer.d.ts +31 -0
  13. package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuDrawer.js +35 -0
  14. package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.d.ts +9 -20
  15. package/lib/cjs/components/NavigationMenuIconButton/NavigationMenuIconButton.js +4 -20
  16. package/lib/cjs/components/NavigationMenuIconButton/index.d.ts +2 -1
  17. package/lib/cjs/components/NavigationMenuIconButton/index.js +3 -1
  18. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.d.ts +5 -0
  19. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.js +2 -2
  20. package/lib/cjs/components/OnBoardingWidget/OnBoardingWidget.d.ts +5 -1
  21. package/lib/cjs/components/OnBoardingWidget/OnBoardingWidget.js +30 -7
  22. package/lib/cjs/components/OnBoardingWidget/Steps/Appearance/Appearance.js +8 -4
  23. package/lib/cjs/components/OnBoardingWidget/Steps/Invite/Invite.js +56 -12
  24. package/lib/cjs/components/PlatformWidget/constants.d.ts +0 -4
  25. package/lib/cjs/components/PlatformWidget/constants.js +1 -5
  26. package/lib/cjs/constants/GroupActionsMenu.d.ts +5 -0
  27. package/lib/cjs/constants/GroupActionsMenu.js +8 -0
  28. package/lib/cjs/index.d.ts +4 -2
  29. package/lib/cjs/index.js +11 -5
  30. package/lib/cjs/shared/EventInfoDetails/index.js +3 -3
  31. package/lib/cjs/shared/InfiniteScroll/index.js +4 -4
  32. package/lib/cjs/shared/Media/Link/DisplayComponent.js +5 -5
  33. package/lib/esm/components/Composer/TypeSwitchButtonGroup/TypeSwitchButtonGroup.js +2 -2
  34. package/lib/esm/components/Events/Events.js +16 -6
  35. package/lib/esm/components/Events/LocationEventsFilter.d.ts +14 -0
  36. package/lib/esm/components/Events/LocationEventsFilter.js +41 -0
  37. package/lib/esm/components/Events/PastEventsFilter.js +1 -2
  38. package/lib/esm/components/Feed/Feed.js +4 -3
  39. package/lib/esm/components/GroupActionsMenu/index.d.ts +57 -0
  40. package/lib/esm/components/GroupActionsMenu/index.js +154 -0
  41. package/lib/esm/components/GroupHeader/GroupHeader.d.ts +6 -0
  42. package/lib/esm/components/GroupHeader/GroupHeader.js +9 -5
  43. package/lib/esm/components/Groups/Groups.js +27 -1
  44. package/lib/esm/components/NavigationMenuIconButton/NavigationMenuDrawer.d.ts +31 -0
  45. package/lib/esm/components/NavigationMenuIconButton/NavigationMenuDrawer.js +32 -0
  46. package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.d.ts +9 -20
  47. package/lib/esm/components/NavigationMenuIconButton/NavigationMenuIconButton.js +6 -22
  48. package/lib/esm/components/NavigationMenuIconButton/index.d.ts +2 -1
  49. package/lib/esm/components/NavigationMenuIconButton/index.js +2 -1
  50. package/lib/esm/components/NavigationToolbar/NavigationToolbar.d.ts +5 -0
  51. package/lib/esm/components/NavigationToolbar/NavigationToolbar.js +2 -2
  52. package/lib/esm/components/OnBoardingWidget/OnBoardingWidget.d.ts +5 -1
  53. package/lib/esm/components/OnBoardingWidget/OnBoardingWidget.js +31 -8
  54. package/lib/esm/components/OnBoardingWidget/Steps/Appearance/Appearance.js +9 -5
  55. package/lib/esm/components/OnBoardingWidget/Steps/Invite/Invite.js +59 -14
  56. package/lib/esm/components/PlatformWidget/constants.d.ts +0 -4
  57. package/lib/esm/components/PlatformWidget/constants.js +0 -4
  58. package/lib/esm/constants/GroupActionsMenu.d.ts +5 -0
  59. package/lib/esm/constants/GroupActionsMenu.js +5 -0
  60. package/lib/esm/index.d.ts +4 -2
  61. package/lib/esm/index.js +5 -3
  62. package/lib/esm/shared/EventInfoDetails/index.js +3 -3
  63. package/lib/esm/shared/InfiniteScroll/index.js +4 -4
  64. package/lib/esm/shared/Media/Link/DisplayComponent.js +5 -5
  65. package/lib/umd/148.js +2 -0
  66. package/lib/umd/react-ui.js +1 -1
  67. package/package.json +9 -9
  68. package/lib/umd/99.js +0 -2
  69. /package/lib/umd/{99.js.LICENSE.txt → 148.js.LICENSE.txt} +0 -0
@@ -2,7 +2,7 @@ import { __rest } from "tslib";
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useCallback, useEffect, useMemo, useRef } from 'react';
4
4
  import { styled } from '@mui/material/styles';
5
- import { Avatar, Box, Icon, Paper, Typography } from '@mui/material';
5
+ import { Avatar, Box, Icon, Paper, Typography, useMediaQuery, useTheme } from '@mui/material';
6
6
  import { SCGroupPrivacyType, SCGroupSubscriptionStatusType } from '@selfcommunity/types';
7
7
  import { SCPreferences, useSCFetchGroup, useSCPreferences, useSCUser } from '@selfcommunity/react-core';
8
8
  import GroupHeaderSkeleton from './Skeleton';
@@ -19,6 +19,7 @@ import GroupSubscribeButton from '../GroupSubscribeButton';
19
19
  import GroupInviteButton from '../GroupInviteButton';
20
20
  import { SCGroupEventType, SCTopicType } from '../../constants/PubSub';
21
21
  import PubSub from 'pubsub-js';
22
+ import GroupActionsMenu from '../GroupActionsMenu';
22
23
  const classes = {
23
24
  root: `${PREFIX}-root`,
24
25
  cover: `${PREFIX}-cover`,
@@ -30,7 +31,8 @@ const classes = {
30
31
  visibility: `${PREFIX}-visibility`,
31
32
  visibilityItem: `${PREFIX}-visibility-item`,
32
33
  members: `${PREFIX}-members`,
33
- membersCounter: `${PREFIX}-members-counter`
34
+ membersCounter: `${PREFIX}-members-counter`,
35
+ multiActions: `${PREFIX}-multi-actions`
34
36
  };
35
37
  const Root = styled(Box, {
36
38
  name: PREFIX,
@@ -74,7 +76,7 @@ export default function GroupHeader(inProps) {
74
76
  props: inProps,
75
77
  name: PREFIX
76
78
  });
77
- const { id = null, className = null, group, groupId = null, ChangePictureProps = {}, ChangeCoverProps = {}, GroupSubscribeButtonProps = {}, GroupMembersButtonProps = {} } = props, rest = __rest(props, ["id", "className", "group", "groupId", "ChangePictureProps", "ChangeCoverProps", "GroupSubscribeButtonProps", "GroupMembersButtonProps"]);
79
+ const { id = null, className = null, group, groupId = null, ChangePictureProps = {}, ChangeCoverProps = {}, GroupSubscribeButtonProps = {}, GroupMembersButtonProps = {}, GroupActionsProps } = props, rest = __rest(props, ["id", "className", "group", "groupId", "ChangePictureProps", "ChangeCoverProps", "GroupSubscribeButtonProps", "GroupMembersButtonProps", "GroupActionsProps"]);
78
80
  // PREFERENCES
79
81
  const scPreferences = useSCPreferences();
80
82
  const visibilityEnabled = useMemo(() => scPreferences.preferences[SCPreferences.CONFIGURATIONS_GROUPS_VISIBILITY_ENABLED].value, [scPreferences.preferences]);
@@ -83,6 +85,8 @@ export default function GroupHeader(inProps) {
83
85
  const scUserContext = useSCUser();
84
86
  // HOOKS
85
87
  const { scGroup, setSCGroup } = useSCFetchGroup({ id: groupId, group });
88
+ const theme = useTheme();
89
+ const isMobile = useMediaQuery(theme.breakpoints.down('md'));
86
90
  // REFS
87
91
  const updatesSubscription = useRef(null);
88
92
  // CONST
@@ -145,7 +149,7 @@ export default function GroupHeader(inProps) {
145
149
  const _backgroundCover = Object.assign({}, (scGroup.emotional_image
146
150
  ? { background: `url('${scGroup.emotional_image}') center / cover` }
147
151
  : { background: `url('${scPreferences.preferences[SCPreferences.IMAGES_USER_DEFAULT_COVER].value}') center / cover` }));
148
- return (_jsxs(Root, Object.assign({ id: id, className: classNames(classes.root, className) }, rest, { children: [_jsxs(Paper, Object.assign({ style: _backgroundCover, classes: { root: classes.cover } }, { children: [_jsx(Box, Object.assign({ className: classes.avatar }, { children: _jsx(Avatar, { children: _jsx("img", { alt: "group", src: scGroup.image_big ? scGroup.image_big : '' }) }) })), isGroupAdmin && (_jsxs(_Fragment, { children: [_jsx(ChangeGroupPicture, Object.assign({ groupId: scGroup.id, onChange: handleChangeAvatar, className: classes.changePicture }, ChangePictureProps)), _jsx("div", Object.assign({ className: classes.changeCover }, { children: _jsx(ChangeGroupCover, Object.assign({ groupId: scGroup.id, onChange: handleChangeCover }, ChangeCoverProps)) }))] }))] })), _jsxs(Box, Object.assign({ className: classes.info }, { children: [isGroupAdmin && _jsx(EditGroupButton, { group: scGroup, groupId: scGroup.id, onEditSuccess: (data) => setSCGroup(data) }), _jsx(Typography, Object.assign({ variant: "h5", className: classes.name }, { children: scGroup.name })), privateEnabled && (_jsxs(Box, Object.assign({ className: classes.visibility }, { children: [privateEnabled && (_jsx(_Fragment, { children: scGroup.privacy === SCGroupPrivacyType.PUBLIC ? (_jsxs(Typography, Object.assign({ className: classes.visibilityItem }, { children: [_jsx(Icon, { children: "public" }), _jsx(FormattedMessage, { id: "ui.groupHeader.visibility.public", defaultMessage: "ui.groupHeader.visibility.public" })] }))) : (_jsxs(Typography, Object.assign({ className: classes.visibilityItem }, { children: [_jsx(Icon, { children: "private" }), _jsx(FormattedMessage, { id: "ui.groupHeader.visibility.private", defaultMessage: "ui.groupHeader.visibility.private" })] }))) })), visibilityEnabled && (_jsxs(_Fragment, { children: [privateEnabled && _jsx(Bullet, {}), scGroup.visible ? (_jsxs(Typography, Object.assign({ className: classes.visibilityItem }, { children: [_jsx(Icon, { children: "visibility" }), _jsx(FormattedMessage, { id: "ui.groupHeader.visibility.visible", defaultMessage: "ui.groupHeader.visibility.visible" })] }))) : (_jsxs(Typography, Object.assign({ className: classes.visibilityItem }, { children: [_jsx(Icon, { children: "visibility_off" }), _jsx(FormattedMessage, { id: "ui.groupHeader.visibility.hidden", defaultMessage: "ui.groupHeader.visibility.hidden" })] })))] }))] }))), _jsx(_Fragment, { children: ((scGroup && scGroup.privacy === SCGroupPrivacyType.PUBLIC) ||
152
+ return (_jsxs(Root, Object.assign({ id: id, className: classNames(classes.root, className) }, rest, { children: [_jsxs(Paper, Object.assign({ style: _backgroundCover, classes: { root: classes.cover } }, { children: [_jsx(Box, Object.assign({ className: classes.avatar }, { children: _jsx(Avatar, { children: _jsx("img", { alt: "group", src: scGroup.image_big ? scGroup.image_big : '' }) }) })), isGroupAdmin && (_jsxs(_Fragment, { children: [_jsx(ChangeGroupPicture, Object.assign({ groupId: scGroup.id, onChange: handleChangeAvatar, className: classes.changePicture }, ChangePictureProps)), _jsx("div", Object.assign({ className: classes.changeCover }, { children: _jsx(ChangeGroupCover, Object.assign({ groupId: scGroup.id, onChange: handleChangeCover }, ChangeCoverProps)) }))] }))] })), _jsxs(Box, Object.assign({ className: classes.info }, { children: [isGroupAdmin && !isMobile && (_jsxs(Box, Object.assign({ className: classes.multiActions }, { children: [_jsx(EditGroupButton, { group: scGroup, groupId: scGroup.id, onEditSuccess: (data) => setSCGroup(data) }), _jsx(GroupActionsMenu, Object.assign({ group: scGroup, onEditSuccess: (data) => setSCGroup(data) }, GroupActionsProps))] }))), _jsx(Typography, Object.assign({ variant: "h5", className: classes.name }, { children: scGroup.name })), privateEnabled && (_jsxs(Box, Object.assign({ className: classes.visibility }, { children: [privateEnabled && (_jsx(_Fragment, { children: scGroup.privacy === SCGroupPrivacyType.PUBLIC ? (_jsxs(Typography, Object.assign({ className: classes.visibilityItem }, { children: [_jsx(Icon, { children: "public" }), _jsx(FormattedMessage, { id: "ui.groupHeader.visibility.public", defaultMessage: "ui.groupHeader.visibility.public" })] }))) : (_jsxs(Typography, Object.assign({ className: classes.visibilityItem }, { children: [_jsx(Icon, { children: "private" }), _jsx(FormattedMessage, { id: "ui.groupHeader.visibility.private", defaultMessage: "ui.groupHeader.visibility.private" })] }))) })), visibilityEnabled && (_jsxs(_Fragment, { children: [privateEnabled && _jsx(Bullet, {}), scGroup.visible ? (_jsxs(Typography, Object.assign({ className: classes.visibilityItem }, { children: [_jsx(Icon, { children: "visibility" }), _jsx(FormattedMessage, { id: "ui.groupHeader.visibility.visible", defaultMessage: "ui.groupHeader.visibility.visible" })] }))) : (_jsxs(Typography, Object.assign({ className: classes.visibilityItem }, { children: [_jsx(Icon, { children: "visibility_off" }), _jsx(FormattedMessage, { id: "ui.groupHeader.visibility.hidden", defaultMessage: "ui.groupHeader.visibility.hidden" })] })))] }))] }))), _jsx(_Fragment, { children: ((scGroup && scGroup.privacy === SCGroupPrivacyType.PUBLIC) ||
149
153
  scGroup.subscription_status === SCGroupSubscriptionStatusType.SUBSCRIBED ||
150
- isGroupAdmin) && (_jsxs(Box, Object.assign({ className: classes.members }, { children: [_jsx(Typography, Object.assign({ className: classes.membersCounter, component: "div" }, { children: _jsx(FormattedMessage, { id: "ui.groupHeader.members", defaultMessage: "ui.groupHeader.members", values: { total: scGroup.subscribers_counter } }) })), _jsx(GroupMembersButton, Object.assign({ groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, group: scGroup, autoHide: !isGroupAdmin }, GroupMembersButtonProps), scGroup.subscribers_counter)] }))) }), isGroupAdmin ? (_jsx(GroupInviteButton, { group: scGroup, groupId: scGroup.id })) : (_jsx(GroupSubscribeButton, Object.assign({ group: scGroup, onSubscribe: handleSubscribe }, GroupSubscribeButtonProps)))] }))] })));
154
+ isGroupAdmin) && (_jsxs(Box, Object.assign({ className: classes.members }, { children: [_jsx(Typography, Object.assign({ className: classes.membersCounter, component: "div" }, { children: _jsx(FormattedMessage, { id: "ui.groupHeader.members", defaultMessage: "ui.groupHeader.members", values: { total: scGroup.subscribers_counter } }) })), _jsx(GroupMembersButton, Object.assign({ groupId: scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, group: scGroup, autoHide: !isGroupAdmin }, GroupMembersButtonProps), scGroup.subscribers_counter)] }))) }), isGroupAdmin ? (_jsxs(Box, { children: [_jsx(GroupInviteButton, { group: scGroup, groupId: scGroup.id }), isMobile && _jsx(GroupActionsMenu, Object.assign({ group: scGroup, onEditSuccess: (data) => setSCGroup(data) }, GroupActionsProps))] })) : (_jsx(GroupSubscribeButton, Object.assign({ group: scGroup, onSubscribe: handleSubscribe }, GroupSubscribeButtonProps)))] }))] })));
151
155
  }
@@ -1,6 +1,6 @@
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';
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { styled } from '@mui/material/styles';
5
5
  import { Box, Button, Grid, TextField, Typography, useMediaQuery, useTheme } from '@mui/material';
6
6
  import { Endpoints, GroupService, http } from '@selfcommunity/api-services';
@@ -16,6 +16,8 @@ import { PREFIX } from './constants';
16
16
  import Group, { GroupSkeleton } from '../Group';
17
17
  import { DEFAULT_PAGINATION_OFFSET } from '../../constants/Pagination';
18
18
  import InfiniteScroll from '../../shared/InfiniteScroll';
19
+ import PubSub from 'pubsub-js';
20
+ import { SCGroupEventType, SCTopicType } from '../../constants/PubSub';
19
21
  const classes = {
20
22
  root: `${PREFIX}-root`,
21
23
  filters: `${PREFIX}-filter`,
@@ -83,6 +85,8 @@ export default function Groups(inProps) {
83
85
  scPreferencesContext.preferences[SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY].value, [scPreferencesContext.preferences]);
84
86
  // CONST
85
87
  const authUserId = scUserContext.user ? scUserContext.user.id : null;
88
+ // REFS
89
+ const updatesSubscription = useRef(null);
86
90
  // HANDLERS
87
91
  const handleScrollUp = () => {
88
92
  window.scrollTo({ left: 0, top: 0, behavior: 'smooth' });
@@ -119,6 +123,28 @@ export default function Groups(inProps) {
119
123
  fetchGroups();
120
124
  }
121
125
  }, [contentAvailability, authUserId, search]);
126
+ /**
127
+ * Subscriber for pubsub callback
128
+ */
129
+ const onDeleteGroupHandler = useCallback((_msg, deleted) => {
130
+ setGroups((prev) => {
131
+ if (prev.some((e) => e.id === deleted)) {
132
+ return prev.filter((e) => e.id !== deleted);
133
+ }
134
+ return prev;
135
+ });
136
+ }, [groups]);
137
+ /**
138
+ * On mount, subscribe to receive event updates (only delete)
139
+ */
140
+ useEffect(() => {
141
+ if (groups) {
142
+ updatesSubscription.current = PubSub.subscribe(`${SCTopicType.GROUP}.${SCGroupEventType.DELETE}`, onDeleteGroupHandler);
143
+ }
144
+ return () => {
145
+ updatesSubscription.current && PubSub.unsubscribe(updatesSubscription.current);
146
+ };
147
+ }, [groups]);
122
148
  const handleNext = useMemo(() => () => {
123
149
  if (!next) {
124
150
  return;
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+ import { DrawerProps } from '@mui/material';
3
+ export interface NavigationMenuDrawerProps extends DrawerProps {
4
+ /**
5
+ * Hide drawer header
6
+ * @default true
7
+ */
8
+ showDrawerHeader?: boolean;
9
+ /**
10
+ * Custom Drawer header content
11
+ * @default null
12
+ */
13
+ drawerHeaderContent?: React.ReactNode;
14
+ /**
15
+ * Custom Drawer content
16
+ * @default null
17
+ */
18
+ drawerContent?: React.ReactNode;
19
+ /**
20
+ * Props to spread to ScrollContainer component
21
+ * This lib use 'react-custom-scrollbars' component to perform scrollbars
22
+ * For more info: https://github.com/malte-wessel/react-custom-scrollbars/blob/master/docs/API.md
23
+ * @default {}
24
+ */
25
+ ScrollContainerProps?: Record<string, any>;
26
+ /**
27
+ * Any other properties
28
+ */
29
+ [p: string]: any;
30
+ }
31
+ export default function NavigationMenuDrawer(inProps: NavigationMenuDrawerProps): JSX.Element;
@@ -0,0 +1,32 @@
1
+ import { __rest } from "tslib";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { styled } from '@mui/material/styles';
4
+ import { Box, Divider, Drawer, Icon, IconButton, List } from '@mui/material';
5
+ import classNames from 'classnames';
6
+ import { useThemeProps } from '@mui/system';
7
+ import ScrollContainer from '../../shared/ScrollContainer';
8
+ import DefaultDrawerContent from './DefaultDrawerContent';
9
+ import DefaultHeaderContent from './DefaultHeaderContent';
10
+ const PREFIX = 'SCNavigationMenuDrawer';
11
+ const classes = {
12
+ root: `${PREFIX}-root`,
13
+ logo: `${PREFIX}-logo`,
14
+ drawerRoot: `${PREFIX}-drawer-root`,
15
+ drawerHeader: `${PREFIX}-drawer-header`,
16
+ drawerHeaderAction: `${PREFIX}-drawer-header-action`,
17
+ drawerContent: `${PREFIX}-drawer-content`
18
+ };
19
+ const Root = styled(Drawer, {
20
+ name: PREFIX,
21
+ slot: 'Root',
22
+ overridesResolver: (props, styles) => styles.root
23
+ })(({ theme }) => ({}));
24
+ export default function NavigationMenuDrawer(inProps) {
25
+ // PROPS
26
+ const props = useThemeProps({
27
+ props: inProps,
28
+ name: PREFIX
29
+ });
30
+ const { className = null, showDrawerHeader = true, drawerHeaderContent = _jsx(DefaultHeaderContent, {}), drawerContent = _jsx(DefaultDrawerContent, {}), ScrollContainerProps = {}, open, onClose } = props, rest = __rest(props, ["className", "showDrawerHeader", "drawerHeaderContent", "drawerContent", "ScrollContainerProps", "open", "onClose"]);
31
+ return (_jsxs(Root, Object.assign({ anchor: "left", className: classNames(classes.root, className), open: open, onClose: onClose }, rest, { children: [showDrawerHeader && (_jsxs(_Fragment, { children: [_jsxs(Box, Object.assign({ className: classes.drawerHeader }, { children: [drawerHeaderContent, _jsx(IconButton, Object.assign({ className: classes.drawerHeaderAction, onClick: onClose }, { children: _jsx(Icon, { children: "close" }) }))] })), _jsx(Divider, {})] })), _jsx(ScrollContainer, Object.assign({}, ScrollContainerProps, { children: _jsx(List, Object.assign({ className: classes.drawerContent, onClick: onClose }, { children: drawerContent })) }))] })));
32
+ }
@@ -1,28 +1,21 @@
1
- import React from 'react';
2
- import { DrawerProps, IconButtonProps } from '@mui/material';
1
+ import { IconButtonProps } from '@mui/material';
2
+ import { NavigationMenuDrawerProps } from './NavigationMenuDrawer';
3
3
  export interface NavigationMenuIconButtonProps extends IconButtonProps {
4
4
  /**
5
- * Props to spread to drawer element
6
- * @default {anchor: 'left'}
5
+ * Prop to show/hide the default drawer component
6
+ * @default true
7
7
  */
8
- DrawerProps?: DrawerProps;
8
+ showDrawer?: boolean;
9
9
  /**
10
- * Custom Drawer header content
10
+ * Callback triggered on menu click
11
11
  * @default null
12
12
  */
13
- drawerHeaderContent?: React.ReactNode;
13
+ onMenuIconClick?: () => void;
14
14
  /**
15
- * Custom Drawer content
16
- * @default null
17
- */
18
- drawerContent?: React.ReactNode;
19
- /**
20
- * Props to spread to ScrollContainer component
21
- * This lib use 'react-custom-scrollbars' component to perform scrollbars
22
- * For more info: https://github.com/malte-wessel/react-custom-scrollbars/blob/master/docs/API.md
15
+ * Props to spread to default drawer root
23
16
  * @default {}
24
17
  */
25
- ScrollContainerProps?: Record<string, any>;
18
+ DrawerProps?: NavigationMenuDrawerProps;
26
19
  }
27
20
  /**
28
21
  * > API documentation for the Community-JS Navigation Menu Icon Button component. Learn about the available props and the CSS API.
@@ -43,10 +36,6 @@ export interface NavigationMenuIconButtonProps extends IconButtonProps {
43
36
  |Rule Name|Global class|Description|
44
37
  |---|---|---|
45
38
  |root|.SCNavigationMenuIconButton-root|Styles applied to the root element.|
46
- |drawerRoot|.SCNavigationMenuIconButton-drawer-root|Styles applied to the drawer root element.|
47
- |drawerHeader|.SCNavigationMenuIconButton-drawer-header|Styles applied to the drawer header.|
48
- |drawerHeaderAction|.SCNavigationMenuIconButton-drawer-header-action|Styles applied to the drawer header action element.|
49
- |drawerContent|.SCNavigationMenuIconButton-drawer-content|Styles applied to the drawer content.|
50
39
 
51
40
  * @param inProps
52
41
  */
@@ -1,33 +1,21 @@
1
1
  import { __rest } from "tslib";
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useCallback, useState } from 'react';
4
4
  import { styled } from '@mui/material/styles';
5
- import { Box, Divider, Drawer, Icon, IconButton, List } from '@mui/material';
5
+ import { Icon, IconButton } from '@mui/material';
6
6
  import classNames from 'classnames';
7
7
  import { useThemeProps } from '@mui/system';
8
- import ScrollContainer from '../../shared/ScrollContainer';
9
- import DefaultDrawerContent from './DefaultDrawerContent';
10
- import DefaultHeaderContent from './DefaultHeaderContent';
11
8
  import { SCPreferences, useSCPreferences, useSCUser } from '@selfcommunity/react-core';
9
+ import NavigationMenuDrawer from './NavigationMenuDrawer';
12
10
  const PREFIX = 'SCNavigationMenuIconButton';
13
11
  const classes = {
14
- root: `${PREFIX}-root`,
15
- logo: `${PREFIX}-logo`,
16
- drawerRoot: `${PREFIX}-drawer-root`,
17
- drawerHeader: `${PREFIX}-drawer-header`,
18
- drawerHeaderAction: `${PREFIX}-drawer-header-action`,
19
- drawerContent: `${PREFIX}-drawer-content`
12
+ root: `${PREFIX}-root`
20
13
  };
21
14
  const Root = styled(IconButton, {
22
15
  name: PREFIX,
23
16
  slot: 'Root',
24
17
  overridesResolver: (props, styles) => styles.root
25
18
  })(({ theme }) => ({}));
26
- const DrawerRoot = styled(Drawer, {
27
- name: PREFIX,
28
- slot: 'Root',
29
- overridesResolver: (props, styles) => styles.drawerRoot
30
- })(({ theme }) => ({}));
31
19
  /**
32
20
  * > API documentation for the Community-JS Navigation Menu Icon Button component. Learn about the available props and the CSS API.
33
21
 
@@ -47,10 +35,6 @@ const DrawerRoot = styled(Drawer, {
47
35
  |Rule Name|Global class|Description|
48
36
  |---|---|---|
49
37
  |root|.SCNavigationMenuIconButton-root|Styles applied to the root element.|
50
- |drawerRoot|.SCNavigationMenuIconButton-drawer-root|Styles applied to the drawer root element.|
51
- |drawerHeader|.SCNavigationMenuIconButton-drawer-header|Styles applied to the drawer header.|
52
- |drawerHeaderAction|.SCNavigationMenuIconButton-drawer-header-action|Styles applied to the drawer header action element.|
53
- |drawerContent|.SCNavigationMenuIconButton-drawer-content|Styles applied to the drawer content.|
54
38
 
55
39
  * @param inProps
56
40
  */
@@ -61,7 +45,7 @@ export default function NavigationMenuIconButton(inProps) {
61
45
  props: inProps,
62
46
  name: PREFIX
63
47
  });
64
- const { className = null, DrawerProps = { anchor: 'left' }, drawerHeaderContent = _jsx(DefaultHeaderContent, {}), drawerContent = _jsx(DefaultDrawerContent, {}), ScrollContainerProps = {} } = props, rest = __rest(props, ["className", "DrawerProps", "drawerHeaderContent", "drawerContent", "ScrollContainerProps"]);
48
+ const { className = null, DrawerProps = {}, onMenuIconClick = null, showDrawer = true } = props, rest = __rest(props, ["className", "DrawerProps", "onMenuIconClick", "showDrawer"]);
65
49
  // STATE
66
50
  const [anchorEl, setAnchorEl] = useState(null);
67
51
  // CONTEXT
@@ -77,5 +61,5 @@ export default function NavigationMenuIconButton(inProps) {
77
61
  if (!preferences[SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY].value && !((_a = scUserContext.user) === null || _a === void 0 ? void 0 : _a.id)) {
78
62
  return null;
79
63
  }
80
- return (_jsxs(_Fragment, { children: [_jsx(Root, Object.assign({ className: classNames(classes.root, className) }, rest, { onClick: handleOpen }, { children: _jsx(Icon, { children: "menu" }) })), _jsxs(DrawerRoot, Object.assign({ className: classes.drawerRoot }, DrawerProps, { open: Boolean(anchorEl), onClose: handleClose }, { children: [_jsxs(Box, Object.assign({ className: classes.drawerHeader }, { children: [drawerHeaderContent, _jsx(IconButton, Object.assign({ className: classes.drawerHeaderAction, onClick: handleClose }, { children: _jsx(Icon, { children: "close" }) }))] })), _jsx(Divider, {}), _jsx(ScrollContainer, Object.assign({}, ScrollContainerProps, { children: _jsx(List, Object.assign({ className: classes.drawerContent, onClick: handleClose }, { children: drawerContent })) }))] }))] }));
64
+ return (_jsxs(_Fragment, { children: [_jsx(Root, Object.assign({ className: classNames(classes.root, className) }, rest, { onClick: onMenuIconClick !== null && onMenuIconClick !== void 0 ? onMenuIconClick : handleOpen }, { children: _jsx(Icon, { children: "menu" }) })), showDrawer && _jsx(NavigationMenuDrawer, Object.assign({ open: Boolean(anchorEl), onClose: handleClose }, DrawerProps))] }));
81
65
  }
@@ -1,5 +1,6 @@
1
1
  import NavigationMenuIconButton, { NavigationMenuIconButtonProps } from './NavigationMenuIconButton';
2
2
  import DefaultHeaderContent from './DefaultHeaderContent';
3
3
  import DefaultDrawerContent from './DefaultDrawerContent';
4
+ import NavigationMenuDrawer, { NavigationMenuDrawerProps } from './NavigationMenuDrawer';
4
5
  export default NavigationMenuIconButton;
5
- export { NavigationMenuIconButtonProps, DefaultDrawerContent as NavigationMenuContent, DefaultHeaderContent as NavigationMenuHeader };
6
+ export { NavigationMenuIconButtonProps, DefaultDrawerContent as NavigationMenuContent, DefaultHeaderContent as NavigationMenuHeader, NavigationMenuDrawer, NavigationMenuDrawerProps };
@@ -1,5 +1,6 @@
1
1
  import NavigationMenuIconButton from './NavigationMenuIconButton';
2
2
  import DefaultHeaderContent from './DefaultHeaderContent';
3
3
  import DefaultDrawerContent from './DefaultDrawerContent';
4
+ import NavigationMenuDrawer from './NavigationMenuDrawer';
4
5
  export default NavigationMenuIconButton;
5
- export { DefaultDrawerContent as NavigationMenuContent, DefaultHeaderContent as NavigationMenuHeader };
6
+ export { DefaultDrawerContent as NavigationMenuContent, DefaultHeaderContent as NavigationMenuHeader, NavigationMenuDrawer };
@@ -34,6 +34,11 @@ export interface NavigationToolbarProps extends ToolbarProps {
34
34
  * Component for Navigation Menu Icon Button
35
35
  */
36
36
  NavigationMenuIconButtonComponent?: (inProps: NavigationMenuIconButtonProps) => JSX.Element;
37
+ /**
38
+ * Props to spread to the NavigationMenuIconButtonComponent
39
+ * @default {}
40
+ */
41
+ NavigationMenuIconButtonComponentProps?: NavigationMenuIconButtonProps;
37
42
  /**
38
43
  * Component for Navigation Settings
39
44
  */
@@ -96,7 +96,7 @@ export default function NavigationToolbar(inProps) {
96
96
  props: inProps,
97
97
  name: PREFIX
98
98
  });
99
- const { value = '', className = '', disableSearch = false, disableComposer = false, SearchAutocompleteProps = {}, startActions = null, endActions = null, NavigationSettingsIconButtonComponent = NavigationSettingsIconButton, NavigationMenuIconButtonComponent = NavigationMenuIconButton, children = null, NotificationMenuProps = {}, ComposerIconButtonProps = {}, onOpenNotificationMenu, onCloseNotificationMenu } = props, rest = __rest(props, ["value", "className", "disableSearch", "disableComposer", "SearchAutocompleteProps", "startActions", "endActions", "NavigationSettingsIconButtonComponent", "NavigationMenuIconButtonComponent", "children", "NotificationMenuProps", "ComposerIconButtonProps", "onOpenNotificationMenu", "onCloseNotificationMenu"]);
99
+ const { value = '', className = '', disableSearch = false, disableComposer = false, SearchAutocompleteProps = {}, startActions = null, endActions = null, NavigationSettingsIconButtonComponent = NavigationSettingsIconButton, NavigationMenuIconButtonComponentProps = {}, NavigationMenuIconButtonComponent = NavigationMenuIconButton, children = null, NotificationMenuProps = {}, ComposerIconButtonProps = {}, onOpenNotificationMenu, onCloseNotificationMenu } = props, rest = __rest(props, ["value", "className", "disableSearch", "disableComposer", "SearchAutocompleteProps", "startActions", "endActions", "NavigationSettingsIconButtonComponent", "NavigationMenuIconButtonComponentProps", "NavigationMenuIconButtonComponent", "children", "NotificationMenuProps", "ComposerIconButtonProps", "onOpenNotificationMenu", "onCloseNotificationMenu"]);
100
100
  // CONTEXT
101
101
  const scUserContext = useSCUser();
102
102
  const scRoutingContext = useSCRouting();
@@ -145,7 +145,7 @@ export default function NavigationToolbar(inProps) {
145
145
  }), "aria-label": "Groups", to: scRoutingContext.url(SCRoutes.GROUPS_SUBSCRIBED_ROUTE_NAME, {}), component: Link }, { children: _jsx(Icon, { children: "groups" }) }))), eventsEnabled && (_jsx(IconButton, Object.assign({ className: classNames(classes.events, {
146
146
  [classes.active]: value.startsWith(scRoutingContext.url(SCRoutes.EVENTS_ROUTE_NAME, {}))
147
147
  }), "aria-label": "Groups", to: scRoutingContext.url(SCRoutes.EVENTS_ROUTE_NAME, {}), component: Link }, { children: _jsx(Icon, { children: "CalendarIcon" }) })))] })));
148
- return (_jsxs(Root, Object.assign({ className: classNames(className, classes.root) }, rest, { children: [_jsx(NavigationMenuIconButtonComponent, {}), _jsx(Link, Object.assign({ to: scRoutingContext.url(SCRoutes.HOME_ROUTE_NAME, {}), className: classes.logo }, { children: _jsx("img", { src: preferences[SCPreferences.LOGO_NAVBAR_LOGO], alt: "logo" }) })), !scUserContext.user && !preferences[SCPreferences.ADDONS_CLOSED_COMMUNITY] && (_jsx(Button, Object.assign({ color: "inherit", component: Link, to: scRoutingContext.url(SCRoutes.SIGNUP_ROUTE_NAME, {}), className: classes.register }, { children: _jsx(FormattedMessage, { id: "ui.appBar.navigation.register", defaultMessage: "ui.appBar.navigation.register" }) }))), preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_ENABLED] && (_jsx(_Fragment, { children: preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_TEXT] ? (_jsx(Tooltip, Object.assign({ title: preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_TEXT] }, { children: _jsx(Link, Object.assign({ target: "blank", to: preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_URL], className: classes.customItem }, { children: _jsx("img", { src: preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_IMAGE], alt: "custom_item" }) })) }))) : (_jsx(Link, Object.assign({ target: "blank", to: preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_URL], className: classes.customItem }, { children: _jsx("img", { src: preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_IMAGE], alt: "custom_item" }) }))) })), _children, (preferences[SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY] || scUserContext.user) && !disableSearch ? (_jsx(SearchAutocomplete, Object.assign({ className: classes.search, blurOnSelect: true }, SearchAutocompleteProps))) : (_jsx(Box, { className: classes.search })), startActions, scUserContext.user ? (_jsxs(_Fragment, { children: [showComposer && _jsx(ComposerIconButton, Object.assign({ className: classes.composer }, ComposerIconButtonProps)), _jsx(Tooltip, Object.assign({ title: scUserContext.user.username }, { children: _jsx(IconButton, Object.assign({ component: Link, to: scRoutingContext.url(SCRoutes.USER_PROFILE_ROUTE_NAME, scUserContext.user), "aria-label": "Profile", className: classes.profile }, { children: _jsx(Avatar, { alt: scUserContext.user.username, src: scUserContext.user.avatar }) })) })), _jsxs(_Fragment, { children: [_jsx(IconButton, Object.assign({ className: classNames(classes.notification, {
148
+ return (_jsxs(Root, Object.assign({ className: classNames(className, classes.root) }, rest, { children: [_jsx(NavigationMenuIconButtonComponent, Object.assign({}, NavigationMenuIconButtonComponentProps)), _jsx(Link, Object.assign({ to: scRoutingContext.url(SCRoutes.HOME_ROUTE_NAME, {}), className: classes.logo }, { children: _jsx("img", { src: preferences[SCPreferences.LOGO_NAVBAR_LOGO], alt: "logo" }) })), !scUserContext.user && !preferences[SCPreferences.ADDONS_CLOSED_COMMUNITY] && (_jsx(Button, Object.assign({ color: "inherit", component: Link, to: scRoutingContext.url(SCRoutes.SIGNUP_ROUTE_NAME, {}), className: classes.register }, { children: _jsx(FormattedMessage, { id: "ui.appBar.navigation.register", defaultMessage: "ui.appBar.navigation.register" }) }))), preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_ENABLED] && (_jsx(_Fragment, { children: preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_TEXT] ? (_jsx(Tooltip, Object.assign({ title: preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_TEXT] }, { children: _jsx(Link, Object.assign({ target: "blank", to: preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_URL], className: classes.customItem }, { children: _jsx("img", { src: preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_IMAGE], alt: "custom_item" }) })) }))) : (_jsx(Link, Object.assign({ target: "blank", to: preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_URL], className: classes.customItem }, { children: _jsx("img", { src: preferences[SCPreferences.CONFIGURATIONS_CUSTOM_NAVBAR_ITEM_IMAGE], alt: "custom_item" }) }))) })), _children, (preferences[SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY] || scUserContext.user) && !disableSearch ? (_jsx(SearchAutocomplete, Object.assign({ className: classes.search, blurOnSelect: true }, SearchAutocompleteProps))) : (_jsx(Box, { className: classes.search })), startActions, scUserContext.user ? (_jsxs(_Fragment, { children: [showComposer && _jsx(ComposerIconButton, Object.assign({ className: classes.composer }, ComposerIconButtonProps)), _jsx(Tooltip, Object.assign({ title: scUserContext.user.username }, { children: _jsx(IconButton, Object.assign({ component: Link, to: scRoutingContext.url(SCRoutes.USER_PROFILE_ROUTE_NAME, scUserContext.user), "aria-label": "Profile", className: classes.profile }, { children: _jsx(Avatar, { alt: scUserContext.user.username, src: scUserContext.user.avatar }) })) })), _jsxs(_Fragment, { children: [_jsx(IconButton, Object.assign({ className: classNames(classes.notification, {
149
149
  [classes.active]: value.startsWith(scRoutingContext.url(SCRoutes.USER_NOTIFICATIONS_ROUTE_NAME, {}))
150
150
  }), "aria-label": "Notification", onClick: handleOpenNotificationMenu }, { children: _jsx(Badge, Object.assign({ badgeContent: scUserContext.user.unseen_notification_banners_counter + scUserContext.user.unseen_interactions_counter, color: "secondary" }, { children: _jsx(Icon, { children: "notifications_active" }) })) })), _jsx(NotificationMenu, Object.assign({ className: classes.notificationsMenu, id: "notification-menu", anchorEl: anchorNotification, open: Boolean(anchorNotification), onClose: handleCloseNotificationMenu, onClick: handleCloseNotificationMenu, transformOrigin: { horizontal: 'right', vertical: 'top' }, anchorOrigin: { horizontal: 'right', vertical: 'bottom' } }, NotificationMenuProps))] }), privateMessagingEnabled && (_jsx(IconButton, Object.assign({ className: classNames(classes.messages, {
151
151
  [classes.active]: value.startsWith(scRoutingContext.url(SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, {}))
@@ -1,5 +1,5 @@
1
1
  import { StartStepParams } from '@selfcommunity/api-services';
2
- import { SCFeedObjectType } from '@selfcommunity/types';
2
+ import { SCFeedObjectType, SCOnBoardingStepType } from '@selfcommunity/types';
3
3
  import { VirtualScrollerItemProps } from '../../types/virtualScroller';
4
4
  export interface OnBoardingWidgetProps extends VirtualScrollerItemProps {
5
5
  /**
@@ -23,6 +23,10 @@ export interface OnBoardingWidgetProps extends VirtualScrollerItemProps {
23
23
  * @default false
24
24
  */
25
25
  forceExpanded?: boolean;
26
+ /**
27
+ * The initial step to display
28
+ */
29
+ initialStep?: SCOnBoardingStepType;
26
30
  }
27
31
  declare const OnBoardingWidget: (inProps: OnBoardingWidgetProps) => JSX.Element;
28
32
  export default OnBoardingWidget;
@@ -17,12 +17,11 @@ import HiddenPlaceholder from '../../shared/HiddenPlaceholder';
17
17
  import Widget from '../Widget';
18
18
  import Content from './Steps/Content';
19
19
  import { SCOPE_SC_UI } from '../../constants/Errors';
20
- import { OnBoardingService, PreferenceService } from '@selfcommunity/api-services';
20
+ import { Endpoints, http, OnBoardingService, PreferenceService } from '@selfcommunity/api-services';
21
21
  import { Logger } from '@selfcommunity/utils';
22
22
  import { SCOnBoardingStepStatusType, SCOnBoardingStepType } from '@selfcommunity/types';
23
23
  import OnBoardingWidgetSkeleton from './Skeleton';
24
24
  import { closeSnackbar, useSnackbar } from 'notistack';
25
- import { CONSOLE_PROD, CONSOLE_STAGE } from '../PlatformWidget/constants';
26
25
  import HeaderPlaceholder from '../../assets/onBoarding/header';
27
26
  import BaseDialog from '../../shared/BaseDialog';
28
27
  const classes = {
@@ -51,13 +50,13 @@ const OnBoardingWidget = (inProps) => {
51
50
  props: inProps,
52
51
  name: PREFIX
53
52
  });
54
- const { className, GenerateContentsParams = {}, onGeneratedContent = null, onHeightChange, onStateChange, forceExpanded = false } = props, rest = __rest(props, ["className", "GenerateContentsParams", "onGeneratedContent", "onHeightChange", "onStateChange", "forceExpanded"]);
53
+ const { className, GenerateContentsParams = {}, onGeneratedContent = null, onHeightChange, onStateChange, forceExpanded = false, initialStep } = props, rest = __rest(props, ["className", "GenerateContentsParams", "onGeneratedContent", "onHeightChange", "onStateChange", "forceExpanded", "initialStep"]);
55
54
  // STATE
56
55
  const [loading, setLoading] = useState(true);
57
56
  const [initialized, setInitialized] = useState(false);
58
57
  const [steps, setSteps] = useState([]);
59
58
  const nextStep = useMemo(() => {
60
- const step = steps === null || steps === void 0 ? void 0 : steps.find((step) => step.status === 'in_progress' || step.status === 'not_started');
59
+ const step = steps === null || steps === void 0 ? void 0 : steps.find((step) => (initialStep ? step.step === initialStep : step.status === 'in_progress' || step.status === 'not_started'));
61
60
  return step || (steps === null || steps === void 0 ? void 0 : steps[0]);
62
61
  }, [steps]);
63
62
  const allStepsDone = useMemo(() => {
@@ -77,7 +76,6 @@ const OnBoardingWidget = (inProps) => {
77
76
  const scPreferencesContext = useSCPreferences();
78
77
  const scThemeContext = useSCTheme();
79
78
  const { enqueueSnackbar } = useSnackbar();
80
- const isStage = scContext.settings.portal.includes('stage');
81
79
  const [isGenerating, setIsGenerating] = useState(false);
82
80
  // HOOKS
83
81
  const theme = useTheme();
@@ -110,10 +108,30 @@ const OnBoardingWidget = (inProps) => {
110
108
  }
111
109
  s.step === SCOnBoardingStepType.APPEARANCE && handlePreferencesUpdate();
112
110
  });
111
+ /**
112
+ * Fetches platform url
113
+ */
114
+ function fetchPlatform(query) {
115
+ http
116
+ .request({
117
+ url: Endpoints.Platform.url(),
118
+ method: Endpoints.Platform.method,
119
+ params: {
120
+ next: query
121
+ }
122
+ })
123
+ .then((res) => {
124
+ const platformUrl = res.data.platform_url;
125
+ window.open(platformUrl, '_blank').focus();
126
+ })
127
+ .catch((error) => {
128
+ console.log(error);
129
+ });
130
+ }
113
131
  const showSuccessAlert = (step) => {
114
132
  setIsGenerating(false);
115
133
  enqueueSnackbar(_jsx(FormattedMessage, { id: `ui.onBoardingWidget.step.${step.step}.success`, defaultMessage: `ui.onBoardingWidget.step.${step.step}.success` }), {
116
- action: (snackbarId) => (_jsxs(_Fragment, { children: [step.step === SCOnBoardingStepType.CATEGORIES && (_jsx(Button, Object.assign({ sx: { textTransform: 'uppercase', color: 'white' }, size: "small", variant: "text", href: isStage ? CONSOLE_STAGE : CONSOLE_PROD, target: "_blank" }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.categories.success.link", defaultMessage: "ui.onBoardingWidget.step.categories.success.link" }) }))), _jsx(IconButton, Object.assign({ sx: { color: 'white' }, onClick: () => closeSnackbar(snackbarId) }, { children: _jsx(Icon, { children: "close" }) }))] })),
134
+ action: (snackbarId) => (_jsxs(_Fragment, { children: [step.step === SCOnBoardingStepType.CATEGORIES && (_jsx(Button, Object.assign({ sx: { textTransform: 'uppercase', color: 'white' }, size: "small", variant: "text", onClick: () => fetchPlatform('/contents/interests/') }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.categories.success.link", defaultMessage: "ui.onBoardingWidget.step.categories.success.link" }) }))), _jsx(IconButton, Object.assign({ sx: { color: 'white' }, onClick: () => closeSnackbar(snackbarId) }, { children: _jsx(Icon, { children: "close" }) }))] })),
117
135
  variant: 'success',
118
136
  autoHideDuration: 7000
119
137
  });
@@ -167,6 +185,10 @@ const OnBoardingWidget = (inProps) => {
167
185
  scThemeContext.setTheme(getTheme(scContext.settings.theme, prefs));
168
186
  });
169
187
  };
188
+ const handleCategoriesClick = () => {
189
+ fetchPlatform('/contents/interests/');
190
+ setShowCategoriesModal(false);
191
+ };
170
192
  // EFFECTS
171
193
  useEffect(() => {
172
194
  if (prevContentsStep &&
@@ -252,7 +274,8 @@ const OnBoardingWidget = (inProps) => {
252
274
  b: (chunks) => _jsx("strong", { children: chunks }),
253
275
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
254
276
  // @ts-ignore
255
- icon: (...chunks) => (_jsx(Icon, Object.assign({ color: "secondary", fontSize: "medium" }, { children: chunks })))
256
- } }) }))) }) })), _jsx(AccordionDetails, { children: _jsx(Widget, Object.assign({ className: classes.content, elevation: 0 }, { children: loading ? (_jsx(OnBoardingWidgetSkeleton, {})) : (_jsxs(CardContent, { children: [_jsx(List, Object.assign({ className: isMobile ? classes.stepsMobile : classes.steps }, { children: steps === null || steps === void 0 ? void 0 : steps.map((step) => (_jsx(ListItem, { children: isMobile ? (_jsx(Chip, { size: "small", label: _jsxs(_Fragment, { children: [_jsx(FormattedMessage, { id: `ui.onBoardingWidget.${step.step}`, defaultMessage: `ui.onBoardingWidget.${step.step}` }), ' ', step.status === SCOnBoardingStepStatusType.COMPLETED && (_jsx(Icon, Object.assign({ color: (step === null || step === void 0 ? void 0 : step.status) === SCOnBoardingStepStatusType.COMPLETED && (step === null || step === void 0 ? void 0 : step.step) !== (_step === null || _step === void 0 ? void 0 : _step.step) ? 'success' : 'inherit' }, { children: "check" })))] }), onClick: () => handleChange(step), variant: step.step === (_step === null || _step === void 0 ? void 0 : _step.step) ? 'filled' : 'outlined', color: step.status === SCOnBoardingStepStatusType.COMPLETED ? 'success' : 'default' })) : (_jsxs(ListItemButton, Object.assign({ onClick: () => handleChange(step), selected: (step === null || step === void 0 ? void 0 : step.step) === (_step === null || _step === void 0 ? void 0 : _step.step) }, { children: [_jsx(ListItemIcon, { children: _jsx(Checkbox, { edge: "start", checked: step.status === SCOnBoardingStepStatusType.COMPLETED, tabIndex: -1, disableRipple: true, inputProps: { 'aria-labelledby': step.step }, size: 'small' }) }), _jsx(ListItemText, { primary: _jsx(FormattedMessage, { id: `ui.onBoardingWidget.${step.step}`, defaultMessage: `ui.onBoardingWidget.${step.step}` }) })] }))) }, step.id))) })), _jsxs(Box, Object.assign({ className: classes.stepContent }, { children: [_jsx(Fade, Object.assign({ in: true, timeout: 2400 }, { children: _jsx(Box, { children: getStepContent() }) })), showCategoriesModal && (_jsx(BaseDialog, Object.assign({ title: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.ai.no.categories", defaultMessage: "ui.onBoardingWidget.ai.no.categories" }), DialogContentProps: { dividers: false }, open: showCategoriesModal, onClose: () => setShowCategoriesModal(false), actions: _jsx(Button, Object.assign({ color: "secondary", onClick: () => setShowCategoriesModal(false) }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.ai.no.categories.cancel", defaultMessage: "ui.onBoardingWidget.ai.no.categories.cancel" }) })) }, { children: _jsx(Button, Object.assign({ color: "primary", href: isStage ? CONSOLE_STAGE : CONSOLE_PROD, onClick: () => setShowCategoriesModal(false), target: "_blank", startIcon: _jsx(Icon, Object.assign({ fontSize: "small" }, { children: "edit" })) }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.ai.no.categories.link", defaultMessage: "ui.onBoardingWidget.ai.no.categories.link" }) })) })))] }))] })) })) })] })) })));
277
+ // eslint-disable-next-line prettier/prettier
278
+ icon: (...chunks) => _jsx(Icon, Object.assign({ color: "secondary", fontSize: "medium" }, { children: chunks }))
279
+ } }) }))) }) })), _jsx(AccordionDetails, { children: _jsx(Widget, Object.assign({ className: classes.content, elevation: 0 }, { children: loading ? (_jsx(OnBoardingWidgetSkeleton, {})) : (_jsxs(CardContent, { children: [_jsx(List, Object.assign({ className: isMobile ? classes.stepsMobile : classes.steps }, { children: steps === null || steps === void 0 ? void 0 : steps.map((step) => (_jsx(ListItem, { children: isMobile ? (_jsx(Chip, { size: "small", label: _jsxs(_Fragment, { children: [_jsx(FormattedMessage, { id: `ui.onBoardingWidget.${step.step}`, defaultMessage: `ui.onBoardingWidget.${step.step}` }), ' ', step.status === SCOnBoardingStepStatusType.COMPLETED && (_jsx(Icon, Object.assign({ color: (step === null || step === void 0 ? void 0 : step.status) === SCOnBoardingStepStatusType.COMPLETED && (step === null || step === void 0 ? void 0 : step.step) !== (_step === null || _step === void 0 ? void 0 : _step.step) ? 'success' : 'inherit' }, { children: "check" })))] }), onClick: () => handleChange(step), variant: step.step === (_step === null || _step === void 0 ? void 0 : _step.step) ? 'filled' : 'outlined', color: step.status === SCOnBoardingStepStatusType.COMPLETED ? 'success' : 'default' })) : (_jsxs(ListItemButton, Object.assign({ onClick: () => handleChange(step), selected: (step === null || step === void 0 ? void 0 : step.step) === (_step === null || _step === void 0 ? void 0 : _step.step) }, { children: [_jsx(ListItemIcon, { children: _jsx(Checkbox, { edge: "start", checked: step.status === SCOnBoardingStepStatusType.COMPLETED, tabIndex: -1, disableRipple: true, inputProps: { 'aria-labelledby': step.step }, size: 'small' }) }), _jsx(ListItemText, { primary: _jsx(FormattedMessage, { id: `ui.onBoardingWidget.${step.step}`, defaultMessage: `ui.onBoardingWidget.${step.step}` }) })] }))) }, step.id))) })), _jsxs(Box, Object.assign({ className: classes.stepContent }, { children: [_jsx(Fade, Object.assign({ in: true, timeout: 2400 }, { children: _jsx(Box, { children: getStepContent() }) })), showCategoriesModal && (_jsx(BaseDialog, Object.assign({ title: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.ai.no.categories", defaultMessage: "ui.onBoardingWidget.ai.no.categories" }), DialogContentProps: { dividers: false }, open: showCategoriesModal, onClose: () => setShowCategoriesModal(false), actions: _jsx(Button, Object.assign({ color: "secondary", onClick: () => setShowCategoriesModal(false) }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.ai.no.categories.cancel", defaultMessage: "ui.onBoardingWidget.ai.no.categories.cancel" }) })) }, { children: _jsx(Button, Object.assign({ color: "primary", onClick: handleCategoriesClick, startIcon: _jsx(Icon, Object.assign({ fontSize: "small" }, { children: "edit" })) }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.ai.no.categories.link", defaultMessage: "ui.onBoardingWidget.ai.no.categories.link" }) })) })))] }))] })) })) })] })) })));
257
280
  };
258
281
  export default OnBoardingWidget;
@@ -7,7 +7,7 @@ import { useThemeProps } from '@mui/system';
7
7
  import classNames from 'classnames';
8
8
  import { Preferences } from '@selfcommunity/react-core';
9
9
  import { PREFIX } from '../../constants';
10
- import { Button, Drawer, IconButton, Tab, Tabs, TextField, Typography } from '@mui/material';
10
+ import { Button, CircularProgress, Drawer, IconButton, Tab, Tabs, TextField, Typography } from '@mui/material';
11
11
  import { MuiColorInput } from 'mui-color-input';
12
12
  import { actionTypes } from './reducer';
13
13
  import { getInitialState, reducer } from './reducer';
@@ -33,7 +33,9 @@ const classes = {
33
33
  root: `${PREFIX}-appearance-root`,
34
34
  title: `${PREFIX}-appearance-title`,
35
35
  summary: `${PREFIX}-appearance-summary`,
36
+ colorContainer: `${PREFIX}-appearance-color-container`,
36
37
  color: `${PREFIX}-appearance-color`,
38
+ colorProgress: `${PREFIX}-appearance-color-progress`,
37
39
  logoContainer: `${PREFIX}-appearance-logo-container`,
38
40
  logo: `${PREFIX}-appearance-logo`,
39
41
  uploadButton: `${PREFIX}-appearance-upload-button`,
@@ -66,6 +68,7 @@ export default function Appearance(inProps) {
66
68
  const [anchorEl, setAnchorEl] = useState(null);
67
69
  const [tab, setTab] = useState(0);
68
70
  const [updating, setUpdating] = useState(false);
71
+ const [updatingColor, setUpdatingColor] = useState('');
69
72
  // INTL
70
73
  const intl = useIntl();
71
74
  // HANDLERS
@@ -138,6 +141,7 @@ export default function Appearance(inProps) {
138
141
  }
139
142
  finally {
140
143
  setUpdating(false);
144
+ setUpdatingColor('');
141
145
  onCompleteAction();
142
146
  }
143
147
  });
@@ -193,15 +197,15 @@ export default function Appearance(inProps) {
193
197
  }, []);
194
198
  // HANDLERS
195
199
  const handleColorChange = (color, name) => {
200
+ setUpdatingColor(name);
196
201
  const currentColor = state.colors.find((col) => col.name === name);
197
202
  if (currentColor && currentColor.value !== color) {
203
+ setUpdating(true);
198
204
  dispatch({
199
205
  type: actionTypes.SET_COLORS,
200
206
  payload: { colors: state.colors.map((col) => (col.name === name ? Object.assign(Object.assign({}, col), { value: color }) : col)) }
201
207
  });
202
- setTimeout(() => {
203
- updatePreference({ [`${name}`]: color });
204
- }, 2000);
208
+ updatePreference({ [`${name}`]: color });
205
209
  }
206
210
  };
207
211
  const handleChange = (event) => {
@@ -211,7 +215,7 @@ export default function Appearance(inProps) {
211
215
  payload: { slogans: state.slogans.map((s) => (s.name === name ? Object.assign(Object.assign({}, s), { value: value }) : s)) }
212
216
  });
213
217
  };
214
- return (_jsxs(Root, Object.assign({ className: classNames(classes.root, className) }, { children: [_jsx(Typography, Object.assign({ variant: "h4", className: classes.title, alignSelf: "self-start" }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.appearance", defaultMessage: "ui.onBoardingWidget.appearance" }) })), _jsx(Typography, Object.assign({ className: classes.summary }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.appearance.summary", defaultMessage: "ui.onBoardingWidget.step.appearance.summary" }) })), _jsx(Button, Object.assign({ variant: "outlined", size: "small", color: "primary", onClick: handleOpen }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.appearance.button", defaultMessage: "ui.onBoardingWidget.step.appearance.button" }) })), _jsxs(DrawerRoot, Object.assign({ className: classes.drawerRoot, anchor: "right", open: Boolean(anchorEl), onClose: handleClose }, { children: [_jsxs(Box, Object.assign({ className: classes.drawerHeader }, { children: [_jsx(Typography, Object.assign({ variant: "h4", color: "primary" }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.appearance.header.title", defaultMessage: "ui.onBoardingWidget.step.appearance.header.title" }) })), _jsx(IconButton, Object.assign({ className: classes.drawerHeaderAction, onClick: handleClose }, { children: _jsx(Icon, { children: "close" }) }))] })), _jsxs(Tabs, Object.assign({ value: tab, onChange: handleTabChange, variant: "scrollable", scrollButtons: "auto", "aria-label": "scrollable-tabs" }, { children: [_jsx(Tab, { label: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.appearance.colors.title", defaultMessage: "ui.onBoardingWidget.step.appearance.colors.title" }) }), _jsx(Tab, { label: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.appearance.logo.title", defaultMessage: "ui.onBoardingWidget.step.appearance.logo.title" }) }), _jsx(Tab, { label: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.appearance.titleSlogan.title", defaultMessage: "ui.onBoardingWidget.step.appearance.titleSlogan.title" }) })] })), _jsx(ScrollContainer, { children: _jsxs(Box, Object.assign({ className: classes.drawerContent }, { children: [tab === 0 && (_jsx(_Fragment, { children: state.colors.map((color) => (_jsxs(React.Fragment, { children: [_jsx(Typography, Object.assign({ variant: "h6" }, { children: formatColorLabel(color) })), _jsx(MuiColorInput, { className: classes.color, format: "hex", value: color.value, onChange: (newColor) => handleColorChange(newColor, color.name) })] }, color.id))) })), tab === 1 && (_jsx(_Fragment, { children: state.logos.map((logo) => (_jsxs(React.Fragment, { children: [_jsx(Typography, Object.assign({ variant: "h6" }, { children: formatLogoLabel(logo.name) })), _jsxs(Box, Object.assign({ className: classes.logoContainer }, { children: [_jsx("img", { src: logo.value, className: classes.logo }), _jsx("input", { type: "file", onChange: (event) => handleUpload(event, logo.name), ref: fileInput, hidden: true, accept: ".gif,.png,.jpg,.jpeg" }), _jsx(LoadingButton, Object.assign({ className: classes.uploadButton, onClick: () => fileInput.current.click(), loading: loadingLogo, disabled: loadingLogo }, { children: _jsx(Icon, { children: "upload" }) }))] }))] }, logo.id))) })), tab === 2 && (_jsxs(Box, { children: [_jsx(TextField, { multiline: true, fullWidth: true,
218
+ return (_jsxs(Root, Object.assign({ className: classNames(classes.root, className) }, { children: [_jsx(Typography, Object.assign({ variant: "h4", className: classes.title, alignSelf: "self-start" }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.appearance", defaultMessage: "ui.onBoardingWidget.appearance" }) })), _jsx(Typography, Object.assign({ className: classes.summary }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.appearance.summary", defaultMessage: "ui.onBoardingWidget.step.appearance.summary" }) })), _jsx(Button, Object.assign({ variant: "outlined", size: "small", color: "primary", onClick: handleOpen }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.appearance.button", defaultMessage: "ui.onBoardingWidget.step.appearance.button" }) })), _jsxs(DrawerRoot, Object.assign({ className: classes.drawerRoot, anchor: "right", open: Boolean(anchorEl), onClose: handleClose }, { children: [_jsxs(Box, Object.assign({ className: classes.drawerHeader }, { children: [_jsx(Typography, Object.assign({ variant: "h4", color: "primary" }, { children: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.appearance.header.title", defaultMessage: "ui.onBoardingWidget.step.appearance.header.title" }) })), _jsx(IconButton, Object.assign({ className: classes.drawerHeaderAction, onClick: handleClose }, { children: _jsx(Icon, { children: "close" }) }))] })), _jsxs(Tabs, Object.assign({ value: tab, onChange: handleTabChange, variant: "scrollable", scrollButtons: "auto", "aria-label": "scrollable-tabs" }, { children: [_jsx(Tab, { label: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.appearance.colors.title", defaultMessage: "ui.onBoardingWidget.step.appearance.colors.title" }) }), _jsx(Tab, { label: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.appearance.logo.title", defaultMessage: "ui.onBoardingWidget.step.appearance.logo.title" }) }), _jsx(Tab, { label: _jsx(FormattedMessage, { id: "ui.onBoardingWidget.step.appearance.titleSlogan.title", defaultMessage: "ui.onBoardingWidget.step.appearance.titleSlogan.title" }) })] })), _jsx(ScrollContainer, { children: _jsxs(Box, Object.assign({ className: classes.drawerContent }, { children: [tab === 0 && (_jsx(_Fragment, { children: state.colors.map((color) => (_jsxs(React.Fragment, { children: [_jsx(Typography, Object.assign({ variant: "h6" }, { children: formatColorLabel(color) })), _jsxs(Box, Object.assign({ className: classes.colorContainer }, { children: [_jsx(MuiColorInput, { className: classes.color, format: "hex", value: color.value, onChange: (newColor) => handleColorChange(newColor, color.name), isAlphaHidden: true }), updatingColor && updatingColor === color.name && (_jsx(CircularProgress, { className: classes.colorProgress, color: "secondary", size: 24 }))] }))] }, color.id))) })), tab === 1 && (_jsx(_Fragment, { children: state.logos.map((logo) => (_jsxs(React.Fragment, { children: [_jsx(Typography, Object.assign({ variant: "h6" }, { children: formatLogoLabel(logo.name) })), _jsxs(Box, Object.assign({ className: classes.logoContainer }, { children: [_jsx("img", { src: logo.value, className: classes.logo }), _jsx("input", { type: "file", onChange: (event) => handleUpload(event, logo.name), ref: fileInput, hidden: true, accept: ".gif,.png,.jpg,.jpeg" }), _jsx(LoadingButton, Object.assign({ className: classes.uploadButton, onClick: () => fileInput.current.click(), loading: loadingLogo, disabled: loadingLogo }, { children: _jsx(Icon, { children: "upload" }) }))] }))] }, logo.id))) })), tab === 2 && (_jsxs(Box, { children: [_jsx(TextField, { multiline: true, fullWidth: true,
215
219
  //className={classes.field}
216
220
  label: `${intl.formatMessage(messages.titleField)}`, margin: "normal", value: (_a = state === null || state === void 0 ? void 0 : state.slogans[0]) === null || _a === void 0 ? void 0 : _a.value, name: "application_slogan1", onChange: handleChange, InputProps: {
217
221
  endAdornment: _jsx(Typography, Object.assign({ variant: "body2" }, { children: ((_b = state.slogans[0].value) === null || _b === void 0 ? void 0 : _b.length) ? 50 - ((_c = state.slogans[0].value) === null || _c === void 0 ? void 0 : _c.length) : 50 }))