@selfcommunity/react-ui 0.7.50-events.38 → 0.7.50-events.40

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 (99) hide show
  1. package/lib/cjs/components/BottomNavigation/BottomNavigation.js +14 -5
  2. package/lib/cjs/components/CreateEventButton/CreateEventButton.js +6 -7
  3. package/lib/cjs/components/EditEventButton/EditEventButton.d.ts +43 -0
  4. package/lib/cjs/components/EditEventButton/EditEventButton.js +61 -0
  5. package/lib/cjs/components/EditEventButton/index.d.ts +3 -0
  6. package/lib/cjs/components/EditEventButton/index.js +5 -0
  7. package/lib/cjs/components/EventForm/EventAddress.d.ts +2 -1
  8. package/lib/cjs/components/EventForm/EventAddress.js +4 -4
  9. package/lib/cjs/components/EventForm/EventForm.d.ts +6 -0
  10. package/lib/cjs/components/EventForm/EventForm.js +51 -25
  11. package/lib/cjs/components/EventForm/UploadEventCover.d.ts +10 -0
  12. package/lib/cjs/components/EventForm/UploadEventCover.js +34 -7
  13. package/lib/cjs/components/EventHeader/EventHeader.d.ts +67 -0
  14. package/lib/cjs/components/EventHeader/EventHeader.js +175 -0
  15. package/lib/cjs/components/EventHeader/Skeleton.d.ts +25 -0
  16. package/lib/cjs/components/EventHeader/Skeleton.js +56 -0
  17. package/lib/cjs/components/EventHeader/constants.d.ts +1 -0
  18. package/lib/cjs/components/EventHeader/constants.js +4 -0
  19. package/lib/cjs/components/EventHeader/index.d.ts +4 -0
  20. package/lib/cjs/components/EventHeader/index.js +8 -0
  21. package/lib/cjs/components/EventInfoWidget/EventInfoWidget.d.ts +24 -0
  22. package/lib/cjs/components/EventInfoWidget/EventInfoWidget.js +74 -0
  23. package/lib/cjs/components/EventInfoWidget/constants.d.ts +1 -0
  24. package/lib/cjs/components/EventInfoWidget/constants.js +4 -0
  25. package/lib/cjs/components/EventInfoWidget/index.d.ts +3 -0
  26. package/lib/cjs/components/EventInfoWidget/index.js +6 -0
  27. package/lib/cjs/components/EventInviteButton/EventInviteButton.js +11 -11
  28. package/lib/cjs/components/EventLocationWidget/EventLocationWidget.js +1 -0
  29. package/lib/cjs/components/EventSubscribeButton/EventSubscribeButton.d.ts +56 -0
  30. package/lib/cjs/components/EventSubscribeButton/EventSubscribeButton.js +193 -0
  31. package/lib/cjs/components/EventSubscribeButton/index.d.ts +3 -0
  32. package/lib/cjs/components/EventSubscribeButton/index.js +5 -0
  33. package/lib/cjs/components/Events/Events.js +12 -11
  34. package/lib/cjs/components/FeedObject/FeedObject.js +1 -1
  35. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.d.ts +2 -0
  36. package/lib/cjs/components/NavigationToolbar/NavigationToolbar.js +9 -1
  37. package/lib/cjs/components/NavigationToolbarMobile/NavigationToolbarMobile.js +12 -2
  38. package/lib/cjs/components/User/User.d.ts +2 -1
  39. package/lib/cjs/components/User/User.js +9 -9
  40. package/lib/cjs/constants/PubSub.d.ts +5 -1
  41. package/lib/cjs/index.d.ts +104 -100
  42. package/lib/cjs/index.js +270 -260
  43. package/lib/cjs/shared/Bullet/index.js +1 -2
  44. package/lib/cjs/shared/Calendar/index.d.ts +1 -2
  45. package/lib/cjs/shared/Calendar/index.js +3 -5
  46. package/lib/cjs/shared/EventInfoDetails/index.d.ts +6 -0
  47. package/lib/cjs/shared/EventInfoDetails/index.js +67 -0
  48. package/lib/esm/components/BottomNavigation/BottomNavigation.js +14 -5
  49. package/lib/esm/components/CreateEventButton/CreateEventButton.js +6 -7
  50. package/lib/esm/components/EditEventButton/EditEventButton.d.ts +43 -0
  51. package/lib/esm/components/EditEventButton/EditEventButton.js +58 -0
  52. package/lib/esm/components/EditEventButton/index.d.ts +3 -0
  53. package/lib/esm/components/EditEventButton/index.js +2 -0
  54. package/lib/esm/components/EventForm/EventAddress.d.ts +2 -1
  55. package/lib/esm/components/EventForm/EventAddress.js +4 -4
  56. package/lib/esm/components/EventForm/EventForm.d.ts +6 -0
  57. package/lib/esm/components/EventForm/EventForm.js +51 -25
  58. package/lib/esm/components/EventForm/UploadEventCover.d.ts +10 -0
  59. package/lib/esm/components/EventForm/UploadEventCover.js +34 -7
  60. package/lib/esm/components/EventHeader/EventHeader.d.ts +67 -0
  61. package/lib/esm/components/EventHeader/EventHeader.js +172 -0
  62. package/lib/esm/components/EventHeader/Skeleton.d.ts +25 -0
  63. package/lib/esm/components/EventHeader/Skeleton.js +53 -0
  64. package/lib/esm/components/EventHeader/constants.d.ts +1 -0
  65. package/lib/esm/components/EventHeader/constants.js +1 -0
  66. package/lib/esm/components/EventHeader/index.d.ts +4 -0
  67. package/lib/esm/components/EventHeader/index.js +4 -0
  68. package/lib/esm/components/EventInfoWidget/EventInfoWidget.d.ts +24 -0
  69. package/lib/esm/components/EventInfoWidget/EventInfoWidget.js +71 -0
  70. package/lib/esm/components/EventInfoWidget/constants.d.ts +1 -0
  71. package/lib/esm/components/EventInfoWidget/constants.js +1 -0
  72. package/lib/esm/components/EventInfoWidget/index.d.ts +3 -0
  73. package/lib/esm/components/EventInfoWidget/index.js +3 -0
  74. package/lib/esm/components/EventInviteButton/EventInviteButton.js +11 -11
  75. package/lib/esm/components/EventLocationWidget/EventLocationWidget.js +1 -0
  76. package/lib/esm/components/EventSubscribeButton/EventSubscribeButton.d.ts +56 -0
  77. package/lib/esm/components/EventSubscribeButton/EventSubscribeButton.js +190 -0
  78. package/lib/esm/components/EventSubscribeButton/index.d.ts +3 -0
  79. package/lib/esm/components/EventSubscribeButton/index.js +2 -0
  80. package/lib/esm/components/Events/Events.js +12 -11
  81. package/lib/esm/components/FeedObject/FeedObject.js +1 -1
  82. package/lib/esm/components/NavigationToolbar/NavigationToolbar.d.ts +2 -0
  83. package/lib/esm/components/NavigationToolbar/NavigationToolbar.js +9 -1
  84. package/lib/esm/components/NavigationToolbarMobile/NavigationToolbarMobile.js +13 -3
  85. package/lib/esm/components/User/User.d.ts +2 -1
  86. package/lib/esm/components/User/User.js +9 -9
  87. package/lib/esm/constants/PubSub.d.ts +5 -1
  88. package/lib/esm/index.d.ts +104 -100
  89. package/lib/esm/index.js +109 -105
  90. package/lib/esm/shared/Bullet/index.js +0 -1
  91. package/lib/esm/shared/Calendar/index.d.ts +1 -2
  92. package/lib/esm/shared/Calendar/index.js +0 -1
  93. package/lib/esm/shared/EventInfoDetails/index.d.ts +6 -0
  94. package/lib/esm/shared/EventInfoDetails/index.js +64 -0
  95. package/lib/umd/84.js +2 -0
  96. package/lib/umd/react-ui.js +1 -1
  97. package/package.json +8 -7
  98. package/lib/umd/204.js +0 -2
  99. /package/lib/umd/{204.js.LICENSE.txt → 84.js.LICENSE.txt} +0 -0
@@ -63,18 +63,27 @@ function BottomNavigation(inProps) {
63
63
  // MEMO
64
64
  const privateMessagingEnabled = (0, react_1.useMemo)(() => features.includes(types_1.SCFeatureName.PRIVATE_MESSAGING), [features]);
65
65
  const groupsEnabled = (0, react_1.useMemo)(() => features.includes(types_1.SCFeatureName.GROUPING) && features.includes(types_1.SCFeatureName.TAGGING), [features]);
66
+ const eventsEnabled = (0, react_1.useMemo)(() => features && features.includes(types_1.SCFeatureName.EVENT) && features.includes(types_1.SCFeatureName.TAGGING), [features]);
67
+ const exploreStreamEnabled = preferences[react_core_1.SCPreferences.CONFIGURATIONS_EXPLORE_STREAM_ENABLED].value;
68
+ const postOnlyStaffEnabled = preferences[react_core_1.SCPreferences.CONFIGURATIONS_POST_ONLY_STAFF_ENABLED].value;
69
+ const contentAvailable = preferences[react_core_1.SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY].value;
66
70
  const isIOS = (0, react_1.useMemo)(() => (0, utils_1.iOS)(), []);
67
71
  // RENDER
68
72
  return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(className, classes.root, { [classes.ios]: isIOS }) }, rest), children
69
73
  ? children
70
74
  : [
71
75
  react_1.default.createElement(material_1.BottomNavigationAction, { key: "home", className: classes.action, component: react_core_1.Link, to: scUserContext.user ? scRoutingContext.url(react_core_1.SCRoutes.HOME_ROUTE_NAME, {}) : '/', value: scUserContext.user ? scRoutingContext.url(react_core_1.SCRoutes.HOME_ROUTE_NAME, {}) : '/', icon: react_1.default.createElement(material_1.Icon, null, "home") }),
72
- (scUserContext.user || preferences[react_core_1.SCPreferences.CONFIGURATIONS_CONTENT_AVAILABILITY].value) &&
73
- preferences[react_core_1.SCPreferences.CONFIGURATIONS_EXPLORE_STREAM_ENABLED].value ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "explore", className: classes.action, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.EXPLORE_ROUTE_NAME, {}), value: scRoutingContext.url(react_core_1.SCRoutes.EXPLORE_ROUTE_NAME, {}), icon: react_1.default.createElement(material_1.Icon, null, "explore") })) : null,
74
- !preferences[react_core_1.SCPreferences.CONFIGURATIONS_POST_ONLY_STAFF_ENABLED].value ||
75
- (react_core_1.UserUtils.isStaff(scUserContext.user) && preferences[react_core_1.SCPreferences.CONFIGURATIONS_POST_ONLY_STAFF_ENABLED].value) ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "composer", className: (0, classnames_1.default)(classes.composer, classes.action), component: ComposerIconButton_1.default, disableRipple: true })) : null,
76
+ (scUserContext.user || contentAvailable) && exploreStreamEnabled ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "explore", className: classes.action, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.EXPLORE_ROUTE_NAME, {}), value: scRoutingContext.url(react_core_1.SCRoutes.EXPLORE_ROUTE_NAME, {}), icon: react_1.default.createElement(material_1.Icon, null, "explore") })) : null,
77
+ (!postOnlyStaffEnabled || (react_core_1.UserUtils.isStaff(scUserContext.user) && postOnlyStaffEnabled)) &&
78
+ ((groupsEnabled && !eventsEnabled) || (!groupsEnabled && eventsEnabled)) &&
79
+ !exploreStreamEnabled ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "composer", className: (0, classnames_1.default)(classes.composer, classes.action), component: ComposerIconButton_1.default, disableRipple: true })) : null,
76
80
  groupsEnabled && scUserContext.user ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "groups", className: classes.action, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUPS_SUBSCRIBED_ROUTE_NAME, {}), value: scRoutingContext.url(react_core_1.SCRoutes.GROUPS_SUBSCRIBED_ROUTE_NAME, {}), icon: react_1.default.createElement(material_1.Icon, null, "groups") })) : null,
77
- scUserContext.user && !groupsEnabled ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "notifications", className: classes.action, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_NOTIFICATIONS_ROUTE_NAME, {}), value: scRoutingContext.url(react_core_1.SCRoutes.USER_NOTIFICATIONS_ROUTE_NAME, {}), icon: react_1.default.createElement(material_1.Badge, { badgeContent: scUserContext.user.unseen_notification_banners_counter + scUserContext.user.unseen_interactions_counter, color: "secondary" },
81
+ (!postOnlyStaffEnabled || (react_core_1.UserUtils.isStaff(scUserContext.user) && postOnlyStaffEnabled)) &&
82
+ groupsEnabled &&
83
+ eventsEnabled &&
84
+ !exploreStreamEnabled ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "composer", className: (0, classnames_1.default)(classes.composer, classes.action), component: ComposerIconButton_1.default, disableRipple: true })) : null,
85
+ eventsEnabled && scUserContext.user ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "events", className: classes.action, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.EVENT_ROUTE_NAME, {}), value: scRoutingContext.url(react_core_1.SCRoutes.EVENTS_ROUTE_NAME, {}), icon: react_1.default.createElement(material_1.Icon, null, "CalendarIcon") })) : null,
86
+ scUserContext.user && !groupsEnabled && !eventsEnabled ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "notifications", className: classes.action, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_NOTIFICATIONS_ROUTE_NAME, {}), value: scRoutingContext.url(react_core_1.SCRoutes.USER_NOTIFICATIONS_ROUTE_NAME, {}), icon: react_1.default.createElement(material_1.Badge, { badgeContent: scUserContext.user.unseen_notification_banners_counter + scUserContext.user.unseen_interactions_counter, color: "secondary" },
78
87
  react_1.default.createElement(material_1.Icon, null, "notifications_active")) })) : null,
79
88
  privateMessagingEnabled && scUserContext.user ? (react_1.default.createElement(material_1.BottomNavigationAction, { key: "messages", className: classes.action, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, {}), value: scRoutingContext.url(react_core_1.SCRoutes.USER_PRIVATE_MESSAGES_ROUTE_NAME, {}), icon: react_1.default.createElement(material_1.Badge, { badgeContent: 0, color: "secondary" },
80
89
  react_1.default.createElement(material_1.Icon, null, "email")) })) : null
@@ -1,15 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
- const react_1 = tslib_1.__importStar(require("react"));
5
- const system_1 = require("@mui/system");
6
- const styles_1 = require("@mui/material/styles");
7
4
  const material_1 = require("@mui/material");
8
- const react_intl_1 = require("react-intl");
5
+ const styles_1 = require("@mui/material/styles");
6
+ const system_1 = require("@mui/system");
9
7
  const react_core_1 = require("@selfcommunity/react-core");
10
8
  const classnames_1 = tslib_1.__importDefault(require("classnames"));
9
+ const react_1 = tslib_1.__importStar(require("react"));
10
+ const react_intl_1 = require("react-intl");
11
11
  const EventForm_1 = tslib_1.__importDefault(require("../EventForm"));
12
- const HiddenPlaceholder_1 = tslib_1.__importDefault(require("../../shared/HiddenPlaceholder"));
13
12
  const PREFIX = 'SCCreateEventButton';
14
13
  const classes = {
15
14
  root: `${PREFIX}-root`
@@ -67,13 +66,13 @@ function CreateEventButton(inProps) {
67
66
  * If there's no authUserId, component is hidden.
68
67
  */
69
68
  if ((!canCreateEvent && onlyStaffEnabled) || !authUserId) {
70
- return react_1.default.createElement(HiddenPlaceholder_1.default, null);
69
+ return null;
71
70
  }
72
71
  /**
73
72
  * Renders root object
74
73
  */
75
74
  return (react_1.default.createElement(react_1.default.Fragment, null,
76
- react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className), onClick: handleClick, variant: "contained", color: "secondary", startIcon: react_1.default.createElement(material_1.Icon, { fontSize: "small" }, "add") }, rest), children !== null && children !== void 0 ? children : react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.createEventButton", defaultMessage: "ui.createEventButton" })),
75
+ react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className), onClick: handleClick, variant: "contained", color: "secondary", startIcon: !EventFormProps.event && react_1.default.createElement(material_1.Icon, { fontSize: "small" }, "add") }, rest), children !== null && children !== void 0 ? children : react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.createEventButton", defaultMessage: "ui.createEventButton" })),
77
76
  open && react_1.default.createElement(EventForm_1.default, Object.assign({}, EventFormProps, { open: true, onClose: handleClick }))));
78
77
  }
79
78
  exports.default = CreateEventButton;
@@ -0,0 +1,43 @@
1
+ import { CreateEventButtonProps } from '../CreateEventButton';
2
+ import { SCEventType } from '@selfcommunity/types';
3
+ export interface EditEventButtonProps extends CreateEventButtonProps {
4
+ /**
5
+ * Event Object
6
+ * @default null
7
+ */
8
+ event?: SCEventType;
9
+ /**
10
+ * Id of the event
11
+ * @default null
12
+ */
13
+ eventId?: number | string;
14
+ /**
15
+ * On edit success callback function
16
+ * @default null
17
+ */
18
+ onEditSuccess?: (data: SCEventType) => void;
19
+ /**
20
+ * Any other properties
21
+ */
22
+ [p: string]: any;
23
+ }
24
+ /**
25
+ *> API documentation for the Community-JS Create Event Button component. Learn about the available props and the CSS API.
26
+ *
27
+ #### Import
28
+ ```jsx
29
+ import {CreateEventButton} from '@selfcommunity/react-ui';
30
+ ```
31
+
32
+ #### Component Name
33
+ The name `SCEditEventButton` can be used when providing style overrides in the theme.
34
+
35
+ #### CSS
36
+
37
+ |Rule Name|Global class|Description|
38
+ |---|---|---|
39
+ |root|.SCEditEventButton-root|Styles applied to the root element.|
40
+
41
+ * @param inProps
42
+ */
43
+ export default function EditEventButton(inProps: EditEventButtonProps): JSX.Element;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importDefault(require("react"));
5
+ const system_1 = require("@mui/system");
6
+ const styles_1 = require("@mui/material/styles");
7
+ const react_intl_1 = require("react-intl");
8
+ const react_core_1 = require("@selfcommunity/react-core");
9
+ const classnames_1 = tslib_1.__importDefault(require("classnames"));
10
+ const CreateEventButton_1 = tslib_1.__importDefault(require("../CreateEventButton"));
11
+ const PREFIX = 'SCEditEventButton';
12
+ const classes = {
13
+ root: `${PREFIX}-root`
14
+ };
15
+ const Root = (0, styles_1.styled)(CreateEventButton_1.default, {
16
+ name: PREFIX,
17
+ slot: 'Root',
18
+ overridesResolver: (props, styles) => styles.root
19
+ })(({ theme }) => ({}));
20
+ /**
21
+ *> API documentation for the Community-JS Create Event Button component. Learn about the available props and the CSS API.
22
+ *
23
+ #### Import
24
+ ```jsx
25
+ import {CreateEventButton} from '@selfcommunity/react-ui';
26
+ ```
27
+
28
+ #### Component Name
29
+ The name `SCEditEventButton` can be used when providing style overrides in the theme.
30
+
31
+ #### CSS
32
+
33
+ |Rule Name|Global class|Description|
34
+ |---|---|---|
35
+ |root|.SCEditEventButton-root|Styles applied to the root element.|
36
+
37
+ * @param inProps
38
+ */
39
+ function EditEventButton(inProps) {
40
+ //PROPS
41
+ const props = (0, system_1.useThemeProps)({
42
+ props: inProps,
43
+ name: PREFIX
44
+ });
45
+ const { className, eventId, event, onEditSuccess } = props, rest = tslib_1.__rest(props, ["className", "eventId", "event", "onEditSuccess"]);
46
+ const { scEvent, setSCEvent } = (0, react_core_1.useSCFetchEvent)({ id: eventId, event });
47
+ const scUserContext = (0, react_core_1.useSCUser)();
48
+ const handleSuccess = (data) => {
49
+ setSCEvent(data);
50
+ onEditSuccess && onEditSuccess(data);
51
+ };
52
+ if (!scUserContext.user) {
53
+ return null;
54
+ }
55
+ /**
56
+ * Renders root object
57
+ */
58
+ return (react_1.default.createElement(Root, Object.assign({ variant: "outlined", className: (0, classnames_1.default)(classes.root, className), EventFormProps: { event: scEvent, onSuccess: handleSuccess } }, rest),
59
+ react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.editEventButton", defaultMessage: "ui.editEventButton" })));
60
+ }
61
+ exports.default = EditEventButton;
@@ -0,0 +1,3 @@
1
+ import EditEventButton, { EditEventButtonProps } from './EditEventButton';
2
+ export default EditEventButton;
3
+ export { EditEventButtonProps };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const EditEventButton_1 = tslib_1.__importDefault(require("./EditEventButton"));
5
+ exports.default = EditEventButton_1.default;
@@ -1,5 +1,6 @@
1
- import { SCEventLocationType } from '@selfcommunity/types';
1
+ import { SCEventLocationType, SCEventType } from '@selfcommunity/types';
2
2
  export interface EventAddressProps {
3
+ event?: SCEventType;
3
4
  forwardGeolocationData: (data: {
4
5
  location: SCEventLocationType;
5
6
  geolocation?: string;
@@ -40,10 +40,10 @@ function EventAddress(inProps) {
40
40
  // INTL
41
41
  const intl = (0, react_intl_1.useIntl)();
42
42
  // PROPS
43
- const { className, forwardGeolocationData } = props;
43
+ const { className, forwardGeolocationData, event } = props;
44
44
  // STATE
45
- const [location, setLocation] = (0, react_1.useState)(types_1.SCEventLocationType.PERSON);
46
- const [geolocation, setGeoLocation] = (0, react_1.useState)(null);
45
+ const [location, setLocation] = (0, react_1.useState)(event ? event.location : types_1.SCEventLocationType.PERSON);
46
+ const [geolocation, setGeoLocation] = (0, react_1.useState)(event ? event.geolocation : null);
47
47
  const [inputValue, setInputValue] = (0, react_1.useState)('');
48
48
  const [suggestions, setSuggestions] = (0, react_1.useState)([]);
49
49
  const [timeoutId, setTimeoutId] = (0, react_1.useState)(null);
@@ -118,7 +118,7 @@ function EventAddress(inProps) {
118
118
  react_1.default.createElement(material_1.Tab, { value: types_1.SCEventLocationType.PERSON, classes: { root: classes.tab }, icon: react_1.default.createElement(Icon_1.default, null, "add_location_alt"), iconPosition: "start", label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.address.live.label", defaultMessage: "ui.eventForm.address.live.label" }) }),
119
119
  react_1.default.createElement(material_1.Tab, { value: types_1.SCEventLocationType.ONLINE, classes: { root: classes.tab }, icon: react_1.default.createElement(Icon_1.default, null, "play_circle_outline"), iconPosition: "start", label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.address.online.label", defaultMessage: "ui.eventForm.address.online.label" }) })),
120
120
  react_1.default.createElement(material_1.Box, { className: classes.tabContent },
121
- location === types_1.SCEventLocationType.PERSON && (react_1.default.createElement(material_1.Autocomplete, { freeSolo: true, size: "small", value: geolocation, onChange: handleSelection, inputValue: inputValue, onInputChange: handleLocationChange, options: suggestions, getOptionLabel: (option) => option.description, noOptionsText: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.address.live.noResults", defaultMessage: "ui.eventForm.address.live.noResults" }), renderInput: (params) => (react_1.default.createElement(material_1.TextField, Object.assign({}, params, { label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.address.live.placeholder", defaultMessage: "ui.eventForm.address.live.placeholder" }), variant: "outlined", fullWidth: true, InputProps: Object.assign(Object.assign({}, params.InputProps), { endAdornment: (react_1.default.createElement(react_1.default.Fragment, null,
121
+ location === types_1.SCEventLocationType.PERSON && (react_1.default.createElement(material_1.Autocomplete, { freeSolo: true, size: "small", value: geolocation, onChange: handleSelection, inputValue: inputValue, onInputChange: handleLocationChange, options: suggestions, getOptionLabel: (option) => option.description || geolocation, noOptionsText: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.address.live.noResults", defaultMessage: "ui.eventForm.address.live.noResults" }), renderInput: (params) => (react_1.default.createElement(material_1.TextField, Object.assign({}, params, { label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.address.live.placeholder", defaultMessage: "ui.eventForm.address.live.placeholder" }), variant: "outlined", fullWidth: true, InputProps: Object.assign(Object.assign({}, params.InputProps), { endAdornment: (react_1.default.createElement(react_1.default.Fragment, null,
122
122
  react_1.default.createElement(material_1.InputAdornment, { position: "start" },
123
123
  react_1.default.createElement(Icon_1.default, null, "add_location_alt")),
124
124
  params.InputProps.endAdornment)) }) }))) })),
@@ -1,4 +1,5 @@
1
1
  import { BaseDialogProps } from '../../shared/BaseDialog';
2
+ import { SCEventType } from '@selfcommunity/types';
2
3
  export interface EventFormProps extends BaseDialogProps {
3
4
  /**
4
5
  * Overrides or extends the styles applied to the component.
@@ -15,6 +16,11 @@ export interface EventFormProps extends BaseDialogProps {
15
16
  * @default null
16
17
  */
17
18
  onClose?: () => void;
19
+ /**
20
+ * Event Object
21
+ * @default null
22
+ */
23
+ event?: SCEventType;
18
24
  /**
19
25
  * On success callback function
20
26
  * @default null
@@ -22,6 +22,8 @@ const AdapterDateFns_1 = require("@mui/x-date-pickers/AdapterDateFns");
22
22
  const EventAddress_1 = tslib_1.__importDefault(require("./EventAddress"));
23
23
  const it_1 = tslib_1.__importDefault(require("date-fns/locale/it"));
24
24
  const en_US_1 = tslib_1.__importDefault(require("date-fns/locale/en-US"));
25
+ const PubSub_1 = require("../../constants/PubSub");
26
+ const pubsub_js_1 = tslib_1.__importDefault(require("pubsub-js"));
25
27
  const messages = (0, react_intl_1.defineMessages)({
26
28
  name: {
27
29
  id: 'ui.eventForm.name.placeholder',
@@ -110,35 +112,35 @@ const Root = (0, styles_1.styled)(BaseDialog_1.default, {
110
112
  * @param inProps
111
113
  */
112
114
  function EventForm(inProps) {
113
- var _a, _b, _c, _d, _e;
115
+ var _a, _b, _c, _d, _e, _f, _g;
114
116
  //PROPS
115
117
  const props = (0, system_1.useThemeProps)({
116
118
  props: inProps,
117
119
  name: constants_1.PREFIX
118
120
  });
119
- const { className, open = true, onClose, onSuccess } = props, rest = tslib_1.__rest(props, ["className", "open", "onClose", "onSuccess"]);
121
+ const { className, open = true, onClose, onSuccess, event = null } = props, rest = tslib_1.__rest(props, ["className", "open", "onClose", "onSuccess", "event"]);
120
122
  // CONTEXT
121
123
  const scContext = (0, react_core_1.useSCContext)();
122
124
  // INTL
123
125
  const intl = (0, react_intl_1.useIntl)();
124
126
  const initialFieldState = {
125
- imageOriginal: '',
127
+ imageOriginal: event ? event.image_bigger : '',
126
128
  imageOriginalFile: '',
127
- startDate: null,
128
- startTime: null,
129
- endDate: null,
130
- endTime: null,
131
- location: types_1.SCEventLocationType.PERSON,
132
- geolocation: '',
133
- lat: null,
134
- lng: null,
135
- link: '',
136
- recurring: types_1.SCEventRecurrenceType.NEVER,
137
- name: '',
138
- description: '',
139
- isPublic: true,
129
+ startDate: event ? new Date(event.start_date) : null,
130
+ startTime: event ? new Date(event.start_date) : null,
131
+ endDate: event && event.end_date ? new Date(event.end_date) : null,
132
+ endTime: event && event.end_date ? new Date(event.end_date) : null,
133
+ location: event ? event.location : types_1.SCEventLocationType.PERSON,
134
+ geolocation: event ? event.geolocation : '',
135
+ lat: event ? event.geolocation_lat : null,
136
+ lng: event ? event.geolocation_lng : null,
137
+ link: event ? event.link : '',
138
+ recurring: event ? event.recurring : types_1.SCEventRecurrenceType.NEVER,
139
+ name: event ? event.name : '',
140
+ description: event ? event.description : '',
141
+ isPublic: (_a = (event && event.privacy === types_1.SCEventPrivacyType.PUBLIC)) !== null && _a !== void 0 ? _a : true,
140
142
  isSubmitting: false,
141
- showEndDateTime: false
143
+ showEndDateTime: (_b = (event && event.end_date)) !== null && _b !== void 0 ? _b : false
142
144
  };
143
145
  // STATE
144
146
  const [field, setField] = (0, react_1.useState)(initialFieldState);
@@ -173,6 +175,22 @@ function EventForm(inProps) {
173
175
  setError(error);
174
176
  }
175
177
  }
178
+ /**
179
+ * Notify when a group info changed
180
+ * @param data
181
+ */
182
+ function notifyChanges(data) {
183
+ if (data) {
184
+ if (event) {
185
+ // Edit group
186
+ pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.EVENT}.${PubSub_1.SCGroupEventType.EDIT}`, data);
187
+ }
188
+ else {
189
+ // Create group
190
+ pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.EVENT}.${PubSub_1.SCGroupEventType.CREATE}`, data);
191
+ }
192
+ }
193
+ }
176
194
  const handleGeoData = (data) => {
177
195
  setField((prev) => (Object.assign(Object.assign({}, prev), data)));
178
196
  };
@@ -204,9 +222,17 @@ function EventForm(inProps) {
204
222
  formData.append('visible', true);
205
223
  }
206
224
  formData.append('description', field.description);
207
- api_services_1.EventService.createEvent(formData, { headers: { 'Content-Type': 'multipart/form-data' } })
225
+ let eventService;
226
+ if (event) {
227
+ eventService = api_services_1.EventService.updateEvent(event.id, formData, { headers: { 'Content-Type': 'multipart/form-data' } });
228
+ }
229
+ else {
230
+ eventService = api_services_1.EventService.createEvent(formData, { headers: { 'Content-Type': 'multipart/form-data' } });
231
+ }
232
+ eventService
208
233
  .then((data) => {
209
234
  onSuccess && onSuccess(data);
235
+ notifyChanges(data);
210
236
  onClose && onClose();
211
237
  setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: false })));
212
238
  })
@@ -242,21 +268,21 @@ function EventForm(inProps) {
242
268
  /**
243
269
  * Renders root object
244
270
  */
245
- return (react_1.default.createElement(Root, Object.assign({ DialogContentProps: { dividers: false }, title: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.title", defaultMessage: "ui.eventForm.title" }), open: open, onClose: onClose, className: (0, classnames_1.default)(classes.root, className), actions: react_1.default.createElement(lab_1.LoadingButton, { loading: field.isSubmitting, disabled: !field.name ||
271
+ return (react_1.default.createElement(Root, Object.assign({ DialogContentProps: { dividers: false }, title: event ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.title.edit", defaultMessage: "ui.eventForm.title.edit" })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.title", defaultMessage: "ui.eventForm.title" })), open: open, onClose: onClose, className: (0, classnames_1.default)(classes.root, className), actions: react_1.default.createElement(lab_1.LoadingButton, { loading: field.isSubmitting, disabled: !field.name ||
246
272
  (!field.startDate && !field.startTime) ||
247
273
  (field.location === types_1.SCEventLocationType.ONLINE && !field.link) ||
248
274
  (field.location === types_1.SCEventLocationType.PERSON && !field.geolocation) ||
249
275
  (field.recurring !== types_1.SCEventRecurrenceType.NEVER && !field.endDate && !field.endTime) ||
250
276
  Object.keys(error).length !== 0 ||
251
277
  field.name.length > Event_1.EVENT_TITLE_MAX_LENGTH ||
252
- field.description.length > Event_1.EVENT_DESCRIPTION_MAX_LENGTH, variant: "contained", onClick: handleSubmit, color: "secondary" }, react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.button.create", defaultMessage: "ui.eventForm.button.create" })) }, rest),
278
+ field.description.length > Event_1.EVENT_DESCRIPTION_MAX_LENGTH, variant: "contained", onClick: handleSubmit, color: "secondary" }, event ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.button.edit", defaultMessage: "ui.eventForm.button.edit" })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.button.create", defaultMessage: "ui.eventForm.button.create" }))) }, rest),
253
279
  react_1.default.createElement(react_1.default.Fragment, null,
254
280
  react_1.default.createElement(material_1.Paper, { style: _backgroundCover, classes: { root: classes.cover } },
255
- react_1.default.createElement(UploadEventCover_1.default, { onChange: handleChangeCover })),
281
+ react_1.default.createElement(UploadEventCover_1.default, { isCreationMode: true, onChange: handleChangeCover })),
256
282
  react_1.default.createElement(material_1.FormGroup, { className: classes.form },
257
283
  react_1.default.createElement(material_1.TextField, { required: true, className: classes.name, placeholder: `${intl.formatMessage(messages.name)}`, margin: "normal", value: field.name, name: "name", onChange: handleChange, InputProps: {
258
284
  endAdornment: react_1.default.createElement(material_1.Typography, { variant: "body2" }, Event_1.EVENT_TITLE_MAX_LENGTH - field.name.length)
259
- }, error: Boolean(((_a = field === null || field === void 0 ? void 0 : field.name) === null || _a === void 0 ? void 0 : _a.length) > Event_1.EVENT_TITLE_MAX_LENGTH) || Boolean(error[`nameError`]), helperText: ((_b = field === null || field === void 0 ? void 0 : field.name) === null || _b === void 0 ? void 0 : _b.length) > Event_1.EVENT_TITLE_MAX_LENGTH ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.name.error.maxLength", defaultMessage: "ui.eventForm.name.error.maxLength" })) : error[`nameError`] ? (error[`nameError`]) : null }),
285
+ }, error: Boolean(((_c = field === null || field === void 0 ? void 0 : field.name) === null || _c === void 0 ? void 0 : _c.length) > Event_1.EVENT_TITLE_MAX_LENGTH) || Boolean(error[`nameError`]), helperText: ((_d = field === null || field === void 0 ? void 0 : field.name) === null || _d === void 0 ? void 0 : _d.length) > Event_1.EVENT_TITLE_MAX_LENGTH ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.name.error.maxLength", defaultMessage: "ui.eventForm.name.error.maxLength" })) : error[`nameError`] ? (error[`nameError`]) : null }),
260
286
  react_1.default.createElement(material_1.Box, { className: classes.dateTime },
261
287
  react_1.default.createElement(x_date_pickers_1.LocalizationProvider, { dateAdapter: AdapterDateFns_1.AdapterDateFns, adapterLocale: scContext.settings.locale.default === 'it' ? it_1.default : en_US_1.default },
262
288
  react_1.default.createElement(x_date_pickers_1.MobileDatePicker, { className: classes.picker, disablePast: true, label: field.startDate && react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.date.placeholder", defaultMessage: "ui.eventForm.date.placeholder" }), value: field.startDate, slots: {
@@ -306,7 +332,7 @@ function EventForm(inProps) {
306
332
  }, onChange: (value) => handleChangeDateTime(value, 'endTime') })))),
307
333
  react_1.default.createElement(material_1.Button, { variant: "text", color: "secondary", onClick: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['showEndDateTime']: !field.showEndDateTime }))), disabled: field.showEndDateTime && field.recurring !== types_1.SCEventRecurrenceType.NEVER },
308
334
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.dateTime.placeholder", defaultMessage: "ui.eventForm.dateTime.placeholder", values: { symbol: field.showEndDateTime ? '-' : '+' } })),
309
- react_1.default.createElement(EventAddress_1.default, { forwardGeolocationData: handleGeoData }),
335
+ react_1.default.createElement(EventAddress_1.default, { forwardGeolocationData: handleGeoData, event: event !== null && event !== void 0 ? event : null }),
310
336
  privateEnabled && (react_1.default.createElement(material_1.Box, { className: classes.privacySection },
311
337
  react_1.default.createElement(material_1.Stack, { direction: "row", spacing: 1, alignItems: "center", justifyContent: "center" },
312
338
  react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isPublic }) },
@@ -330,7 +356,7 @@ function EventForm(inProps) {
330
356
  b: (chunks) => react_1.default.createElement("strong", null, chunks)
331
357
  } }))))))),
332
358
  react_1.default.createElement(material_1.TextField, { multiline: true, className: classes.description, placeholder: `${intl.formatMessage(messages.description)}`, margin: "normal", value: field.description, name: "description", onChange: handleChange, InputProps: {
333
- endAdornment: (react_1.default.createElement(material_1.Typography, { variant: "body2" }, ((_c = field.description) === null || _c === void 0 ? void 0 : _c.length) ? Event_1.EVENT_DESCRIPTION_MAX_LENGTH - field.description.length : Event_1.EVENT_DESCRIPTION_MAX_LENGTH))
334
- }, error: Boolean(((_d = field.description) === null || _d === void 0 ? void 0 : _d.length) > Event_1.EVENT_DESCRIPTION_MAX_LENGTH), helperText: ((_e = field.description) === null || _e === void 0 ? void 0 : _e.length) > Event_1.EVENT_DESCRIPTION_MAX_LENGTH ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.description.error.maxLength", defaultMessage: "ui.eventForm.description.error.maxLength" })) : null })))));
359
+ endAdornment: (react_1.default.createElement(material_1.Typography, { variant: "body2" }, ((_e = field.description) === null || _e === void 0 ? void 0 : _e.length) ? Event_1.EVENT_DESCRIPTION_MAX_LENGTH - field.description.length : Event_1.EVENT_DESCRIPTION_MAX_LENGTH))
360
+ }, error: Boolean(((_f = field.description) === null || _f === void 0 ? void 0 : _f.length) > Event_1.EVENT_DESCRIPTION_MAX_LENGTH), helperText: ((_g = field.description) === null || _g === void 0 ? void 0 : _g.length) > Event_1.EVENT_DESCRIPTION_MAX_LENGTH ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.description.error.maxLength", defaultMessage: "ui.eventForm.description.error.maxLength" })) : null })))));
335
361
  }
336
362
  exports.default = EventForm;
@@ -1,4 +1,9 @@
1
1
  export interface UploadEventCoverProps {
2
+ /**
3
+ * Id of the event. It is optional only for event creation modal.
4
+ * @default null
5
+ */
6
+ eventId?: number;
2
7
  /**
3
8
  * On change function.
4
9
  * @default null
@@ -9,6 +14,11 @@ export interface UploadEventCoverProps {
9
14
  * @default null
10
15
  */
11
16
  className?: string;
17
+ /**
18
+ * Prop to handle cover loading in the create event modal.
19
+ * @default false
20
+ */
21
+ isCreationMode?: boolean;
12
22
  /**
13
23
  * Any other properties
14
24
  */
@@ -10,6 +10,16 @@ const classnames_1 = tslib_1.__importDefault(require("classnames"));
10
10
  const system_1 = require("@mui/system");
11
11
  const constants_1 = require("./constants");
12
12
  const lab_1 = require("@mui/lab");
13
+ const Errors_1 = require("../../constants/Errors");
14
+ const api_services_1 = require("@selfcommunity/api-services");
15
+ const utils_1 = require("@selfcommunity/utils");
16
+ const react_intl_1 = require("react-intl");
17
+ const messages = (0, react_intl_1.defineMessages)({
18
+ errorLoadImage: {
19
+ id: 'ui.changeGroupCover.button.change.alertErrorImage',
20
+ defaultMessage: 'ui.changeGroupCover.button.change.alertErrorImage'
21
+ }
22
+ });
13
23
  const classes = {
14
24
  root: `${constants_1.PREFIX}-upload-event-cover-root`
15
25
  };
@@ -46,13 +56,15 @@ function UploadEventCover(inProps) {
46
56
  props: inProps,
47
57
  name: constants_1.PREFIX
48
58
  });
49
- const { onChange, className = false } = props, rest = tslib_1.__rest(props, ["onChange", "className"]);
59
+ const { eventId, onChange, className = false, isCreationMode = false } = props, rest = tslib_1.__rest(props, ["eventId", "onChange", "className", "isCreationMode"]);
50
60
  //CONTEXT
51
61
  const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
52
62
  //STATE
53
63
  let fileInput = (0, react_1.useRef)(null);
54
64
  const [loading, setLoading] = (0, react_1.useState)(false);
55
65
  const [alert, setAlert] = (0, react_1.useState)(null);
66
+ // INTL
67
+ const intl = (0, react_intl_1.useIntl)();
56
68
  // Anonymous
57
69
  if (!scUserContext.user) {
58
70
  return null;
@@ -68,12 +80,7 @@ function UploadEventCover(inProps) {
68
80
  reader.onload = (e) => {
69
81
  const img = new Image();
70
82
  img.onload = () => {
71
- onChange && onChange(fileInput);
72
- // if (img.width < 1920) {
73
- // setAlert(intl.formatMessage(messages.errorImageSize));
74
- // } else {
75
- // isCreationMode ? onChange && onChange(fileInput) : handleSave();
76
- // }
83
+ isCreationMode ? onChange && onChange(fileInput) : handleSave();
77
84
  };
78
85
  // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
79
86
  // @ts-ignore
@@ -84,6 +91,26 @@ function UploadEventCover(inProps) {
84
91
  reader.readAsDataURL(fileInput);
85
92
  }
86
93
  };
94
+ /**
95
+ * Handles cover saving after upload action
96
+ */
97
+ function handleSave() {
98
+ setLoading(true);
99
+ const formData = new FormData();
100
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
101
+ // @ts-ignore
102
+ formData.append('image_original', fileInput);
103
+ api_services_1.EventService.changeEventCover(eventId, formData, { headers: { 'Content-Type': 'multipart/form-data' } })
104
+ .then((data) => {
105
+ onChange && onChange(data.image_medium);
106
+ setLoading(false);
107
+ })
108
+ .catch((error) => {
109
+ utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
110
+ setLoading(false);
111
+ setAlert(intl.formatMessage(messages.errorLoadImage));
112
+ });
113
+ }
87
114
  /**
88
115
  * If there is an error
89
116
  */
@@ -0,0 +1,67 @@
1
+ import { SCEventType } from '@selfcommunity/types';
2
+ import { EventSubscribeButtonProps } from '../EventSubscribeButton';
3
+ export interface EventHeaderProps {
4
+ /**
5
+ * Id of event object
6
+ * @default null
7
+ */
8
+ id?: string;
9
+ /**
10
+ * Overrides or extends the styles applied to the component.
11
+ * @default null
12
+ */
13
+ className?: string;
14
+ /**
15
+ * Event Object
16
+ * @default null
17
+ */
18
+ event?: SCEventType;
19
+ /**
20
+ * Id of the event
21
+ * @default null
22
+ */
23
+ eventId?: number;
24
+ /**
25
+ * Props to spread event button followed
26
+ * @default {}
27
+ */
28
+ EventSubscribeButtonProps?: EventSubscribeButtonProps;
29
+ /**
30
+ * Any other properties
31
+ */
32
+ [p: string]: any;
33
+ }
34
+ /**
35
+ * > API documentation for the Community-JS Event Header component. Learn about the available props and the CSS API.
36
+ *
37
+ *
38
+ * This component renders the events top section.
39
+
40
+ #### Import
41
+
42
+ ```jsx
43
+ import {UserProfileHeader} from '@selfcommunity/react-ui';
44
+ ```
45
+
46
+ #### Component Name
47
+
48
+ The name `SCEventHeader` can be used when providing style overrides in the theme.
49
+
50
+
51
+ #### CSS
52
+
53
+ |Rule Name|Global class|Description|
54
+ |---|---|---|
55
+ |root|.SCEventHeader-root|Styles applied to the root element.|
56
+ |cover|.SCEventHeader-cover|Styles applied to the cover element.|
57
+ |time|.SCEventHeader-time|Styles applied to the time element.|
58
+ |calendar|.SCEventHeader-calendar|Styles applied to the calendar element.|
59
+ |info|SCEventHeader-info|Styles applied to the info section.|
60
+ |name|SCEventHeader-username|Styles applied to the username element.|
61
+ |visibility|SCEventHeader-visibility|Styles applied to the visibility section.|
62
+ |visibilityItem|SCEventHeader-visibility-item|Styles applied to the visibility element.|
63
+ |multiActions|SCEventHeader-multi-action|Styles applied to the multi actions section.|
64
+
65
+ * @param inProps
66
+ */
67
+ export default function EventHeader(inProps: EventHeaderProps): JSX.Element;