@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 +5 -5
- package/src/actions/fetch-entities-actions.js +15 -1
- package/src/components/AttendeeToAttendeeWidgetComponent.js +2 -1
- package/src/components/ClockComponent.js +7 -10
- package/src/components/FullSchedule.js +1 -1
- package/src/components/Interstitial/index.js +61 -0
- package/src/components/LiteScheduleComponent.js +2 -2
- package/src/components/LiveEventWidgetComponent.js +2 -3
- package/src/components/PrePostEventSlide/index.js +66 -0
- package/src/components/UpcomingEventsComponent.js +2 -2
- package/src/components/VimeoPlayer.js +2 -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/full-profile-page.js +1 -1
- 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/templates/token-expire-page.js +8 -13
- package/src/utils/withScheduleData.js +4 -4
- package/src/components/EventHeroComponent.js +0 -34
- package/src/components/HeroComponent.js +0 -23
- 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.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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
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);
|
|
@@ -27,7 +27,7 @@ const FullSchedule = ({
|
|
|
27
27
|
...rest
|
|
28
28
|
}) => {
|
|
29
29
|
const { getSettingByKey } = useMarketingSettings();
|
|
30
|
-
const defaultImage = getSettingByKey(MARKETING_SETTINGS_KEYS.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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) => {
|
|
@@ -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
|
|
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,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
|
-
<
|
|
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
|
|
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,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
|
-
}
|