@openeventkit/event-site 2.0.143 → 2.0.144

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@openeventkit/event-site",
3
3
  "description": "Event Site",
4
- "version": "2.0.143",
4
+ "version": "2.0.144",
5
5
  "author": "Tipit LLC",
6
6
  "dependencies": {
7
7
  "@fortawesome/fontawesome-svg-core": "^6.5.2",
@@ -30,7 +30,7 @@
30
30
  "@vimeo/player": "^2.16.3",
31
31
  "ably": "^1.2.34",
32
32
  "assert": "^2.1.0",
33
- "attendee-to-attendee-widget": "3.1.1-beta.34",
33
+ "attendee-to-attendee-widget": "3.2.0",
34
34
  "autoprefixer": "10.4.14",
35
35
  "awesome-bootstrap-checkbox": "^1.0.1",
36
36
  "axios": "^0.19.2",
@@ -78,7 +78,7 @@
78
78
  "jsdom": "^24.1.0",
79
79
  "klaro": "^0.7.21",
80
80
  "lite-schedule-widget": "3.0.3",
81
- "live-event-widget": "4.0.2",
81
+ "live-event-widget": "4.0.4",
82
82
  "lodash": "^4.17.19",
83
83
  "lz-string": "^1.4.4",
84
84
  "markdown-it": "^12.0.0",
@@ -130,10 +130,10 @@
130
130
  "stream-browserify": "^3.0.0",
131
131
  "stream-chat": "^2.7.2",
132
132
  "stream-chat-react": "3.1.7",
133
- "summit-registration-lite": "5.0.37",
133
+ "summit-registration-lite": "5.0.40",
134
134
  "superagent": "8.0.9",
135
135
  "sweetalert2": "^9.17.0",
136
- "upcoming-events-widget": "3.0.5",
136
+ "upcoming-events-widget": "3.0.7",
137
137
  "urijs": "^1.19.2",
138
138
  "use-fit-text": "^2.4.0",
139
139
  "uuid": "^7.0.0",
@@ -181,7 +181,21 @@ export const fetchSpeakerById = async(summitId, speakerId, accessToken = null) =
181
181
  export const fetchSummitById = async(summitId, accessToken = null) => {
182
182
  let apiUrl = URI(`${process.env.GATSBY_SUMMIT_API_BASE_URL}/api/public/v1/summits/${summitId}`);
183
183
 
184
- apiUrl.addQuery('expand', 'event_types,tracks,track_groups,presentation_levels,locations.rooms,locations.floors,order_extra_questions.values,schedule_settings,schedule_settings.filters,schedule_settings.pre_filters');
184
+ const expand = [
185
+ 'event_types',
186
+ 'tracks',
187
+ 'tracks.subtracks',
188
+ 'track_groups',
189
+ 'presentation_levels',
190
+ 'locations.rooms',
191
+ 'locations.floors',
192
+ 'order_extra_questions.values',
193
+ 'schedule_settings',
194
+ 'schedule_settings.filters',
195
+ 'schedule_settings.pre_filters',
196
+ ]
197
+
198
+ apiUrl.addQuery('expand', expand.join(','));
185
199
 
186
200
  return fetch(apiUrl.toString(), {
187
201
  method: 'GET'
@@ -197,7 +197,7 @@ const mapState = ({ settingState }) => ({
197
197
 
198
198
  export const AttendeesWidget = connect(mapState)(AttendeesWidgetComponent);
199
199
 
200
- const AccessTracker = ({ user, isLoggedUser, summitPhase, chatSettings }) => {
200
+ const AccessTracker = ({ user, isLoggedUser, summitPhase, chatSettings, updateChatProfileEnabled=false }) => {
201
201
  const chatProps = {
202
202
  streamApiKey: getEnvVariable(STREAM_IO_API_KEY),
203
203
  apiBaseUrl: getEnvVariable(IDP_BASE_URL),
@@ -299,6 +299,7 @@ const AccessTracker = ({ user, isLoggedUser, summitPhase, chatSettings }) => {
299
299
  },
300
300
  summitId: parseInt(getEnvVariable(SUMMIT_ID)),
301
301
  keepAliveEnabled: true,
302
+ updateChatProfileEnabled: updateChatProfileEnabled,
302
303
  ...chatProps,
303
304
  ...sbAuthProps
304
305
  };
@@ -1,20 +1,17 @@
1
- import React from 'react';
2
- import { connect } from 'react-redux';
3
- import Clock from 'openstack-uicore-foundation/lib/components/clock';
4
- import { updateClock } from '../actions/clock-actions';
1
+ import React from "react";
2
+ import { connect } from "react-redux";
3
+ import Clock from "openstack-uicore-foundation/lib/components/clock";
4
+ import { updateClock } from "../actions/clock-actions";
5
5
 
6
6
  const ClockComponent = ({
7
7
  active,
8
8
  summit,
9
9
  updateClock
10
10
  }) => {
11
+ if (!active || !summit) return null;
11
12
  return (
12
- <div>
13
- {active && summit &&
14
- <Clock onTick={(timestamp) => updateClock(timestamp)} timezone={summit.time_zone_id} />
15
- }
16
- </div>
13
+ <Clock onTick={(timestamp) => updateClock(timestamp)} timezone={summit.time_zone_id} />
17
14
  );
18
15
  }
19
16
 
20
- export default connect(null, { updateClock })(ClockComponent);
17
+ export default connect(null, { updateClock })(ClockComponent);
@@ -27,7 +27,7 @@ const FullSchedule = ({
27
27
  ...rest
28
28
  }) => {
29
29
  const { getSettingByKey } = useMarketingSettings();
30
- const defaultImage = getSettingByKey(MARKETING_SETTINGS_KEYS.schedultDefaultImage);
30
+ const defaultImage = getSettingByKey(MARKETING_SETTINGS_KEYS.scheduleDefaultImage);
31
31
  const summitLogoPrint = getSettingByKey(MARKETING_SETTINGS_KEYS.fullScheduleSummitLogoPrint);
32
32
  const componentProps = {
33
33
  title: "Schedule",
@@ -0,0 +1,61 @@
1
+ import React, { useEffect } from "react";
2
+ import { navigate } from "gatsby";
3
+ import { Box, Typography } from "@mui/material";
4
+
5
+ const containerStyles = (contained) => ({
6
+ display: "flex",
7
+ flexDirection: "column",
8
+ justifyContent: "center",
9
+ width: "100%",
10
+ height: contained ? "100%" : "100vh"
11
+ });
12
+
13
+ const titleStyle = {
14
+ color: "var(--color_text_dark)",
15
+ fontFamily: "var(--font_family)",
16
+ fontSize: "2rem",
17
+ fontWeight: 600,
18
+ lineHeight: 1.125,
19
+ };
20
+
21
+ const subtitleStyle = {
22
+ color: "var(--color_text_dark)",
23
+ fontFamily: "var(--font_family)",
24
+ fontSize: "1.25rem",
25
+ fontWeight: 400,
26
+ lineHeight: 1.25,
27
+ };
28
+
29
+ const Interstitial = ({
30
+ children,
31
+ title,
32
+ subtitle,
33
+ navigateTo,
34
+ navigateOptions = {},
35
+ timeout = 3000,
36
+ contained = false
37
+ }) => {
38
+ useEffect(() => {
39
+ if (navigateTo) {
40
+ const timer = setTimeout(() => navigate(navigateTo, navigateOptions), timeout);
41
+ return () => clearTimeout(timer);
42
+ }
43
+ }, [navigateTo, navigateOptions, timeout]);
44
+
45
+ return (
46
+ <Box sx={containerStyles(contained)}>
47
+ {children ? (
48
+ children
49
+ ) : (
50
+ <Box sx={{ width: "100%", textAlign: "center" }}>
51
+ <Typography sx={titleStyle} gutterBottom>
52
+ {title}
53
+ </Typography>
54
+ <Typography sx={subtitleStyle}>{subtitle}</Typography>
55
+ </Box>
56
+ )}
57
+ </Box>
58
+ );
59
+ };
60
+
61
+ export default Interstitial;
@@ -5,7 +5,7 @@ import {connect} from "react-redux";
5
5
  // these two libraries are client-side only
6
6
  import LiteSchedule from "lite-schedule-widget/dist";
7
7
  import "lite-schedule-widget/dist/index.css";
8
- // awesome-bootstrap-checkbox css dependency
8
+ // awesome-bootstrap-checkbox css dependency
9
9
  // https://cdnjs.cloudflare.com/ajax/libs/awesome-bootstrap-checkbox/1.0.2/awesome-bootstrap-checkbox.min.css
10
10
  // injected through HeadComponents
11
11
 
@@ -26,7 +26,7 @@ const LiteScheduleComponent = ({
26
26
  ...rest
27
27
  }) => {
28
28
  const { getSettingByKey } = useMarketingSettings();
29
- const defaultImage = getSettingByKey(MARKETING_SETTINGS_KEYS.schedultDefaultImage);
29
+ const defaultImage = getSettingByKey(MARKETING_SETTINGS_KEYS.scheduleDefaultImage);
30
30
  const scheduleState = schedules?.find( s => s.key === schedKey);
31
31
 
32
32
  const componentProps = {
@@ -5,7 +5,7 @@ import {connect} from "react-redux";
5
5
  // these two libraries are client-side only
6
6
  import LiveEventWidget from 'live-event-widget/dist/index.js';
7
7
  import 'live-event-widget/dist/index.css';
8
- // awesome-bootstrap-checkbox css dependency
8
+ // awesome-bootstrap-checkbox css dependency
9
9
  // https://cdnjs.cloudflare.com/ajax/libs/awesome-bootstrap-checkbox/1.0.2/awesome-bootstrap-checkbox.min.css
10
10
  // injected through HeadComponents
11
11
 
@@ -20,9 +20,8 @@ const LiveEventWidgetComponent = ({
20
20
  ...rest
21
21
  }) => {
22
22
  const { getSettingByKey } = useMarketingSettings();
23
- const defaultImage = getSettingByKey(MARKETING_SETTINGS_KEYS.schedultDefaultImage);
23
+ const defaultImage = getSettingByKey(MARKETING_SETTINGS_KEYS.scheduleDefaultImage);
24
24
  const scheduleState = schedules?.find( s => s.key === 'schedule-main');
25
-
26
25
  const widgetProps = {
27
26
  title: "",
28
27
  defaultImage: defaultImage,
@@ -0,0 +1,66 @@
1
+ import * as React from "react";
2
+ import { Box, Typography } from "@mui/material";
3
+ import { epochToMomentTimeZone } from "openstack-uicore-foundation/lib/utils/methods";
4
+ import { PHASES } from "@utils/phasesUtils";
5
+
6
+ const containerStyles = {
7
+ display: "flex",
8
+ flexDirection: "column",
9
+ justifyContent: "center",
10
+ color: "var(--color_text_light)",
11
+ backgroundColor: "var(--color_secondary)",
12
+ aspectRatio: "auto 16/9",
13
+ px: 3,
14
+ py: 5
15
+ };
16
+
17
+ const titleStyle = {
18
+ color: "var(--color_text_light)",
19
+ fontFamily: "var(--font_family)",
20
+ fontSize: "42px",
21
+ fontWeight: 600,
22
+ lineHeight: 1.125
23
+ };
24
+
25
+ const subtitleStyle = {
26
+ color: "var(--color_text_light)",
27
+ fontFamily: "var(--font_family)",
28
+ fontSize: "36px",
29
+ fontWeight: 400,
30
+ lineHeight: 1.25
31
+ };
32
+
33
+ const getSubtitle = (eventClassName, eventPhase, streamingUrl, startDate, timeZoneId) => {
34
+ if (eventClassName !== "Presentation") {
35
+ return "Next session will start soon...";
36
+ }
37
+
38
+ if (eventPhase === PHASES.AFTER && !streamingUrl) {
39
+ return "Session is over. Recording will be available soon.";
40
+ }
41
+
42
+ if (eventPhase < PHASES.DURING || !streamingUrl) {
43
+ const formattedTime = epochToMomentTimeZone(startDate, timeZoneId).format("MMMM D hh:mm A (z)");
44
+ return `This session will be available on ${formattedTime}`;
45
+ }
46
+
47
+ return "";
48
+ };
49
+
50
+ const PrePostEventSlide = ({ summit, event, eventPhase }) => {
51
+ const { title, class_name: eventClassName, start_date: startDate, streaming_url: streamingUrl } = event;
52
+ const { time_zone_id: timeZoneId } = summit;
53
+
54
+ const subtitle = getSubtitle(eventClassName, eventPhase, streamingUrl, startDate, timeZoneId);
55
+
56
+ return (
57
+ <Box sx={containerStyles}>
58
+ <Typography gutterBottom sx={titleStyle}>
59
+ {title}
60
+ </Typography>
61
+ <Typography sx={subtitleStyle}>{subtitle}</Typography>
62
+ </Box>
63
+ );
64
+ };
65
+
66
+ export default PrePostEventSlide;
@@ -5,7 +5,7 @@ import { connect } from "react-redux";
5
5
  // these two libraries are client-side only
6
6
  import UpcomingEvents from "upcoming-events-widget/dist";
7
7
  import "upcoming-events-widget/dist/index.css";
8
- // awesome-bootstrap-checkbox css dependency
8
+ // awesome-bootstrap-checkbox css dependency
9
9
  // https://cdnjs.cloudflare.com/ajax/libs/awesome-bootstrap-checkbox/1.0.2/awesome-bootstrap-checkbox.min.css
10
10
  // injected through HeadComponents
11
11
 
@@ -27,7 +27,7 @@ const UpcomingEventsComponent = ({
27
27
  }) => {
28
28
  const wrapperClass = page === "marketing-site" ? "schedule-container-marketing" : "schedule-container";
29
29
  const { getSettingByKey } = useMarketingSettings();
30
- const defaultImage = getSettingByKey(MARKETING_SETTINGS_KEYS.schedultDefaultImage);
30
+ const defaultImage = getSettingByKey(MARKETING_SETTINGS_KEYS.scheduleDefaultImage);
31
31
  const scheduleState = schedules?.find( s => s.key === 'schedule-main');
32
32
 
33
33
  const componentProps = {
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import Player from '@vimeo/player';
4
+ import * as Sentry from "@sentry/react";
4
5
  import eventNames from './VimeoPlayerEventNames';
5
6
  import Swal from 'sweetalert2';
6
7
 
@@ -387,6 +388,7 @@ VimeoPlayer.defaultProps = {
387
388
  onError: (error) => {
388
389
  Swal.fire('Error', 'This video stream will begin momentarily. Please standby.', "warning");
389
390
  console.log(error);
391
+ Sentry.captureException(error)
390
392
  }
391
393
  };
392
394
 
@@ -1,14 +1,12 @@
1
1
  import React from "react";
2
- import HeroComponent from "../components/HeroComponent";
2
+ import Interstitial from "../components/Interstitial";
3
3
  import useSiteSettings from "@utils/useSiteSettings";
4
4
 
5
- import "../styles/bulma.scss";
6
-
7
5
  const MaintenancePage = () => {
8
6
  const { maintenanceMode: { title, subtitle } } = useSiteSettings();
9
7
 
10
8
  return (
11
- <HeroComponent
9
+ <Interstitial
12
10
  title={title}
13
11
  subtitle={subtitle}
14
12
  />
@@ -3,7 +3,7 @@ import { connect } from "react-redux";
3
3
 
4
4
  import { PHASES } from "../utils/phasesUtils";
5
5
  import { requireExtraQuestions, doVirtualCheckIn } from "../actions/user-actions";
6
- import HeroComponent from "../components/HeroComponent";
6
+ import Interstitial from "../components/Interstitial";
7
7
  import FragmentParser from "openstack-uicore-foundation/lib/utils/fragment-parser";
8
8
  import moment from "moment-timezone";
9
9
 
@@ -37,7 +37,7 @@ const ShowOpenRoute = ({
37
37
  if(attendee)
38
38
  doVirtualCheckIn(attendee);
39
39
  }
40
- },[summitPhase, hasTicket, userProfile, doVirtualCheckIn]);
40
+ }, [summitPhase, hasTicket, userProfile, doVirtualCheckIn]);
41
41
 
42
42
  const userCanByPassAuthz = () => {
43
43
  return isAuthorized;
@@ -61,14 +61,14 @@ const ShowOpenRoute = ({
61
61
 
62
62
  // if summit didnt started yet ...
63
63
  if (!shouldBypassCheck && !userCanByPassAuthz() && summitPhase === PHASES.BEFORE) {
64
- return <HeroComponent title="You are now logged in. Additional event info is now available on the website." redirectTo="/" />;
64
+ return <Interstitial title="You are now logged in. Additional event info is now available on the website." navigateTo="/" />;
65
65
  }
66
66
 
67
67
  if (requireExtraQuestions()) {
68
68
  return (
69
- <HeroComponent
69
+ <Interstitial
70
70
  title="You need to complete some extra questions before entering the event"
71
- redirectTo="/a/extra-questions"
71
+ navigateTo="/a/extra-questions"
72
72
  />
73
73
  );
74
74
  }
@@ -3,7 +3,7 @@ import { connect } from "react-redux";
3
3
  import { navigate } from "gatsby";
4
4
  import { pick } from "@gatsbyjs/reach-router";
5
5
  import { getUserProfile, requireExtraQuestions } from "../actions/user-actions";
6
- import HeroComponent from "../components/HeroComponent";
6
+ import Interstitial from "../components/Interstitial";
7
7
  import { userHasAccessLevel, VIRTUAL_ACCESS_LEVEL } from "@utils/authorizedGroups";
8
8
 
9
9
  const pathsRequiringVirtualBadge = [
@@ -79,20 +79,20 @@ const WithAuthzRoute = ({
79
79
  }, [fetchedUserProfile, isLoggedIn, hasTicket, isAuthorized, userProfile, getUserProfile, userIsAuthz]);
80
80
 
81
81
  if (!isLoggedIn) {
82
- navigate("/", {state: {backUrl: `${location.pathname}`,},});
82
+ navigate("/", { state: { backUrl: `${location.pathname}` } });
83
83
  return null;
84
84
  }
85
85
 
86
86
  // we are checking credentials if userProfile is being loading yet or
87
87
  // if we are re-fetching the user profile to check new data ( user currently is not a authz
88
88
  if (!userIsReady() || checkingCredentials()) {
89
- return <HeroComponent title="Checking credentials..."/>;
89
+ return <Interstitial title="Checking credentials..."/>;
90
90
  }
91
91
 
92
92
  // has no ticket -> redirect
93
93
  if (!userIsAuthz) {
94
- const options = { state: { error: !hasTicket ? 'no-ticket' : 'no-virtual-access' } };
95
- return <HeroComponent title="Checking credentials..." redirectTo="/authz/ticket" options={options}/>;
94
+ const options = { state: { error: !hasTicket ? "no-ticket" : "no-virtual-access" } };
95
+ return <Interstitial title="Checking credentials..." navigateTo="/authz/ticket" navigateOptions={options} />;
96
96
  }
97
97
 
98
98
  return children;
@@ -1,8 +1,8 @@
1
1
  import React, {useEffect} from "react";
2
2
  import { connect } from "react-redux";
3
3
  import { isAuthorizedBadge } from "../utils/authorizedGroups";
4
- import HeroComponent from "../components/HeroComponent";
5
- import {getEventById, getEventStreamingInfoById} from "../actions/event-actions";
4
+ import Interstitial from "../components/Interstitial";
5
+ import { getEventById, getEventStreamingInfoById } from "../actions/event-actions";
6
6
  import { isMuxVideo } from "../utils/videoUtils";
7
7
  import {navigate} from "gatsby";
8
8
 
@@ -26,7 +26,7 @@ const WithBadgeRoute = ({ children, location, eventId, event, loading, userProfi
26
26
  getEventById(eventId).then((res) => {
27
27
  const { err } = res;
28
28
  // check error
29
- if(err && err?.status === 404){
29
+ if (err && err?.status === 404){
30
30
  navigate('/a/schedule');
31
31
  }
32
32
  getEventStreamingInfoById(eventId)
@@ -37,11 +37,11 @@ const WithBadgeRoute = ({ children, location, eventId, event, loading, userProfi
37
37
  }, [eventId, getEventById, event, getEventStreamingInfoById]);
38
38
 
39
39
  if (loading || needsToLoadEvent) {
40
- return <HeroComponent title="Loading event" />;
40
+ return <Interstitial title="Loading event" />;
41
41
  }
42
42
 
43
43
  if (!userIsAuthz || !hasBadgeForEvent) {
44
- return <HeroComponent title={getTitle()} redirectTo={location.state?.previousUrl || "/"}/>;
44
+ return <Interstitial title={getTitle()} navigateTo={location.state?.previousUrl || "/"} />;
45
45
  }
46
46
 
47
47
  return children;
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import { connect } from "react-redux";
3
- import HeroComponent from "../components/HeroComponent";
3
+ import Interstitial from "../components/Interstitial";
4
4
 
5
5
  const WithTicketRoute = ({ children, location, userProfile, hasTicket, isAuthorized }) => {
6
6
  const userIsAuthz = hasTicket || isAuthorized;
@@ -13,7 +13,7 @@ const WithTicketRoute = ({ children, location, userProfile, hasTicket, isAuthori
13
13
  };
14
14
 
15
15
  if (!userIsAuthz || !userProfile) {
16
- return <HeroComponent title={getTitle()} redirectTo={location.state?.previousUrl || "/"} />;
16
+ return <Interstitial title={getTitle()} navigateTo={location.state?.previousUrl || "/"} />;
17
17
  }
18
18
 
19
19
  return children;
@@ -22,7 +22,7 @@ const WithTicketRoute = ({ children, location, userProfile, hasTicket, isAuthori
22
22
  const mapStateToProps = ({ userState }) => ({
23
23
  userProfile: userState.userProfile,
24
24
  hasTicket: userState.hasTicket,
25
- isAuthorized: userState.isAuthorized,
25
+ isAuthorized: userState.isAuthorized
26
26
  });
27
27
 
28
28
  export default connect(mapStateToProps)(WithTicketRoute);
@@ -18,7 +18,7 @@ import { Redirect } from "@gatsbyjs/reach-router";
18
18
  import { connect } from "react-redux";
19
19
  import AbstractAuthorizationCallbackRoute from "openstack-uicore-foundation/lib/security/abstract-auth-callback-route";
20
20
  import { getUserProfile, addToSchedule, removeFromSchedule } from "../actions/user-actions";
21
- import HeroComponent from "../components/HeroComponent";
21
+ import Interstitial from "../components/Interstitial";
22
22
  import { getEnvVariable, IDP_BASE_URL, OAUTH2_CLIENT_ID } from "@utils/envVariables";
23
23
  import { getPendingAction } from "@utils/schedule";
24
24
 
@@ -58,7 +58,7 @@ class AuthorizationCallbackRoute extends AbstractAuthorizationCallbackRoute {
58
58
  error.includes("access_denied") ||
59
59
  error.includes("consent_required")
60
60
  ) return <Redirect to={"/"} noThrow />;
61
- return <Redirect to={`/error?error=${error}`} noThrow/>;
61
+ return <Redirect to={`/error?error=${error}`} noThrow />;
62
62
  }
63
63
 
64
64
  render() {
@@ -75,13 +75,13 @@ class AuthorizationCallbackRoute extends AbstractAuthorizationCallbackRoute {
75
75
  if (!id_token_is_valid) {
76
76
  return this._redirect2Error("token_validation_error");
77
77
  }
78
- return <HeroComponent title="Checking credentials..."/>;
78
+ return <Interstitial title="Checking credentials..." />;
79
79
  }
80
80
  }
81
81
 
82
82
 
83
83
  const mapStateToProps = ({ userState }) => ({
84
- userProfile: userState.userProfile,
84
+ userProfile: userState.userProfile
85
85
  });
86
86
 
87
87
  export default connect(mapStateToProps, {
@@ -120,10 +120,6 @@ footer {
120
120
  padding-top: 12px;
121
121
  }
122
122
 
123
- #content-wrapper {
124
- min-height: 95vh;
125
- }
126
-
127
123
  div.login-form {
128
124
  display: block;
129
125
  background-color: #f5f5f5;
@@ -204,26 +200,12 @@ h2 {
204
200
  .talk {
205
201
  color: var(--color_text_dark);
206
202
 
207
- &__break {
208
- background-color: var(--color_secondary);
209
- width: 100%;
210
- aspect-ratio: auto 16 / 9;
211
-
212
- h1,
213
- h2 {
214
- color: var(--color_text_light);
215
- font-size: 42px;
216
- }
217
- }
218
-
219
203
  h1 {
220
204
  font-size: 40px;
221
- color: var(--color_text_dark);
222
205
  }
223
206
 
224
207
  &__date {
225
208
  font-weight: bold;
226
- color: var(--color_text_dark);
227
209
  }
228
210
 
229
211
  &__speaker, &__moderator {
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
  import PropTypes from "prop-types";
3
- import {connect} from "react-redux";
3
+ import { connect } from "react-redux";
4
4
  import { isEqual } from "lodash";
5
5
  import Layout from "../components/Layout";
6
6
  import DisqusComponent from "../components/DisqusComponent";
@@ -11,14 +11,14 @@ import TalkComponent from "../components/TalkComponent";
11
11
  import DocumentsComponent from "../components/DocumentsComponent";
12
12
  import VideoBanner from "../components/VideoBanner";
13
13
  import SponsorComponent from "../components/SponsorComponent";
14
- import NoTalkComponent from "../components/NoTalkComponent";
15
- import HeroComponent from "../components/HeroComponent";
14
+ import PrePostEventSlide from "../components/PrePostEventSlide";
15
+ import Interstitial from "../components/Interstitial";
16
16
  import UpcomingEventsComponent from "../components/UpcomingEventsComponent";
17
17
  import Link from "../components/Link";
18
18
  import AccessTracker, {AttendeesWidget} from "../components/AttendeeToAttendeeWidgetComponent"
19
19
  import AttendanceTrackerComponent from "../components/AttendanceTrackerComponent";
20
20
  import EventFeedbackComponent from "../components/EventFeedbackComponent"
21
- import {PHASES} from "../utils/phasesUtils";
21
+ import { PHASES } from "../utils/phasesUtils";
22
22
  import { getEventById, getEventStreamingInfoById } from "../actions/event-actions";
23
23
  import URI from "urijs";
24
24
  import useMarketingSettings, { MARKETING_SETTINGS_KEYS } from "@utils/useMarketingSettings";
@@ -41,7 +41,7 @@ export const EventPageTemplate = class extends React.Component {
41
41
  if (!isEqual(event, nextProps.event)) return true;
42
42
  if (!isEqual(eventTokens, nextProps.eventTokens)) return true;
43
43
  // a synch did happened!
44
- if(lastDataSync !== nextProps.lastDataSync) return true;
44
+ if (lastDataSync !== nextProps.lastDataSync) return true;
45
45
  // compare current event phase with next one
46
46
  const currentPhase = eventsPhases.find((e) => parseInt(e.id) === parseInt(eventId))?.phase;
47
47
  const nextCurrentPhase = nextProps.eventsPhases.find(
@@ -92,15 +92,15 @@ export const EventPageTemplate = class extends React.Component {
92
92
 
93
93
  // if event is loading or we are still calculating the current phase ...
94
94
  if (loading || currentPhase === undefined || currentPhase === null) {
95
- return <HeroComponent title="Loading event"/>;
95
+ return <Interstitial title="Loading event" contained />;
96
96
  }
97
97
 
98
98
  if (!event) {
99
- return <HeroComponent title="Event not found" redirectTo="/a/schedule"/>;
99
+ return <Interstitial title="Event not found" navigateTo="/a/schedule" contained />;
100
100
  }
101
101
 
102
- if(isMuxVideo(event?.streaming_url) && event?.stream_is_secure && ! checkMuxTokens(eventTokens)){
103
- return <HeroComponent title="Loading secure event"/>;
102
+ if (isMuxVideo(event?.streaming_url) && event?.stream_is_secure && !checkMuxTokens(eventTokens)) {
103
+ return <Interstitial title="Loading secure event" contained />;
104
104
  }
105
105
 
106
106
  return (
@@ -109,25 +109,25 @@ export const EventPageTemplate = class extends React.Component {
109
109
  <div className="columns is-gapless">
110
110
  {this.canRenderVideo(currentPhase) ? (
111
111
  <div className="column is-three-quarters px-0 py-0">
112
- <VideoComponent
113
- url={event.streaming_url}
114
- tokens={eventTokens}
115
- isLive={event.streaming_type === "LIVE"}
116
- title={event.title}
117
- namespace={summit.name}
118
- firstHalf={firstHalf}
119
- autoPlay={autoPlay}
120
- start={startTime}
121
- onError={this.onError}
122
- />
112
+ <VideoComponent
113
+ url={event.streaming_url}
114
+ tokens={eventTokens}
115
+ isLive={event.streaming_type === "LIVE"}
116
+ title={event.title}
117
+ namespace={summit.name}
118
+ firstHalf={firstHalf}
119
+ autoPlay={autoPlay}
120
+ start={startTime}
121
+ onError={this.onError}
122
+ />
123
123
  {event.meeting_url && <VideoBanner event={event} ctaText={activityCtaText} />}
124
124
  </div>
125
125
  ) : (
126
126
  <div className="column is-three-quarters px-0 py-0 is-full-mobile">
127
- <NoTalkComponent
128
- currentEventPhase={currentPhase}
129
- event={event}
127
+ <PrePostEventSlide
130
128
  summit={summit}
129
+ event={event}
130
+ eventPhase={currentPhase}
131
131
  />
132
132
  </div>
133
133
  )}
@@ -151,9 +151,8 @@ export const EventPageTemplate = class extends React.Component {
151
151
  <div className="column is-three-quarters is-full-mobile">
152
152
  <div className="px-5 py-5">
153
153
  <TalkComponent
154
- currentEventPhase={currentPhase}
155
- event={event}
156
154
  summit={summit}
155
+ event={event}
157
156
  />
158
157
  </div>
159
158
  { event.allow_feedback &&
@@ -17,9 +17,10 @@ import ExtraQuestionsForm from 'openstack-uicore-foundation/lib/components/extra
17
17
 
18
18
  import { DefaultScrollBehaviour as ScrollBehaviour } from '@utils/scroll';
19
19
 
20
- import styles from '../styles/extra-questions.module.scss';
21
20
  import { getAttendeeData } from '../actions/extra-questions-actions';
22
- import HeroComponent from "../components/HeroComponent";
21
+ import Interstitial from "../components/Interstitial";
22
+
23
+ import styles from '../styles/extra-questions.module.scss';
23
24
 
24
25
  const noOpFn = () => {};
25
26
 
@@ -146,7 +147,7 @@ export const ExtraQuestionsPageTemplate = ({ user, summit, extraQuestions, atten
146
147
  };
147
148
 
148
149
  if ((!ticket && !attendeeId) || (attendeeId && someoneElseLoaded === false)) {
149
- return <HeroComponent title={"Sorry. You don't have a ticket for this event."} redirectTo={"/"} />;
150
+ return <Interstitial title={"Sorry. You don't have a ticket for this event."} navigateTo={"/"} contained />;
150
151
  }
151
152
 
152
153
  const getAttendeeFullname = (attendee) => {
@@ -650,7 +650,7 @@ export const FullProfilePageTemplate = ({ user, getIDPProfile, updateProfile, up
650
650
  handleClose={() => handleTogglePopup(false)}
651
651
  />
652
652
  }
653
- <AccessTracker />
653
+ <AccessTracker updateChatProfileEnabled={true} />
654
654
  </React.Fragment>
655
655
  )
656
656
  };
@@ -4,7 +4,7 @@ import { connect } from 'react-redux';
4
4
  import { navigate } from 'gatsby';
5
5
 
6
6
  import Layout from "../components/Layout";
7
- import HeroComponent from '../components/HeroComponent';
7
+ import Interstitial from '../components/Interstitial';
8
8
  import DisqusComponent from '../components/DisqusComponent';
9
9
  import VideoComponent from '../components/VideoComponent';
10
10
  import PosterButton from '../components/PosterButton';
@@ -140,12 +140,12 @@ export const PosterDetailPage = ({
140
140
 
141
141
  const { getSettingByKey } = useMarketingSettings();
142
142
 
143
- if (loading) return <HeroComponent title="Loading poster" />;
143
+ if (loading) return <Interstitial title="Loading poster" contained />;
144
144
 
145
- if (!poster) return <HeroComponent title="Poster not found" />;
145
+ if (!poster) return <Interstitial title="Poster not found" contained />;
146
146
 
147
147
  if (!posterViewable) {
148
- return <HeroComponent title={"Sorry. You need a special badge to view this poster."} redirectTo={location.state?.previousUrl || '/a/'} />;
148
+ return <Interstitial title={"Sorry. You need a special badge to view this poster."} navigateTo={location.state?.previousUrl || "/a/"} contained />;
149
149
  }
150
150
 
151
151
  const mediaUpload = poster.media_uploads?.find((e) => e?.media_upload_type?.name === 'Poster');
@@ -12,7 +12,7 @@ import AdvertiseSponsorsComponent from '../components/AdvertiseSponsorsComponent
12
12
  import DocumentsComponent from '../components/DocumentsComponent'
13
13
  import DisqusComponent from '../components/DisqusComponent'
14
14
  import SponsorBanner from '../components/SponsorBanner'
15
- import HeroComponent from '../components/HeroComponent'
15
+ import Interstitial from '../components/Interstitial'
16
16
  import Link from '../components/Link'
17
17
  import Layout from '../components/Layout'
18
18
  import { scanBadge } from '../actions/user-actions'
@@ -59,7 +59,7 @@ const SponsorPageTemplate = ({ sponsorId, sponsors, scanBadge, eventId, lastData
59
59
  };
60
60
 
61
61
  if (notFound) {
62
- return <HeroComponent title="Sponsor not found" redirectTo="/a/sponsors" />
62
+ return <Interstitial title="Sponsor not found" navigateTo="/a/sponsors" ontained />
63
63
  }
64
64
 
65
65
  const {
@@ -70,7 +70,7 @@ const SponsorPageTemplate = ({ sponsorId, sponsors, scanBadge, eventId, lastData
70
70
  } = sponsorship || {};
71
71
 
72
72
  if (sponsorLoading) {
73
- return <HeroComponent title="Loading..." />
73
+ return <Interstitial title="Loading..." contained />
74
74
  }
75
75
 
76
76
  return (
@@ -3,7 +3,7 @@ import { connect } from "react-redux";
3
3
  import PropTypes from "prop-types";
4
4
  import { Redirect } from "@gatsbyjs/reach-router";
5
5
  import { getEnvVariable, REGISTRATION_BASE_URL } from "../utils/envVariables";
6
- import HeroComponent from "../components/HeroComponent";
6
+ import Interstitial from "../components/Interstitial";
7
7
  import { navigate } from "gatsby";
8
8
 
9
9
  export const TicketErrorPageTemplate = class extends React.Component {
@@ -94,7 +94,7 @@ export const TicketErrorPageTemplate = class extends React.Component {
94
94
  if (error) {
95
95
  this.redirect();
96
96
  return (
97
- <HeroComponent
97
+ <Interstitial
98
98
  title={this.getErrorMessage()}
99
99
  subtitle={this.getRedirectMessage()}
100
100
  />
@@ -117,11 +117,11 @@ const TicketErrorPage = ({ location, summit }) => (
117
117
  );
118
118
 
119
119
  TicketErrorPage.propTypes = {
120
- location: PropTypes.object,
120
+ location: PropTypes.object
121
121
  };
122
122
 
123
123
  const mapStateToProps = ({ summitState }) => ({
124
- summit: summitState.summit,
124
+ summit: summitState.summit
125
125
  });
126
126
 
127
127
  export default connect(mapStateToProps, null)(TicketErrorPage);
@@ -1,16 +1,13 @@
1
1
  import React from "react";
2
2
  import PropTypes from "prop-types";
3
3
  import { connect } from "react-redux";
4
-
5
- import URI from "urijs";
6
- import { handleResetReducers } from "../actions/event-actions";
4
+ import URI from "urijs"
7
5
  import { doLogin } from "openstack-uicore-foundation/lib/security/methods";
8
-
6
+ import { handleResetReducers } from "../actions/event-actions";
7
+ import Interstitial from "../components/Interstitial";
8
+ import { userHasAccessLevel, VIRTUAL_ACCESS_LEVEL } from "@utils/authorizedGroups";
9
9
  import { getDefaultLocation } from "@utils/loginUtils";
10
10
 
11
- import HeroComponent from "../components/HeroComponent";
12
- import { userHasAccessLevel, VIRTUAL_ACCESS_LEVEL } from "../utils/authorizedGroups";
13
-
14
11
  export const TokenExpirePageTemplate = class extends React.Component {
15
12
 
16
13
  componentDidMount() {
@@ -37,9 +34,7 @@ export const TokenExpirePageTemplate = class extends React.Component {
37
34
 
38
35
  render() {
39
36
  return (
40
- <HeroComponent
41
- title="Checking credentials..."
42
- />
37
+ <Interstitial title="Checking credentials..." />
43
38
  )
44
39
  }
45
40
  }
@@ -47,7 +42,7 @@ export const TokenExpirePageTemplate = class extends React.Component {
47
42
  TokenExpirePageTemplate.propTypes = {
48
43
  loggedUser: PropTypes.object,
49
44
  location: PropTypes.object,
50
- handleResetReducers: PropTypes.func,
45
+ handleResetReducers: PropTypes.func
51
46
  }
52
47
 
53
48
  const TokenExpirePage = ({ loggedUser, location, handleResetReducers, userProfile, eventRedirect }) => {
@@ -67,14 +62,14 @@ const TokenExpirePage = ({ loggedUser, location, handleResetReducers, userProfil
67
62
  TokenExpirePage.propTypes = {
68
63
  loggedUser: PropTypes.object,
69
64
  location: PropTypes.object,
70
- handleResetReducers: PropTypes.func,
65
+ handleResetReducers: PropTypes.func
71
66
  }
72
67
 
73
68
  const mapStateToProps = ({ loggedUserState, settingState, userState }) => ({
74
69
  loggedUser: loggedUserState,
75
70
  // TODO: move to site settings i/o marketing page settings
76
71
  eventRedirect: settingState.marketingPageSettings.eventRedirect,
77
- userProfile: userState.userProfile,
72
+ userProfile: userState.userProfile
78
73
  })
79
74
 
80
75
  export default connect(mapStateToProps, { handleResetReducers })(TokenExpirePage);
@@ -1,9 +1,9 @@
1
1
  import React, {useEffect, useState} from "react";
2
2
  import { connect } from "react-redux";
3
- import {compose} from "redux";
3
+ import { compose } from "redux";
4
4
  import { useLocation } from '@reach/router';
5
- import HeroComponent from "../components/HeroComponent";
6
- import {clearFilters, callAction, updateFilter, updateFiltersFromHash} from "../actions/schedule-actions";
5
+ import Interstitial from "../components/Interstitial";
6
+ import { clearFilters, callAction, updateFilter, updateFiltersFromHash } from "../actions/schedule-actions";
7
7
  import { reloadScheduleData } from '../actions/base-actions';
8
8
 
9
9
  // This HOC makes sure the schedules array in allSchedulesState is populated before render.
@@ -23,7 +23,7 @@ const componentWrapper = (WrappedComponent) => ({schedules, ...props}) => {
23
23
  }, [key, location.hash]);
24
24
 
25
25
  if (!loaded)
26
- return <HeroComponent title="Loading schedule data" />;
26
+ return <Interstitial title="Loading schedule data" />;
27
27
 
28
28
  return <WrappedComponent {...props} scheduleState={scheduleState} />;
29
29
  };
@@ -1,34 +0,0 @@
1
- import React from 'react'
2
- import { connect } from "react-redux";
3
-
4
- import styles from '../styles/event-hero.module.scss'
5
-
6
- const EventHeroComponent = ({marketingPageSettings}) => (
7
- <section className="hero">
8
- <div className={`${styles.heroEvents} columns`}>
9
- <div className={'column is-12'}>
10
- <div className={`${styles.heroBody} hero-body`}>
11
- <div className={`${styles.heroEventContainer}`}>
12
- <div>
13
- <span className={styles.title}>
14
- {marketingPageSettings.hero.title}
15
- </span>
16
- <span className={styles.subtitle}>
17
- {marketingPageSettings.hero.subTitle}
18
- </span>
19
- </div>
20
- <div className={styles.date}>
21
- <span>{marketingPageSettings.hero.date}</span>
22
- </div>
23
- </div>
24
- </div>
25
- </div>
26
- </div>
27
- </section>
28
- );
29
-
30
- const mapStateToProps = ({settingState}) => ({
31
- marketingPageSettings: settingState.marketingPageSettings
32
- });
33
-
34
- export default connect(mapStateToProps, {})(EventHeroComponent);
@@ -1,23 +0,0 @@
1
- import React, { useEffect } from 'react';
2
- import { navigate } from 'gatsby';
3
- import styles from '../styles/hero.scss'
4
-
5
- const HeroComponent = ({ title, subtitle, event, redirectTo, options = {} }) => {
6
-
7
- useEffect(() => {
8
- if (redirectTo) setTimeout(() => navigate(redirectTo, options), 3000);
9
- }, [redirectTo]);
10
-
11
- return (
12
- <section className={`hero ${event ? 'talk__break' : 'is-fullheight'}`}>
13
- <div className="hero-body hero-component">
14
- <div className={`${event ? '' : 'container has-text-centered'}`}>
15
- <h1 className="title">{title}</h1>
16
- <h2 className="subtitle">{subtitle}</h2>
17
- </div>
18
- </div>
19
- </section>
20
- )
21
- };
22
-
23
- export default HeroComponent;
@@ -1,33 +0,0 @@
1
- import React from "react"
2
- import HeroComponent from './HeroComponent'
3
- import { epochToMomentTimeZone } from "openstack-uicore-foundation/lib/utils/methods";
4
- import { PHASES } from '../utils/phasesUtils';
5
-
6
- const NoTalkComponent = ({ event, currentEventPhase, summit }) => {
7
-
8
- const { class_name, start_date, title } = event;
9
- const { time_zone_id } = summit;
10
-
11
- return (
12
- <div className={`columns talk px-3 py-3`}>
13
- <HeroComponent
14
- title={title}
15
- subtitle={
16
- class_name !== 'Presentation' ?
17
- 'Next session will start soon...'
18
- :
19
- currentEventPhase === PHASES.AFTER && !event.streaming_url ?
20
- 'Session is over. Recording will be available soon.'
21
- :
22
- currentEventPhase < PHASES.DURING || !event.streaming_url ?
23
- `This session will be available on ${epochToMomentTimeZone(start_date, time_zone_id).format('MMMM D hh:mm A (z)')}`
24
- :
25
- ''
26
- }
27
- event={true}
28
- />
29
- </div>
30
- )
31
- };
32
-
33
- export default NoTalkComponent;
@@ -1,92 +0,0 @@
1
- @import "colors.scss";
2
-
3
- div.column:first-of-type {
4
- background-color: var(--color_secondary_contrast);
5
- }
6
-
7
- .hero-events {
8
- .hero-body {
9
- display: flex;
10
- background-color: black;
11
- flex-direction: row;
12
- text-transform: uppercase;
13
- padding: 1rem 6rem;
14
-
15
- .hero-event-container {
16
- display: flex;
17
- align-items: center;
18
- justify-content: space-between;
19
- width: 100%;
20
- }
21
-
22
- .title {
23
- font-size: 48px;
24
- color: var(--color_text_light);
25
- font-weight: bold;
26
- letter-spacing: 0.5rem;
27
- padding-left: 1rem;
28
- }
29
-
30
- .subtitle {
31
- font-size: 38px;
32
- color: var(--color_text_light);
33
- padding-left: 1rem;
34
- }
35
-
36
- .date {
37
- background-color: var(--color_secondary);
38
- color: var(--color_text_light);
39
- font-size: 32px;
40
- letter-spacing: 0.5rem;
41
- padding: 0.5rem 0;
42
- transform: skew(-25deg);
43
-
44
- span:before {
45
- content: "";
46
- margin-right: 1.1em;
47
- }
48
-
49
- span:after {
50
- content: "";
51
- margin-left: 1.2em;
52
- }
53
-
54
- span {
55
- transform: skew(25deg);
56
- display: inline-block;
57
- }
58
- }
59
- }
60
- }
61
-
62
- @media (max-width: 1400px) {
63
- .hero-events {
64
- .hero-body {
65
- padding: 2rem 1.5rem;
66
-
67
- .hero-event-container {
68
- flex-direction: column;
69
-
70
- .subtitle {
71
- display: inline-block;
72
- }
73
-
74
- .date {
75
- text-align: center;
76
- }
77
- }
78
- }
79
- }
80
- }
81
-
82
- @media (max-width: 890px) {
83
- .hero-events {
84
- .hero-body {
85
- .hero-event-container {
86
- .subtitle {
87
- padding-left: 0;
88
- }
89
- }
90
- }
91
- }
92
- }