@openeventkit/event-site 2.0.136 → 2.0.138
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 +2 -2
- package/src/components/ClockComponent.js +7 -10
- package/src/components/Interstitial/index.js +61 -0
- package/src/components/PrePostEventSlide/index.js +66 -0
- package/src/pages/maintenance.js +2 -4
- package/src/routes/ShowOpenRoute.js +5 -5
- package/src/routes/WithAuthzRoute.js +5 -5
- package/src/routes/WithBadgeRoute.js +5 -5
- package/src/routes/WithTicketRoute.js +3 -3
- package/src/routes/authorization-callback-route.js +4 -4
- package/src/styles/style.scss +0 -18
- package/src/templates/event-page.js +24 -25
- package/src/templates/extra-questions-page.js +4 -3
- package/src/templates/poster-detail-page.js +4 -4
- package/src/templates/sponsor-page.js +3 -3
- package/src/templates/ticket-error-page.js +4 -4
- package/src/utils/withScheduleData.js +4 -4
- package/src/components/EventHeroComponent.js +0 -34
- package/src/components/NoTalkComponent.js +0 -33
- package/src/styles/event-hero.module.scss +0 -92
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.
|
|
4
|
+
"version": "2.0.138",
|
|
5
5
|
"author": "Tipit LLC",
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"@fortawesome/fontawesome-svg-core": "^6.5.2",
|
|
@@ -130,7 +130,7 @@
|
|
|
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.
|
|
133
|
+
"summit-registration-lite": "5.0.39",
|
|
134
134
|
"superagent": "8.0.9",
|
|
135
135
|
"sweetalert2": "^9.17.0",
|
|
136
136
|
"upcoming-events-widget": "3.0.5",
|
|
@@ -1,20 +1,17 @@
|
|
|
1
|
-
import React from
|
|
2
|
-
import { connect } from
|
|
3
|
-
import Clock from
|
|
4
|
-
import { updateClock } from
|
|
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
|
-
<
|
|
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);
|
|
@@ -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;
|
|
@@ -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: "40px",
|
|
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: "42px",
|
|
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;
|
package/src/pages/maintenance.js
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import
|
|
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
|
-
<
|
|
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
|
|
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 <
|
|
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
|
-
<
|
|
69
|
+
<Interstitial
|
|
70
70
|
title="You need to complete some extra questions before entering the event"
|
|
71
|
-
|
|
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
|
|
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 <
|
|
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 ?
|
|
95
|
-
return <
|
|
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
|
|
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 <
|
|
40
|
+
return <Interstitial title="Loading event" />;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
if (!userIsAuthz || !hasBadgeForEvent) {
|
|
44
|
-
return <
|
|
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
|
|
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 <
|
|
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
|
|
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 <
|
|
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, {
|
package/src/styles/style.scss
CHANGED
|
@@ -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
|
|
15
|
-
import
|
|
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 <
|
|
95
|
+
return <Interstitial title="Loading event" contained />;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
if (!event) {
|
|
99
|
-
return <
|
|
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 && !
|
|
103
|
-
return <
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
<
|
|
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
|
|
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 <
|
|
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) => {
|
|
@@ -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
|
|
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 <
|
|
143
|
+
if (loading) return <Interstitial title="Loading poster" contained />;
|
|
144
144
|
|
|
145
|
-
if (!poster) return <
|
|
145
|
+
if (!poster) return <Interstitial title="Poster not found" contained />;
|
|
146
146
|
|
|
147
147
|
if (!posterViewable) {
|
|
148
|
-
return <
|
|
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
|
|
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 <
|
|
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 <
|
|
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
|
|
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
|
-
<
|
|
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,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
|
|
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 <
|
|
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,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
|
-
}
|