@openeventkit/event-site 2.1.0 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/gatsby-node.js +2 -1
  2. package/netlify.toml +0 -2
  3. package/package.json +13 -10
  4. package/src/actions/fetch-entities-actions.js +26 -1
  5. package/src/cms/config/collections/configurationsCollection/payments/index.js +11 -5
  6. package/src/cms/config/collections/configurationsCollection/payments/typeDefs.js +6 -0
  7. package/src/cms/config/collections/configurationsCollection/typeDefs.js +3 -1
  8. package/src/cms/config/collections/defaultPagesCollection/marketingPage/index.js +10 -5
  9. package/src/cms/config/collections/defaultPagesCollection/marketingPage/typeDefs.js +8 -3
  10. package/src/components/AttendeeToAttendeeWidgetComponent.js +40 -38
  11. package/src/components/AuthComponent.js +4 -0
  12. package/src/components/AvatarEditorModal/index.js +1 -1
  13. package/src/components/ChangePasswordComponent.js +2 -1
  14. package/src/components/DisqusComponent.js +4 -1
  15. package/src/components/MyOrdersTicketsComponent.js +15 -10
  16. package/src/components/RegistrationLiteComponent.js +10 -1
  17. package/src/components/summit-my-orders-tickets/components/DelegatePopup/DelegatePopup.js +2 -3
  18. package/src/components/summit-my-orders-tickets/components/MyOrdersTickets.js +3 -3
  19. package/src/components/summit-my-orders-tickets/components/TicketPopup/TicketPopupAssignForm.js +2 -3
  20. package/src/components/summit-my-orders-tickets/components/TicketPopup/TicketPopupEditDetailsForm/TicketPopupEditDetailsForm.js +3 -1
  21. package/src/components/summit-my-orders-tickets/components/TicketPopup/TicketPopupReassignForm.js +1 -1
  22. package/src/content/marketing-page/index.json +4 -3
  23. package/src/content/{payments.json → payments/index.json} +3 -2
  24. package/src/content/site-settings/index.json +1 -1
  25. package/src/content/sponsors.json +1 -1
  26. package/src/pages/a/[...].js +2 -2
  27. package/src/pages/index.js +1 -0
  28. package/src/routes/logout-callback-route.js +6 -2
  29. package/src/styles/change-password.module.scss +6 -1
  30. package/src/styles/colors.scss +9 -9
  31. package/src/templates/extra-questions-page.js +6 -4
  32. package/src/utils/filePath.js +4 -2
  33. package/src/utils/usePaymentSettings.js +20 -0
  34. package/src/workers/sync_strategies/activity_type_synch_strategy.js +4 -5
  35. package/src/workers/sync_strategies/synch_strategy_factory.js +5 -2
  36. package/src/workers/sync_strategies/track_synch_strategy.js +76 -0
package/gatsby-node.js CHANGED
@@ -250,7 +250,8 @@ const SSR_getSummit = async (baseUrl, summitId) => {
250
250
  "schedule_settings," +
251
251
  "schedule_settings.filters," +
252
252
  "schedule_settings.pre_filters,"+
253
- "ticket_types",
253
+ "ticket_types," +
254
+ "badge_features_types" ,
254
255
  t: Date.now()
255
256
  };
256
257
 
package/netlify.toml CHANGED
@@ -8,8 +8,6 @@
8
8
  YARN_VERSION = "1.22.19"
9
9
  YARN_FLAGS = "--no-ignore-optional"
10
10
  NODE_OPTIONS = "--max-old-space-size=10240"
11
- [[plugins]]
12
- package = "netlify-plugin-gatsby-cache"
13
11
  [[headers]]
14
12
  # Define which paths this specific [[headers]] block will cover.
15
13
  for = "/*"
package/package.json CHANGED
@@ -1,18 +1,19 @@
1
1
  {
2
2
  "name": "@openeventkit/event-site",
3
3
  "description": "Event Site",
4
- "version": "2.1.0",
4
+ "version": "2.1.2",
5
5
  "author": "Tipit LLC",
6
6
  "dependencies": {
7
7
  "@emotion/server": "^11.11.0",
8
8
  "@fortawesome/fontawesome-svg-core": "^6.5.2",
9
9
  "@fortawesome/free-brands-svg-icons": "^6.5.2",
10
10
  "@fortawesome/react-fontawesome": "^0.2.2",
11
+ "@loadable/component": "^5.16.4",
11
12
  "@mdx-js/react": "^3.0.1",
12
13
  "@mdx-js/runtime": "^1.6.22",
13
14
  "@mui/base": "^5.0.0-beta.40",
14
- "@mui/icons-material": "^5.15.5",
15
- "@mui/material": "^5.15.5",
15
+ "@mui/icons-material": "^5.15.20",
16
+ "@mui/material": "^5.15.20",
16
17
  "@mux/mux-player-react": "^1.14.1",
17
18
  "@ncwidgets/file-relation": "^0.8.0",
18
19
  "@ncwidgets/id": "^0.8.1",
@@ -52,7 +53,7 @@
52
53
  "event-feedback-widget": "^2.0.1",
53
54
  "final-form": "4.20.7",
54
55
  "font-awesome": "^4.7.0",
55
- "formik": "^2.2.9",
56
+ "formik": "^2.4.6",
56
57
  "full-schedule-widget": "3.0.9",
57
58
  "gatsby": "^5.13.5",
58
59
  "gatsby-alias-imports": "^1.0.6",
@@ -75,6 +76,7 @@
75
76
  "idtoken-verifier": "^2.2.2",
76
77
  "immutability-helper": "2.9.1",
77
78
  "immutable": "^5.0.0-beta.5",
79
+ "js-cookie": "^3.0.5",
78
80
  "jsdom": "^24.1.0",
79
81
  "klaro": "^0.7.21",
80
82
  "lite-schedule-widget": "3.0.3",
@@ -84,8 +86,9 @@
84
86
  "markdown-it": "^12.0.0",
85
87
  "moment": "^2.27.0",
86
88
  "moment-timezone": "^0.5.31",
89
+ "my-orders-tickets-widget": "1.0.0-beta.47",
87
90
  "object.assign": "^4.1.5",
88
- "openstack-uicore-foundation": "4.1.90",
91
+ "openstack-uicore-foundation": "4.2.8",
89
92
  "path-browserify": "^1.0.1",
90
93
  "prop-types": "^15.6.0",
91
94
  "react": "^18.2.0",
@@ -97,7 +100,7 @@
97
100
  "react-dnd-html5-backend": "^16.0.1",
98
101
  "react-dom": "^18.2.0",
99
102
  "react-final-form": "6.5.9",
100
- "react-i18next": "^11.16.9",
103
+ "react-i18next": "^14.1.2",
101
104
  "react-iframe-comm": "^1.2.2",
102
105
  "react-immutable-proptypes": "^2.2.0",
103
106
  "react-laag": "^2.0.5",
@@ -121,7 +124,7 @@
121
124
  "rehype-mdx-import-media": "^1.2.0",
122
125
  "remark-gfm": "^4.0.0",
123
126
  "sass": "^1.49.9",
124
- "schedule-filter-widget": "3.0.1",
127
+ "schedule-filter-widget": "3.0.2",
125
128
  "simple-chat-widget": "^1.0.31",
126
129
  "simple-oauth2": "^4.1.0",
127
130
  "slick-carousel": "^1.8.1",
@@ -131,9 +134,9 @@
131
134
  "stream-browserify": "^3.0.0",
132
135
  "stream-chat": "^2.7.2",
133
136
  "stream-chat-react": "3.1.7",
134
- "summit-registration-lite": "5.0.44",
137
+ "summit-registration-lite": "5.0.46",
135
138
  "superagent": "8.0.9",
136
- "sweetalert2": "^9.17.0",
139
+ "sweetalert2": "^11.11.1",
137
140
  "upcoming-events-widget": "3.0.7",
138
141
  "urijs": "^1.19.2",
139
142
  "use-fit-text": "^2.4.0",
@@ -145,7 +148,7 @@
145
148
  "web-vitals": "^1.1.2",
146
149
  "what-input": "^5.2.10",
147
150
  "xmlhttprequest": "^1.8.0",
148
- "yup": "^0.32.11"
151
+ "yup": "^1.4.0"
149
152
  },
150
153
  "keywords": [
151
154
  "Open Event Kit"
@@ -181,7 +181,6 @@ export const fetchSpeakerById = async(summitId, speakerId, accessToken = null) =
181
181
  */
182
182
  export const fetchSummitById = async(summitId, accessToken = null) => {
183
183
  let apiUrl = URI(`${process.env.GATSBY_SUMMIT_API_BASE_URL}/api/public/v1/summits/${summitId}`);
184
-
185
184
  const expand = [
186
185
  'event_types',
187
186
  'tracks',
@@ -196,6 +195,32 @@ export const fetchSummitById = async(summitId, accessToken = null) => {
196
195
  'schedule_settings.filters',
197
196
  'schedule_settings.pre_filters',
198
197
  "ticket_types",
198
+ "badge_features_types",
199
+ ]
200
+
201
+ apiUrl.addQuery('expand', expand.join(','));
202
+
203
+ return fetch(apiUrl.toString(), {
204
+ method: 'GET'
205
+ }).then(async (response) => {
206
+ if (response.status === 200) {
207
+ return await response.json();
208
+ }
209
+ return null;
210
+ });
211
+ }
212
+
213
+ /**
214
+ * @param summitId
215
+ * @param trackId
216
+ * @param accessToken
217
+ * @returns {Promise<* | null>}
218
+ */
219
+ export const fetchTrackById = async(summitId, trackId, accessToken = null) => {
220
+ let apiUrl = URI(`${process.env.GATSBY_SUMMIT_API_BASE_URL}/api/public/v1/summits/${summitId}/tracks/${trackId}`);
221
+
222
+ const expand = [
223
+ 'subtracks',
199
224
  ]
200
225
 
201
226
  apiUrl.addQuery('expand', expand.join(','));
@@ -1,14 +1,15 @@
1
1
  import {
2
- fileField,
2
+ booleanField,
3
+ fileField,
3
4
  } from "../../../fields";
4
5
 
5
- import {
6
+ import {
6
7
  PAYMENTS_FILE_PATH,
7
8
  APPLE_PAY_DOMAIN_FILE_PATH,
8
9
  APPLE_PAY_DOMAIN_FILE_NAME
9
10
  } from "@utils/filePath";
10
11
 
11
- const payments = {
12
+ const payments = {
12
13
  label: "Payments",
13
14
  name: "payments",
14
15
  file: PAYMENTS_FILE_PATH,
@@ -19,8 +20,13 @@ const payments = {
19
20
  file: APPLE_PAY_DOMAIN_FILE_NAME,
20
21
  media_folder: APPLE_PAY_DOMAIN_FILE_PATH,
21
22
  public_folder: APPLE_PAY_DOMAIN_FILE_PATH,
22
- }),
23
- ],
23
+ }),
24
+ booleanField({
25
+ label: "Hide Postal Code",
26
+ name: "hidePostalCode",
27
+ required: false,
28
+ }),
29
+ ],
24
30
  };
25
31
 
26
32
  export default payments;
@@ -0,0 +1,6 @@
1
+
2
+ module.exports = `
3
+ type PaymentsJson implements Node {
4
+ hidePostalCode: Boolean
5
+ }
6
+ `;
@@ -2,10 +2,12 @@ const siteSettingsTypeDefs = require("./siteSettings/typeDefs");
2
2
  const adsTypeDefs = require("./ads/typeDefs");
3
3
  const navbarTypeDefs = require("./navbar/typeDefs");
4
4
  const footerTypeDefs = require("./footer/typeDefs");
5
+ const paymentsTypeDefs = require("./payments/typeDefs");
5
6
 
6
7
  module.exports = [
7
8
  siteSettingsTypeDefs,
8
9
  adsTypeDefs,
9
10
  navbarTypeDefs,
10
- footerTypeDefs
11
+ footerTypeDefs,
12
+ paymentsTypeDefs
11
13
  ].join("");
@@ -79,7 +79,12 @@ const marketingPage = {
79
79
  label: "Display",
80
80
  name: "display",
81
81
  required: false
82
- })
82
+ }),
83
+ stringField({
84
+ label: "External Registration Link",
85
+ name: "externalRegistrationLink",
86
+ required: false
87
+ }),
83
88
  ]
84
89
  }),
85
90
  objectField({
@@ -116,7 +121,7 @@ const marketingPage = {
116
121
  required: false
117
122
  }),
118
123
  stringField({
119
- label: "Text",
124
+ label: "Text",
120
125
  name: "text"
121
126
  })
122
127
  ]
@@ -152,7 +157,7 @@ const marketingPage = {
152
157
  required: false
153
158
  }),
154
159
  stringField({
155
- label: "Title",
160
+ label: "Title",
156
161
  name: "title"
157
162
  })
158
163
  ]
@@ -167,7 +172,7 @@ const marketingPage = {
167
172
  required: false
168
173
  }),
169
174
  stringField({
170
- label: "Title",
175
+ label: "Title",
171
176
  name: "title",
172
177
  required: false
173
178
  })
@@ -183,7 +188,7 @@ const marketingPage = {
183
188
  required: false
184
189
  }),
185
190
  stringField({
186
- label: "Title",
191
+ label: "Title",
187
192
  name: "title"
188
193
  }),
189
194
  imageWithAltField()
@@ -42,13 +42,18 @@ module.exports = `
42
42
  display: Boolean
43
43
  text: String
44
44
  }
45
- type MarketingPageHeroButton {
45
+ type MarketingPageHeroRegistrationButton {
46
+ text: String
47
+ display: Boolean
48
+ externalRegistrationLink: String
49
+ }
50
+ type MarketingPageHeroLoginButton {
46
51
  text: String
47
52
  display: Boolean
48
53
  }
49
54
  type MarketingPageHeroButtons {
50
- loginButton: MarketingPageHeroButton
51
- registerButton: MarketingPageHeroButton
55
+ loginButton: MarketingPageHeroLoginButton
56
+ registerButton: MarketingPageHeroRegistrationButton
52
57
  }
53
58
  type MarketingPageHero {
54
59
  title: String
@@ -1,8 +1,8 @@
1
- import React, { useEffect, useRef, useState, useCallback } from "react";
1
+ import React, {useEffect, useRef, useState, useCallback} from "react";
2
2
  import * as Sentry from "@sentry/react";
3
- import { connect } from "react-redux";
3
+ import {connect} from "react-redux";
4
4
  import FragmentParser from "openstack-uicore-foundation/lib/utils/fragment-parser";
5
- import { getAccessToken } from "openstack-uicore-foundation/lib/security/methods";
5
+ import {getAccessToken} from "openstack-uicore-foundation/lib/security/methods";
6
6
  import {
7
7
  AttendeeToAttendeeContainer,
8
8
  permissions,
@@ -18,14 +18,14 @@ import {
18
18
  SUPABASE_URL,
19
19
  SUPABASE_KEY,
20
20
  } from "@utils/envVariables";
21
- import { PHASES } from "@utils/phasesUtils";
21
+ import {PHASES} from "@utils/phasesUtils";
22
22
 
23
23
  import "attendee-to-attendee-widget/dist/index.css";
24
24
 
25
- import { SentryFallbackFunction } from "./SentryErrorComponent";
25
+ import {SentryFallbackFunction} from "./SentryErrorComponent";
26
26
 
27
- import { useEventListener } from "@utils/hooks";
28
- import { INIT_LOGOUT_EVENT } from "@utils/eventTriggers";
27
+ import {useEventListener} from "@utils/hooks";
28
+ import {INIT_LOGOUT_EVENT} from "@utils/eventTriggers";
29
29
  import {getAccessTokenSafely} from "../utils/loginUtils";
30
30
 
31
31
  const sbAuthProps = {
@@ -33,9 +33,11 @@ const sbAuthProps = {
33
33
  supabaseKey: getEnvVariable(SUPABASE_KEY),
34
34
  };
35
35
 
36
+ const envVarsPresent = getEnvVariable(SUPABASE_URL) && getEnvVariable(SUPABASE_KEY) && getEnvVariable(STREAM_IO_API_KEY) && getEnvVariable(CHAT_API_BASE_URL);
37
+
36
38
  const adminGroups = ["administrators", "super-admins"];
37
39
 
38
- const AttendeesWidgetComponent = ({ user, event, summit, chatSettings }) => {
40
+ const AttendeesWidgetComponent = ({user, event, summit, chatSettings}) => {
39
41
  const [loading, setLoading] = useState(true);
40
42
 
41
43
  //Deep linking support
@@ -44,18 +46,18 @@ const AttendeesWidgetComponent = ({ user, event, summit, chatSettings }) => {
44
46
  const sqacRef = useRef();
45
47
  const ocrRef = useRef();
46
48
 
47
- const { userProfile, idpProfile } = user || {};
48
- const { summit_tickets } = userProfile || {};
49
- const {
50
- email,
51
- groups,
49
+ const {userProfile, idpProfile} = user || {};
50
+ const {summit_tickets} = userProfile || {};
51
+ const {
52
+ email,
53
+ groups,
52
54
  bio,
53
55
  given_name,
54
56
  family_name,
55
57
  picture,
56
58
  company,
57
59
  job_title,
58
- sub,
60
+ sub,
59
61
  github_user,
60
62
  linked_in_profile,
61
63
  twitter_name,
@@ -69,7 +71,7 @@ const AttendeesWidgetComponent = ({ user, event, summit, chatSettings }) => {
69
71
  } = idpProfile || {};
70
72
 
71
73
  useEffect(() => {
72
- if (!user || !userProfile || !idpProfile) return;
74
+ if (!user || !userProfile || !idpProfile || !envVarsPresent) return;
73
75
  const fragmentParser = new FragmentParser();
74
76
  const starHelpChatParam = fragmentParser.getParam("starthelpchat");
75
77
  const starQAChatParam = fragmentParser.getParam("startqachat");
@@ -88,7 +90,7 @@ const AttendeesWidgetComponent = ({ user, event, summit, chatSettings }) => {
88
90
  setLoading(false);
89
91
  }, [user, idpProfile, userProfile]);
90
92
 
91
- if (loading) return <div style={{ margin: "20px auto", position: "relative" }}>Loading...</div>;
93
+ if (loading) return <div style={{margin: "20px auto", position: "relative"}}>Loading...</div>;
92
94
 
93
95
  const chatProps = {
94
96
  streamApiKey: getEnvVariable(STREAM_IO_API_KEY),
@@ -133,7 +135,7 @@ const AttendeesWidgetComponent = ({ user, event, summit, chatSettings }) => {
133
135
  .filter((st) => st.badge)
134
136
  .flatMap((st) => st.badge.features)
135
137
  .map((feature) => feature.id))]
136
-
138
+
137
139
  return summit.badge_features_types.filter((bft) => attendeeBadgeFeatureIds.includes(bft.id));
138
140
  },
139
141
  bio: bio,
@@ -144,14 +146,14 @@ const AttendeesWidgetComponent = ({ user, event, summit, chatSettings }) => {
144
146
  showSocialInfo: public_profile_show_social_media_info === true,
145
147
  showBio: public_profile_show_bio === true,
146
148
  hasPermission: (permission) => {
147
- const isAdmin = groups &&
148
- groups.map((g) => g.slug).filter((g) => adminGroups.includes(g))
149
- .length > 0;
149
+ const isAdmin = groups &&
150
+ groups.map((g) => g.slug).filter((g) => adminGroups.includes(g))
151
+ .length > 0;
150
152
  switch (permission) {
151
153
  case permissions.MANAGE_ROOMS:
152
154
  return isAdmin;
153
155
  case permissions.CHAT:
154
- if(isAdmin) return true;
156
+ if (isAdmin) return true;
155
157
  const accessLevels = summit_tickets
156
158
  .flatMap((x) => x.badge?.type.access_levels)
157
159
  .filter(
@@ -181,27 +183,27 @@ const AttendeesWidgetComponent = ({ user, event, summit, chatSettings }) => {
181
183
  ...sbAuthProps,
182
184
  };
183
185
 
184
- if (!chatSettings?.enabled) return null;
186
+ if (!chatSettings?.enabled || !envVarsPresent) return null;
185
187
 
186
188
  return (
187
- <div style={{ margin: "20px auto", position: "relative" }}>
188
- <Sentry.ErrorBoundary fallback={SentryFallbackFunction({componentName: 'Attendee To Attendee'})}>
189
- <AttendeeToAttendeeContainer
190
- {...widgetProps}
191
- ref={{ sdcRef, shcRef, sqacRef, ocrRef }}
192
- />
193
- </Sentry.ErrorBoundary>
194
- </div>
189
+ <div style={{margin: "20px auto", position: "relative"}}>
190
+ <Sentry.ErrorBoundary fallback={SentryFallbackFunction({componentName: 'Attendee To Attendee'})}>
191
+ <AttendeeToAttendeeContainer
192
+ {...widgetProps}
193
+ ref={{sdcRef, shcRef, sqacRef, ocrRef}}
194
+ />
195
+ </Sentry.ErrorBoundary>
196
+ </div>
195
197
  );
196
198
  };
197
199
 
198
- const mapState = ({ settingState }) => ({
200
+ const mapState = ({settingState}) => ({
199
201
  chatSettings: settingState.widgets.chat,
200
202
  });
201
203
 
202
204
  export const AttendeesWidget = connect(mapState)(AttendeesWidgetComponent);
203
205
 
204
- const AccessTracker = ({ user, isLoggedUser, summitPhase, chatSettings, updateChatProfileEnabled=false }) => {
206
+ const AccessTracker = ({user, isLoggedUser, summitPhase, chatSettings, updateChatProfileEnabled = false}) => {
205
207
  const chatProps = {
206
208
  streamApiKey: getEnvVariable(STREAM_IO_API_KEY),
207
209
  apiBaseUrl: getEnvVariable(IDP_BASE_URL),
@@ -215,7 +217,7 @@ const AccessTracker = ({ user, isLoggedUser, summitPhase, chatSettings, updateCh
215
217
  return accessToken;
216
218
  },
217
219
  };
218
-
220
+
219
221
  const trackerRef = useRef();
220
222
 
221
223
  const handleLogout = useCallback(() => {
@@ -228,7 +230,7 @@ const AccessTracker = ({ user, isLoggedUser, summitPhase, chatSettings, updateCh
228
230
  useEffect(() => {
229
231
  if (!isLoggedUser) {
230
232
  if (trackerRef.current)
231
- trackerRef.current.signOut();
233
+ trackerRef.current.signOut();
232
234
  }
233
235
  }, [isLoggedUser]);
234
236
 
@@ -251,7 +253,7 @@ const AccessTracker = ({ user, isLoggedUser, summitPhase, chatSettings, updateCh
251
253
  return null;
252
254
  }
253
255
 
254
- const { summit_tickets } = user.userProfile;
256
+ const {summit_tickets} = user.userProfile;
255
257
  const {
256
258
  bio,
257
259
  given_name,
@@ -310,12 +312,12 @@ const AccessTracker = ({ user, isLoggedUser, summitPhase, chatSettings, updateCh
310
312
  ...sbAuthProps
311
313
  };
312
314
 
313
- if (!chatSettings.enabled) return null;
315
+ if (!chatSettings.enabled || !envVarsPresent) return null;
314
316
 
315
- return <Tracker {...widgetProps} ref={trackerRef} />;
317
+ return <Tracker {...widgetProps} ref={trackerRef}/>;
316
318
  };
317
319
 
318
- const mapStateToProps = ({ loggedUserState, userState, clockState, settingState }) => ({
320
+ const mapStateToProps = ({loggedUserState, userState, clockState, settingState}) => ({
319
321
  isLoggedUser: loggedUserState.isLoggedUser,
320
322
  user: userState,
321
323
  summitPhase: clockState.summit_phase,
@@ -46,6 +46,7 @@ const AuthComponent = ({
46
46
  const [otpLogin, setOtpLogin] = useState(false);
47
47
  const [userEmail, setUserEmail] = useState('');
48
48
  const [otpLength, setOtpLength] = useState(null);
49
+ const [otpLifeTime, setOtpLifeTime] = useState(null);
49
50
  const [otpError, setOtpError] = useState(false);
50
51
 
51
52
  const hasVirtualBadge = useMemo(() =>
@@ -129,8 +130,10 @@ const AuthComponent = ({
129
130
 
130
131
  const sendCode = (email) => {
131
132
  setUserEmail(email);
133
+ setOtpLifeTime(0);
132
134
  return getPasswordlessCode(email).then(({ response }) => {
133
135
  setOtpLength(response.otp_length);
136
+ setOtpLifeTime(response.otp_lifetime)
134
137
  setOtpLogin(true);
135
138
  }).catch((err) => {
136
139
  const errorMessage = err.response?.body?.error || err.message;
@@ -154,6 +157,7 @@ const AuthComponent = ({
154
157
  const passwordlessLoginProps = {
155
158
  email: userEmail,
156
159
  codeLength: otpLength,
160
+ codeLifeTime: otpLifeTime,
157
161
  passwordlessLogin: (code) => loginPasswordless(code, userEmail).then(() => {
158
162
  // close popup and then navigate bc its its the same origin page
159
163
  // it would not reload and closed the popup automatically
@@ -1,6 +1,6 @@
1
1
  import React, { useState, useRef, useEffect } from "react";
2
2
  import AvatarEditor from "react-avatar-editor";
3
- import { AjaxLoader } from "openstack-uicore-foundation/lib/components";
3
+ import AjaxLoader from "openstack-uicore-foundation/lib/components/ajaxloader";
4
4
  import { Box, Typography, Slider, Modal } from "@mui/material";
5
5
  import { Button, IconButton } from "../ui";
6
6
  import { styled } from "@mui/system";
@@ -35,6 +35,7 @@ const ChangePasswordComponent = ({ updatePassword }) => {
35
35
  <div className={`columns is-mobile ${styles.passwordFields}`}>
36
36
  <div className={`columns column is-full ${styles.inputField}`}>
37
37
  <b>Current Password</b>
38
+ <i className={styles.subLabel}>(leave blank if you don't have one)</i>
38
39
  <div>
39
40
  <input
40
41
  className={`column is-11 ${styles.input} ${styles.isLarge}`}
@@ -81,7 +82,7 @@ const ChangePasswordComponent = ({ updatePassword }) => {
81
82
  </div>
82
83
  <div className={`columns is-mobile ${styles.buttons}`}>
83
84
  <div className={`column is-full`}>
84
- <button disabled={!currentPassword || !newPassword || !newPasswordConfirm}
85
+ <button disabled={!newPassword || !newPasswordConfirm}
85
86
  className="button is-large"
86
87
  onClick={() => updatePassword(currentPassword, newPassword, newPasswordConfirm)}
87
88
  >
@@ -126,7 +126,10 @@ const DisqusComponent = ({summit, sponsor, event, disqusSSO, hideMobile, title,
126
126
  if (!remoteAuthS3) error = ` ${error} ${!remoteAuthS3 ? 'SSO remoteAuthS3 missing' : ''}`;
127
127
  if (!apiKey) error = ` ${error} ${!apiKey ? 'SSO apiKey missing' : ''}`;
128
128
  if (!shortname) error = ` ${error} ${!shortname ? 'DISQUS_SHORTNAME env var missing' : ''}`;
129
- return error;
129
+
130
+ // no error, fail silently
131
+ console.log(error);
132
+ return null;
130
133
  }
131
134
 
132
135
  const disqusConfig = {
@@ -1,12 +1,17 @@
1
1
  import React from 'react';
2
2
  import * as Sentry from "@sentry/react";
3
3
  import { useDispatch, useSelector } from 'react-redux';
4
- import { getEnvVariable, IDP_BASE_URL, SUMMIT_API_BASE_URL, OAUTH2_CLIENT_ID, SUPPORT_EMAIL } from '../utils/envVariables';
5
- import { MyOrdersTicketsWidget } from './summit-my-orders-tickets';
6
- import { getUserProfile, ticketOwnerChange } from '../actions/user-actions';
7
-
4
+ import { getAccessToken } from 'openstack-uicore-foundation/lib/security/methods';
5
+ import { getEnvVariable, SUMMIT_API_BASE_URL, OAUTH2_CLIENT_ID, SUPPORT_EMAIL } from '../utils/envVariables';
6
+ import { getUserProfile, ticketOwnerChange,updateProfile } from '../actions/user-actions';
7
+ import loadable from "@loadable/component";
8
+ import 'my-orders-tickets-widget/dist/index.css';
9
+ import 'my-orders-tickets-widget/dist/i18n';
8
10
  import { SentryFallbackFunction } from "./SentryErrorComponent";
9
- import {getAccessTokenSafely} from "../utils/loginUtils";
11
+ const MyOrdersMyTicketsWidget = loadable(() => import("my-orders-tickets-widget/dist/index"), {
12
+ ssr: false,
13
+ fallback: null,
14
+ });
10
15
 
11
16
  export const MyOrdersTicketsComponent = () => {
12
17
  const dispatch = useDispatch();
@@ -18,19 +23,19 @@ export const MyOrdersTicketsComponent = () => {
18
23
  const widgetProps = {
19
24
  apiBaseUrl: getEnvVariable(SUMMIT_API_BASE_URL),
20
25
  clientId: getEnvVariable(OAUTH2_CLIENT_ID),
21
- idpBaseUrl: getEnvVariable(IDP_BASE_URL),
22
26
  supportEmail: summit.support_email || getEnvVariable(SUPPORT_EMAIL),
23
27
  loginUrl: '/',
24
- getAccessToken: getAccessTokenSafely,
28
+ getAccessToken,
25
29
  getUserProfile: async () => await dispatch(getUserProfile()),
30
+ updateProfile: (profile) => dispatch(updateProfile(profile)),
26
31
  summit,
27
32
  user,
28
33
  onTicketAssigned: (ticket) => dispatch(ticketOwnerChange(ticket))
29
34
  };
30
35
 
31
36
  return (
32
- <Sentry.ErrorBoundary fallback={SentryFallbackFunction({componentName: 'My Orders & Tickets'})}>
33
- <MyOrdersTicketsWidget {...widgetProps} />
34
- </Sentry.ErrorBoundary>
37
+ <Sentry.ErrorBoundary fallback={SentryFallbackFunction({componentName: 'My Orders & Tickets'})}>
38
+ <MyOrdersMyTicketsWidget {...widgetProps} />
39
+ </Sentry.ErrorBoundary>
35
40
  );
36
41
  };
@@ -22,6 +22,7 @@ import { SentryFallbackFunction } from "./SentryErrorComponent";
22
22
  import RegistrationLiteWidget from "summit-registration-lite/dist";
23
23
  import "summit-registration-lite/dist/index.css";
24
24
  import useSiteSettings from "@utils/useSiteSettings";
25
+ import usePaymentSettings from "@utils/usePaymentSettings";
25
26
  import useMarketingSettings, { MARKETING_SETTINGS_KEYS } from "@utils/useMarketingSettings";
26
27
  import { getEnvVariable, SUMMIT_API_BASE_URL, OAUTH2_CLIENT_ID, REGISTRATION_BASE_URL, SUPPORT_EMAIL } from "@utils/envVariables";
27
28
  import { userHasAccessLevel, VIRTUAL_ACCESS_LEVEL } from "@utils/authorizedGroups";
@@ -73,6 +74,11 @@ const RegistrationLiteComponent = ({
73
74
  };
74
75
 
75
76
  const handleOpenPopup = () => {
77
+ const { registerButton } = marketingPageSettings.hero.buttons;
78
+ if(registerButton?.externalRegistrationLink){
79
+ window.location = registerButton.externalRegistrationLink;
80
+ return;
81
+ }
76
82
  setIsActive(true);
77
83
  }
78
84
 
@@ -127,6 +133,8 @@ const RegistrationLiteComponent = ({
127
133
 
128
134
  const siteSettings = useSiteSettings();
129
135
 
136
+ const paymentSettings = usePaymentSettings();
137
+
130
138
  const widgetProps = {
131
139
  apiBaseUrl: getEnvVariable(SUMMIT_API_BASE_URL),
132
140
  clientId: getEnvVariable(OAUTH2_CLIENT_ID),
@@ -197,7 +205,8 @@ const RegistrationLiteComponent = ({
197
205
  showCompanyInputDefaultOptions: showCompanyInputDefaultOptions,
198
206
  idpLogoLight: siteSettings?.idpLogo?.idpLogoLight?.publicURL,
199
207
  idpLogoDark: siteSettings?.idpLogo?.idpLogoDark?.publicURL,
200
- idpLogoAlt: siteSettings?.idpLogo?.idpLogoAlt
208
+ idpLogoAlt: siteSettings?.idpLogo?.idpLogoAlt,
209
+ hidePostalCode: paymentSettings?.hidePostalCode
201
210
  };
202
211
 
203
212
  const { registerButton } = marketingPageSettings.hero.buttons;
@@ -12,7 +12,6 @@
12
12
  **/
13
13
  import React, { useState } from 'react'
14
14
  import { useTranslation } from "react-i18next";
15
- import { Input } from 'openstack-uicore-foundation/lib/components';
16
15
  import usePortal from 'react-useportal';
17
16
 
18
17
  import './delegate-popup.scss';
@@ -37,7 +36,7 @@ export const DelegatePopup = ({ isOpen, onAccept, onReject }) => {
37
36
  <div className="confirm-popup">
38
37
  <h4>Delegate Ticket</h4>
39
38
  <p>Delegation will create a new attendee and require to you to fill the first Name, last Name and to answer the extra questions again</p>
40
-
39
+
41
40
  <div className="buttons">
42
41
  <span onClick={handleRejectClick}>{t("confirm_popup.cancel")}</span>
43
42
  <span onClick={handleAcceptClick}>{t("confirm_popup.accept")}</span>
@@ -48,4 +47,4 @@ export const DelegatePopup = ({ isOpen, onAccept, onReject }) => {
48
47
  )}
49
48
  </>
50
49
  );
51
- };
50
+ };
@@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react';
2
2
  import { useDispatch, useSelector, shallowEqual } from 'react-redux';
3
3
  import { useTranslation } from "react-i18next";
4
4
  import classNames from 'classnames';
5
- import { AjaxLoader } from "openstack-uicore-foundation/lib/components";
5
+ import AjaxLoader from "openstack-uicore-foundation/lib/components/ajaxloader";
6
6
  import { getUserOrders } from '../store/actions/order-actions';
7
7
  import { getUserTickets } from '../store/actions/ticket-actions';
8
8
  import { OrderList } from './OrderList/OrderList';
@@ -62,7 +62,7 @@ export const MyOrdersTickets = ({ className }) => {
62
62
  )}
63
63
 
64
64
  <div className={classNames('my-orders-tickets', className)}>
65
- {hasOrders && (
65
+ {hasOrders && (
66
66
  <OrderList />
67
67
  )}
68
68
 
@@ -76,4 +76,4 @@ export const MyOrdersTickets = ({ className }) => {
76
76
  </div>
77
77
  </>
78
78
  );
79
- };
79
+ };
@@ -5,9 +5,8 @@ import { CSSTransition } from "react-transition-group";
5
5
  import Alert from 'react-bootstrap/lib/Alert';
6
6
  import { useFormik } from 'formik';
7
7
  import * as Yup from 'yup';
8
- import { Input } from 'openstack-uicore-foundation/lib/components'
8
+ import Input from 'openstack-uicore-foundation/lib/components/inputs/text-input'
9
9
  import { assignAttendee } from "../../store/actions/ticket-actions";
10
- import { getSummitFormattedReassignDate } from "../../util";
11
10
  import { useTicketAssignedContext } from "../../context/TicketAssignedContext";
12
11
 
13
12
  const initialValues = {
@@ -134,4 +133,4 @@ export const TicketPopupAssignForm = ({ ticket, summit, order }) => {
134
133
  </div>
135
134
  </form>
136
135
  )
137
- };
136
+ };
@@ -5,7 +5,9 @@ import { CSSTransition } from "react-transition-group";
5
5
  import Alert from 'react-bootstrap/lib/Alert';
6
6
  import { useFormik } from 'formik';
7
7
  import * as Yup from 'yup';
8
- import { Input, RegistrationCompanyInput, RawHTML } from 'openstack-uicore-foundation/lib/components';
8
+ import Input from 'openstack-uicore-foundation/lib/components/inputs/text-input'
9
+ import RegistrationCompanyInput from 'openstack-uicore-foundation/lib/components/inputs/registration-company-input';
10
+ import RawHTML from 'openstack-uicore-foundation/lib/components/raw-html';
9
11
  import ExtraQuestionsForm from 'openstack-uicore-foundation/lib/components/extra-questions';
10
12
  import QuestionsSet from 'openstack-uicore-foundation/lib/utils/questions-set';
11
13
  import { getMainOrderExtraQuestions } from '../../../store/actions/summit-actions';
@@ -5,7 +5,7 @@ import { CSSTransition } from "react-transition-group";
5
5
  import Alert from 'react-bootstrap/lib/Alert';
6
6
  import { useFormik } from 'formik';
7
7
  import * as Yup from 'yup';
8
- import { Input } from 'openstack-uicore-foundation/lib/components'
8
+ import Input from 'openstack-uicore-foundation/lib/components/inputs/text-input'
9
9
  import { changeTicketAttendee } from "../../store/actions/ticket-actions";
10
10
  import { ConfirmPopup, CONFIRM_POPUP_CASE } from "../ConfirmPopup/ConfirmPopup";
11
11
  import { getSummitFormattedReassignDate } from "../../util";
@@ -6,7 +6,8 @@
6
6
  "buttons": {
7
7
  "registerButton": {
8
8
  "text": "Register Now",
9
- "display": true
9
+ "display": true,
10
+ "externalRegistrationLink": ""
10
11
  },
11
12
  "loginButton": {
12
13
  "text": "Log In",
@@ -16,7 +17,7 @@
16
17
  "images": []
17
18
  },
18
19
  "countdown": {
19
- "display": false
20
+ "display": false
20
21
  },
21
22
  "widgets": {
22
23
  "schedule": {
@@ -30,4 +31,4 @@
30
31
  }
31
32
  },
32
33
  "masonry": {}
33
- }
34
+ }
@@ -1,3 +1,4 @@
1
1
  {
2
- "applePayDomainFile": "/static/.well-known/apple-developer-merchantid-domain-association"
3
- }
2
+ "applePayDomainFile": "/static/.well-known/apple-developer-merchantid-domain-association",
3
+ "hidePostalCode": false
4
+ }
@@ -1 +1 @@
1
- {"favicon":{"asset":"icon.png"},"widgets":{"chat":{"enabled":true,"showQA":false,"showHelp":false,"defaultScope":"page"},"schedule":{"allowClick":true}},"identityProviderButtons":[{"buttonColor":"#082238","providerLabel":"Continue with FNid","providerLogo":"logo_fn.svg","providerLogoSize":27},{"buttonColor":"#0A66C2","providerLabel":"Sign in with LinkedIn","providerParam":"linkedin","providerLogo":"logo_linkedin.svg","providerLogoSize":18},{"buttonColor":"#000000","providerLabel":"Sign in with Apple","providerParam":"apple","providerLogoSize":17,"providerLogo":"logo_apple.svg"},{"buttonColor":"#1877F2","providerLabel":"Login with Facebook","providerParam":"facebook","providerLogo":"logo_facebook.svg","providerLogoSize":20}],"maintenanceMode":{"enabled":false,"title":"Site under maintenance","subtitle":"Please reload page shortly"},"staticJsonFilesBuildTime":[{"file":"src/data/summit.json","build_time":1740576308172},{"file":"src/data/events.json","build_time":1740576314171},{"file":"src/data/events.idx.json","build_time":1740576314176},{"file":"src/data/speakers.json","build_time":1740576315122},{"file":"src/data/speakers.idx.json","build_time":1740576315124},{"file":"src/content/sponsors.json","build_time":1740576318462},{"file":"src/data/voteable-presentations.json","build_time":1740576318892}],"lastBuild":1740576318893}
1
+ {"favicon":{"asset":"icon.png"},"widgets":{"chat":{"enabled":true,"showQA":false,"showHelp":false,"defaultScope":"page"},"schedule":{"allowClick":true}},"identityProviderButtons":[{"buttonColor":"#082238","providerLabel":"Continue with FNid","providerLogo":"logo_fn.svg","providerLogoSize":27},{"buttonColor":"#0A66C2","providerLabel":"Sign in with LinkedIn","providerParam":"linkedin","providerLogo":"logo_linkedin.svg","providerLogoSize":18},{"buttonColor":"#000000","providerLabel":"Sign in with Apple","providerParam":"apple","providerLogoSize":17,"providerLogo":"logo_apple.svg"},{"buttonColor":"#1877F2","providerLabel":"Login with Facebook","providerParam":"facebook","providerLogo":"logo_facebook.svg","providerLogoSize":20}],"maintenanceMode":{"enabled":false,"title":"Site under maintenance","subtitle":"Please reload page shortly"},"staticJsonFilesBuildTime":[{"file":"src/data/summit.json","build_time":1748026605601},{"file":"src/data/events.json","build_time":1748026626928},{"file":"src/data/events.idx.json","build_time":1748026626985},{"file":"src/data/speakers.json","build_time":1748026634015},{"file":"src/data/speakers.idx.json","build_time":1748026634022},{"file":"src/content/sponsors.json","build_time":1748026637386},{"file":"src/data/voteable-presentations.json","build_time":1748026638342}],"lastBuild":1748026638342}
@@ -1 +1 @@
1
- [{"id":7,"created":1598305743,"last_edited":1598305743,"order":1,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":"https://summit-api-assets.sfo2.digitaloceanspaces.com/summits/13/sponsors/7/logo-middle-tier-fntech.png","marquee":"","intro":"","external_link":"","video_link":"","chat_link":"","featured_event_id":0,"header_image_alt_text":"","side_image_alt_text":"","header_image_mobile_alt_text":"","carousel_advertise_image_alt_text":"fntech","show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[457,459,460,462,468],"members":[26396,6,5,28171],"company":{"id":4,"created":1582745992,"last_edited":1582745992,"name":"FNTECH","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/4/logos/FNTECH-BLK-logo-rgb-1-color-white-720px2.png","big_logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/4/logos/FNTECH-BLK-logo-rgb-1-color-white-720px3.png","color":"#f0f0ee","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[749,750,745,743,744,1455,1530,1531,1532,1533,1534,1570,1571,1572,756,742,747,746,2332,623,626,633,730,625,732,616],"project_sponsorships":[]},"sponsorship":{"id":486,"widget_title":"Top-Tier Sponsors","lobby_template":"carousel","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":12,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":12,"created":1610061360,"last_edited":1610061360,"name":"Top-Tier","label":"Top-Tier","order":12,"size":"Large"}},"ads":[],"materials":[],"social_networks":[]},{"id":27,"created":1610063550,"last_edited":1610063550,"order":4,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":null,"intro":null,"external_link":null,"video_link":null,"chat_link":null,"featured_event_id":0,"header_image_alt_text":null,"side_image_alt_text":null,"header_image_mobile_alt_text":null,"carousel_advertise_image_alt_text":null,"show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[],"members":[],"company":{"id":25,"created":1610060787,"last_edited":1610060787,"name":"Wherehol","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/25/logos/Logo-Middle-Tier-Wherehol.png","big_logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/25/logos/Logo-Middle-Tier-Wherehol1.png","color":"#DADADA","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[748,749,750,745,743,744,747,746,626,633,625],"project_sponsorships":[]},"sponsorship":{"id":486,"widget_title":"Top-Tier Sponsors","lobby_template":"carousel","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":12,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":12,"created":1610061360,"last_edited":1610061360,"name":"Top-Tier","label":"Top-Tier","order":12,"size":"Large"}},"ads":[],"materials":[],"social_networks":[]},{"id":28,"created":1610063866,"last_edited":1610063866,"order":8,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":null,"intro":null,"external_link":null,"video_link":null,"chat_link":null,"featured_event_id":0,"header_image_alt_text":null,"side_image_alt_text":null,"header_image_mobile_alt_text":null,"carousel_advertise_image_alt_text":null,"show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[],"members":[],"company":{"id":26,"created":1610063779,"last_edited":1610063779,"name":"Mobility","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/26/logos/Logo-Top-Tier-Mobility.png","big_logo":null,"color":"#DADADA","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[748,749,750,745,743,744,633],"project_sponsorships":[]},"sponsorship":{"id":529,"widget_title":"Middle-Tier Sponsors","lobby_template":"small-images","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":13,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":13,"created":1610061803,"last_edited":1610061803,"name":"Middle-Tier","label":"Middle-Tier","order":13,"size":"Medium"}},"ads":[],"materials":[],"social_networks":[]},{"id":29,"created":1610063887,"last_edited":1610063887,"order":12,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":null,"intro":null,"external_link":null,"video_link":null,"chat_link":null,"featured_event_id":0,"header_image_alt_text":null,"side_image_alt_text":null,"header_image_mobile_alt_text":null,"carousel_advertise_image_alt_text":null,"show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[],"members":[],"company":{"id":27,"created":1610063790,"last_edited":1610063790,"name":"Treva","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/27/logos/logo-lower-tier-treva.png","big_logo":null,"color":"#DADADA","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[748,749,750,745,743,744,633],"project_sponsorships":[]},"sponsorship":{"id":572,"widget_title":"Lower-Tier Sponsors","lobby_template":"small-images","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":14,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":14,"created":1610061840,"last_edited":1610061840,"name":"Lower-Tier","label":"Lower-Tier","order":14,"size":"Small"}},"ads":[],"materials":[],"social_networks":[]},{"id":30,"created":1610646759,"last_edited":1610646759,"order":7,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":null,"intro":null,"external_link":null,"video_link":null,"chat_link":null,"featured_event_id":0,"header_image_alt_text":null,"side_image_alt_text":null,"header_image_mobile_alt_text":null,"carousel_advertise_image_alt_text":null,"show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[],"members":[],"company":{"id":28,"created":1610646606,"last_edited":1610646606,"name":"DVC","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/28/logos/DVC-LOGO-968X968.png","big_logo":null,"color":"#DADADA","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[749,750,745,743,744,633],"project_sponsorships":[]},"sponsorship":{"id":486,"widget_title":"Top-Tier Sponsors","lobby_template":"carousel","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":12,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":12,"created":1610061360,"last_edited":1610061360,"name":"Top-Tier","label":"Top-Tier","order":12,"size":"Large"}},"ads":[],"materials":[],"social_networks":[]},{"id":31,"created":1610649182,"last_edited":1610649182,"order":3,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":null,"intro":null,"external_link":null,"video_link":null,"chat_link":null,"featured_event_id":0,"header_image_alt_text":null,"side_image_alt_text":null,"header_image_mobile_alt_text":null,"carousel_advertise_image_alt_text":null,"show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[],"members":[],"company":{"id":29,"created":1610649003,"last_edited":1610649003,"name":"Seeing Eye Lighting Design","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/29/logos/logo-middle-tier-seeingeye.png","big_logo":null,"color":"#DADADA","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[749,750,745,743,744,633],"project_sponsorships":[]},"sponsorship":{"id":486,"widget_title":"Top-Tier Sponsors","lobby_template":"carousel","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":12,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":12,"created":1610061360,"last_edited":1610061360,"name":"Top-Tier","label":"Top-Tier","order":12,"size":"Large"}},"ads":[],"materials":[],"social_networks":[]},{"id":32,"created":1610649204,"last_edited":1610649204,"order":2,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":"","intro":"","external_link":"","video_link":"","chat_link":"","featured_event_id":0,"header_image_alt_text":"","side_image_alt_text":"","header_image_mobile_alt_text":"","carousel_advertise_image_alt_text":"","show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[463,464],"members":[],"company":{"id":30,"created":1610649028,"last_edited":1610649028,"name":"Hughston Engineering","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/30/logos/logo-middle-tier-hughston.png","big_logo":null,"color":"#DADADA","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[749,750,745,743,744,633],"project_sponsorships":[]},"sponsorship":{"id":486,"widget_title":"Top-Tier Sponsors","lobby_template":"carousel","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":12,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":12,"created":1610061360,"last_edited":1610061360,"name":"Top-Tier","label":"Top-Tier","order":12,"size":"Large"}},"ads":[],"materials":[],"social_networks":[]},{"id":33,"created":1610649224,"last_edited":1610649224,"order":6,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":null,"intro":null,"external_link":null,"video_link":null,"chat_link":null,"featured_event_id":0,"header_image_alt_text":null,"side_image_alt_text":null,"header_image_mobile_alt_text":null,"carousel_advertise_image_alt_text":null,"show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[],"members":[],"company":{"id":31,"created":1610649044,"last_edited":1610649044,"name":"Curtin Convention Services","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/31/logos/logo-middle-tier-curtin.png","big_logo":null,"color":"#DADADA","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[748,749,750,745,743,744,633],"project_sponsorships":[]},"sponsorship":{"id":486,"widget_title":"Top-Tier Sponsors","lobby_template":"carousel","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":12,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":12,"created":1610061360,"last_edited":1610061360,"name":"Top-Tier","label":"Top-Tier","order":12,"size":"Large"}},"ads":[],"materials":[],"social_networks":[]},{"id":37,"created":1617308510,"last_edited":1617308510,"order":5,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":null,"intro":null,"external_link":null,"video_link":null,"chat_link":null,"featured_event_id":0,"header_image_alt_text":null,"side_image_alt_text":null,"header_image_mobile_alt_text":null,"carousel_advertise_image_alt_text":null,"show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[],"members":[],"company":{"id":35,"created":1617308469,"last_edited":1617308469,"name":"Anthony Drake & Associates","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/35/logos/YOCO-ADA-Sponsor-Ad-Home.jpg","big_logo":null,"color":"#DADADA","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[747,734,623,617],"project_sponsorships":[]},"sponsorship":{"id":486,"widget_title":"Top-Tier Sponsors","lobby_template":"carousel","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":12,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":12,"created":1610061360,"last_edited":1610061360,"name":"Top-Tier","label":"Top-Tier","order":12,"size":"Large"}},"ads":[],"materials":[],"social_networks":[]},{"id":246,"created":1694795645,"last_edited":1694795645,"order":9,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":"","intro":"","external_link":"","video_link":"","chat_link":"","featured_event_id":0,"header_image_alt_text":"","side_image_alt_text":"","header_image_mobile_alt_text":"","carousel_advertise_image_alt_text":"","show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[],"members":[],"company":{"id":4238,"created":1694795086,"last_edited":1694795086,"name":"GameHub","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/4238/logos/logo-middle-tier-gamehub.png","big_logo":null,"color":"#DADADA","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[],"project_sponsorships":[]},"sponsorship":{"id":529,"widget_title":"Middle-Tier Sponsors","lobby_template":"small-images","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":13,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":13,"created":1610061803,"last_edited":1610061803,"name":"Middle-Tier","label":"Middle-Tier","order":13,"size":"Medium"}},"ads":[],"materials":[],"social_networks":[]},{"id":247,"created":1694795681,"last_edited":1694795681,"order":10,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":"","intro":"","external_link":"","video_link":"","chat_link":"","featured_event_id":0,"header_image_alt_text":"","side_image_alt_text":"","header_image_mobile_alt_text":"","carousel_advertise_image_alt_text":"","show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[],"members":[],"company":{"id":4239,"created":1694795131,"last_edited":1694795131,"name":"Hyved","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/4239/logos/logo-middle-tier-hyved.png","big_logo":null,"color":"#DADADA","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[],"project_sponsorships":[]},"sponsorship":{"id":529,"widget_title":"Middle-Tier Sponsors","lobby_template":"small-images","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":13,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":13,"created":1610061803,"last_edited":1610061803,"name":"Middle-Tier","label":"Middle-Tier","order":13,"size":"Medium"}},"ads":[],"materials":[],"social_networks":[]},{"id":248,"created":1694795712,"last_edited":1694795712,"order":11,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":"","intro":"","external_link":"","video_link":"","chat_link":"","featured_event_id":0,"header_image_alt_text":"","side_image_alt_text":"","header_image_mobile_alt_text":"","carousel_advertise_image_alt_text":"","show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[],"members":[],"company":{"id":4240,"created":1694795194,"last_edited":1694795194,"name":"FlightPath","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/4240/logos/Logo-Top-Tier-Flightpath.png","big_logo":null,"color":"#DADADA","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[],"project_sponsorships":[]},"sponsorship":{"id":529,"widget_title":"Middle-Tier Sponsors","lobby_template":"small-images","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":13,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":13,"created":1610061803,"last_edited":1610061803,"name":"Middle-Tier","label":"Middle-Tier","order":13,"size":"Medium"}},"ads":[],"materials":[],"social_networks":[]},{"id":249,"created":1694795831,"last_edited":1694795831,"order":13,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":"","intro":"","external_link":"","video_link":"","chat_link":"","featured_event_id":0,"header_image_alt_text":"","side_image_alt_text":"","header_image_mobile_alt_text":"","carousel_advertise_image_alt_text":"","show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[],"members":[],"company":{"id":4241,"created":1694795289,"last_edited":1694795289,"name":"Topographic Tech","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/4241/logos/logo-lower-tier-topographic.png","big_logo":null,"color":"#DADADA","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[],"project_sponsorships":[]},"sponsorship":{"id":572,"widget_title":"Lower-Tier Sponsors","lobby_template":"small-images","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":14,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":14,"created":1610061840,"last_edited":1610061840,"name":"Lower-Tier","label":"Lower-Tier","order":14,"size":"Small"}},"ads":[],"materials":[],"social_networks":[]},{"id":250,"created":1694795937,"last_edited":1694795937,"order":14,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":"","intro":"","external_link":"","video_link":"","chat_link":"","featured_event_id":0,"header_image_alt_text":"","side_image_alt_text":"","header_image_mobile_alt_text":"","carousel_advertise_image_alt_text":"","show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[],"members":[],"company":{"id":2569,"created":1654774524,"last_edited":1654774524,"name":"Open Technologies","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/2569/logos/logo-top-tier-opentech.png","big_logo":null,"color":"#f0f0ee","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[],"project_sponsorships":[]},"sponsorship":{"id":572,"widget_title":"Lower-Tier Sponsors","lobby_template":"small-images","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":14,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":14,"created":1610061840,"last_edited":1610061840,"name":"Lower-Tier","label":"Lower-Tier","order":14,"size":"Small"}},"ads":[],"materials":[],"social_networks":[]},{"id":251,"created":1694795962,"last_edited":1694795962,"order":15,"summit_id":13,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":"","intro":"","external_link":"","video_link":"","chat_link":"","featured_event_id":0,"header_image_alt_text":"","side_image_alt_text":"","header_image_mobile_alt_text":"","carousel_advertise_image_alt_text":"","show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[],"members":[],"company":{"id":4242,"created":1694795398,"last_edited":1694795398,"name":"Tilted","url":"","url_segment":null,"city":"","state":"","country":"","description":"","industry":"","contributions":"","member_level":"None","overview":"","products":"","commitment":"","commitment_author":"","logo":"https://summit-api-assets.sfo2.digitaloceanspaces.com/companies/4242/logos/logo-lower-tier-tilted.png","big_logo":null,"color":"#DADADA","display_on_site":false,"featured":false,"contact_email":"","admin_email":"","sponsorships":[],"project_sponsorships":[]},"sponsorship":{"id":572,"widget_title":"Lower-Tier Sponsors","lobby_template":"small-images","expo_hall_template":null,"sponsor_page_template":null,"event_page_template":null,"sponsor_page_use_disqus_widget":true,"sponsor_page_use_live_event_widget":true,"sponsor_page_use_schedule_widget":true,"sponsor_page_use_banner_widget":true,"badge_image":null,"badge_image_alt_text":"","summit_id":13,"order":14,"should_display_on_expo_hall_page":true,"should_display_on_lobby_page":true,"type":{"id":14,"created":1610061840,"last_edited":1610061840,"name":"Lower-Tier","label":"Lower-Tier","order":14,"size":"Small"}},"ads":[],"materials":[],"social_networks":[]}]
1
+ [{"id":360,"created":1741369599,"last_edited":1741369599,"order":2,"summit_id":63,"is_published":true,"side_image":null,"header_image":null,"header_image_mobile":null,"carousel_advertise_image":null,"marquee":"","intro":"","external_link":"","video_link":"","chat_link":"","featured_event_id":0,"header_image_alt_text":"","side_image_alt_text":"","header_image_mobile_alt_text":"","carousel_advertise_image_alt_text":"","show_logo_in_event_page":true,"lead_report_setting_id":null,"extra_questions":[541],"members":[96743,29308],"company":{"id":3496,"created":1654774567,"last_edited":1654774567,"name":"Tipit","url":null,"url_segment":null,"city":null,"state":null,"country":null,"description":null,"industry":null,"contributions":null,"member_level":null,"overview":null,"products":null,"commitment":null,"commitment_author":null,"logo":null,"big_logo":null,"color":"#f0f0ee","display_on_site":false,"featured":false,"contact_email":null,"admin_email":null,"sponsorships":[],"project_sponsorships":[]},"sponsorship":{"id":2065,"widget_title":"Test Widget Title","lobby_template":"big-images","expo_hall_template":"big-images","sponsor_page_template":"small-header","event_page_template":"small-images","sponsor_page_use_disqus_widget":false,"sponsor_page_use_live_event_widget":false,"sponsor_page_use_schedule_widget":false,"sponsor_page_use_banner_widget":false,"badge_image":"https://summit-api-dev-assets.nyc3.digitaloceanspaces.com/summits/63/summit_sponsorship_types/2065/shopping.png","badge_image_alt_text":"","summit_id":63,"order":2,"should_display_on_expo_hall_page":false,"should_display_on_lobby_page":false,"type":{"id":8,"created":1603223268,"last_edited":1603223268,"name":"Featured","label":"Featured","order":8,"size":"Large"}},"ads":[],"materials":[],"social_networks":[]}]
@@ -82,12 +82,12 @@ const App = ({ isLoggedUser, user, summitPhase, allowClick = true, data }) => {
82
82
  <MyTicketsPage path="/my-tickets" isLoggedIn={isLoggedUser} user={user} location={location} />
83
83
  <FullProfilePage path="/profile" summitPhase={summitPhase} isLoggedIn={isLoggedUser} user={user} location={location} />
84
84
  <ExtraQuestionsPage path="/extra-questions" isLoggedIn={isLoggedUser} user={user} location={location} />
85
- { !mySchedulePageJson.needsTicketAuthz && mySchedulePage({location, summitPhase,isLoggedUser, user, allowClick, title:mySchedulePageJson.title, key: mySchedulePageJson.key }) }
85
+ { mySchedulePageJson && !mySchedulePageJson.needsTicketAuthz && mySchedulePage({location, summitPhase,isLoggedUser, user, allowClick, title:mySchedulePageJson.title, key: mySchedulePageJson.key }) }
86
86
  <WithAuthzRoute path="/" summitPhase={summitPhase} isLoggedIn={isLoggedUser} user={user} location={location}>
87
87
  <PostersPage path="/posters" trackGroupId={0} location={location} />
88
88
  <PostersPage path="/posters/:trackGroupId" location={location} />
89
89
  <PosterDetailPage path="/poster/:presentationId/" isLoggedIn={isLoggedUser} user={user} location={location} />
90
- { mySchedulePageJson.needsTicketAuthz && mySchedulePage({location, summitPhase,isLoggedUser, user, allowClick, title: mySchedulePageJson.title, key: mySchedulePageJson.key }) }
90
+ { mySchedulePageJson && mySchedulePageJson.needsTicketAuthz && mySchedulePage({location, summitPhase,isLoggedUser, user, allowClick, title: mySchedulePageJson.title, key: mySchedulePageJson.key }) }
91
91
  <ShowOpenRoute path="/" summitPhase={summitPhase} isLoggedIn={isLoggedUser} user={user} location={location}>
92
92
  <WithBadgeRoute path="/event/:eventId" summitPhase={summitPhase} isLoggedIn={isLoggedUser} user={user} location={location}>
93
93
  <EventPage path="/" summitPhase={summitPhase} isLoggedIn={isLoggedUser} user={user} location={location} />
@@ -42,6 +42,7 @@ export const marketingPageQuery = graphql`
42
42
  registerButton {
43
43
  text
44
44
  display
45
+ externalRegistrationLink
45
46
  }
46
47
  loginButton {
47
48
  text
@@ -40,8 +40,12 @@ export class LogOutCallbackRoute extends React.Component {
40
40
  let query = URI.parseQuery(location.search);
41
41
  // compare the state and perform the final logout
42
42
  if (query.hasOwnProperty("state") && query["state"] === postLogoutState) {
43
- this.props.doLogout();
44
43
  let backUrl = getFromLocalStorage('post_logout_redirect_path', true);
44
+ this.props.doLogout();
45
+ // clear current state , bc unmounted widgets will not receive the LOG_OUT event
46
+ if(typeof window !== 'undefined') {
47
+ window.localStorage.clear();
48
+ }
45
49
  navigate(backUrl ? backUrl : '/');
46
50
  return;
47
51
  }
@@ -69,4 +73,4 @@ export default connect(
69
73
  {
70
74
  doLogout
71
75
  }
72
- )(LogOutCallbackRoute)
76
+ )(LogOutCallbackRoute)
@@ -30,7 +30,12 @@
30
30
  margin-bottom: 5px;
31
31
  }
32
32
 
33
- i {
33
+ .subLabel {
34
+ margin-top: -6px;
35
+ margin-bottom: 10px;
36
+ }
37
+
38
+ :global(.fa) {
34
39
  margin-left: 10px;
35
40
  color: #d3d3d3;
36
41
  cursor: pointer;
@@ -1,13 +1,13 @@
1
- $color_accent: #ff5e32;
1
+ $color_accent: #00B189;
2
2
  $color_alerts: #ff0000;
3
3
  $color_background_light: #ffffff;
4
4
  $color_background_dark: #000000;
5
5
  $color_button_background_color: #ffffff;
6
6
  $color_button_color: #000000;
7
- $color_gray_lighter: #F2F2F2;
8
- $color_gray_light: #DFDFDF;
7
+ $color_gray_lighter: #f2f2f2;
8
+ $color_gray_light: #dfdfdf;
9
9
  $color_gray_dark: #999999;
10
- $color_gray_darker: #4A4A4A;
10
+ $color_gray_darker: #4a4a4a;
11
11
  $color_horizontal_rule_light: #e5e5e5;
12
12
  $color_horizontal_rule_dark: #7b7b7b;
13
13
  $color_icon_light: #ffffff;
@@ -19,13 +19,13 @@ $color_input_text_color_light: #363636;
19
19
  $color_input_text_color_dark: #ffffff;
20
20
  $color_input_text_color_disabled_light: #ffffff;
21
21
  $color_input_text_color_disabled_dark: #ffffff;
22
- $color_primary: #6d6e71;
23
- $color_primary_contrast: #f1f2f2;
24
- $color_secondary: #00CEC4;
25
- $color_secondary_contrast: #ff5e32;
22
+ $color_primary: #8DC63F;
23
+ $color_primary_contrast: #FFFFFF;
24
+ $color_secondary: #5e5f62;
25
+ $color_secondary_contrast: #005870;
26
26
  $color_text_light: #ffffff;
27
27
  $color_text_med: #828282;
28
- $color_text_dark: #333333;
28
+ $color_text_dark: #5e5f62;
29
29
  $color_text_input_hints_light: #7b7b7b;
30
30
  $color_text_input_hints_dark: #7b7b7b;
31
31
  $color_text_input_hints: #c4c4c4;
@@ -10,7 +10,9 @@ import { isEmpty } from "lodash";
10
10
  import { getExtraQuestions } from '../actions/summit-actions';
11
11
  import { saveAttendeeQuestions } from '../actions/user-actions';
12
12
  import { TICKET_ATTENDEE_KEYS as TicketKeys } from '../components/summit-my-orders-tickets/store/actions/ticket-actions';
13
- import { Input, RegistrationCompanyInput, RawHTML } from 'openstack-uicore-foundation/lib/components';
13
+ import Input from 'openstack-uicore-foundation/lib/components/inputs/text-input'
14
+ import RegistrationCompanyInput from 'openstack-uicore-foundation/lib/components/inputs/registration-company-input';
15
+ import RawHTML from 'openstack-uicore-foundation/lib/components/raw-html';
14
16
  import FragmentParser from "openstack-uicore-foundation/lib/utils/fragment-parser";
15
17
  import QuestionsSet from 'openstack-uicore-foundation/lib/utils/questions-set';
16
18
  import ExtraQuestionsForm from 'openstack-uicore-foundation/lib/components/extra-questions';
@@ -259,12 +261,12 @@ export const ExtraQuestionsPageTemplate = ({ user, summit, extraQuestions, atten
259
261
  onChange={(e) =>
260
262
  formik.setFieldTouched(TicketKeys.disclaimerAccepted, true) && formik.handleChange(e)
261
263
  }
262
- checked={formik.values[TicketKeys.disclaimerAccepted]}
264
+ checked={formik.values[TicketKeys.disclaimerAccepted]}
263
265
  />
264
266
  <label htmlFor={TicketKeys.disclaimerAccepted}>
265
267
  {summit.registration_disclaimer_mandatory && <b> *</b>}
266
- </label>
267
- </div>
268
+ </label>
269
+ </div>
268
270
  <div className="mt-3">
269
271
  <RawHTML>
270
272
  {summit.registration_disclaimer_content}
@@ -41,7 +41,8 @@ const INVITATIONS_REJECT_PAGE_FILE_PATH = `${STATIC_CONTENT_DIR_PATH}/invitation
41
41
  const SPONSORS_FILE_NAME = "sponsors.json";
42
42
  const SPONSORS_FILE_PATH = `${STATIC_CONTENT_DIR_PATH}/${SPONSORS_FILE_NAME}`;
43
43
  const CMS_FONT_FILE_PATH = "/static/fonts/"
44
- const PAYMENTS_FILE_PATH = `${STATIC_CONTENT_DIR_PATH}/payments.json`;
44
+ const PAYMENTS_DIR_PATH = `${STATIC_CONTENT_DIR_PATH}/payments`;
45
+ const PAYMENTS_FILE_PATH = `${PAYMENTS_DIR_PATH}/index.json`;
45
46
  const APPLE_PAY_DOMAIN_FILE_PATH = `/static/.well-known/`
46
47
  const APPLE_PAY_DOMAIN_FILE_NAME = `apple-developer-merchantid-domain-association`;
47
48
  const MY_SCHEDULE_PAGE_DIR_PATH = `${STATIC_CONTENT_DIR_PATH}/my-schedule-page`;
@@ -58,7 +59,8 @@ exports.REQUIRED_DIR_PATHS = [
58
59
  INVITATIONS_REJECT_PAGE_FILE_PATH,
59
60
  NAVBAR_DIR_PATH,
60
61
  FOOTER_DIR_PATH,
61
- MY_SCHEDULE_PAGE_FILE_PATH
62
+ MY_SCHEDULE_PAGE_FILE_PATH,
63
+ PAYMENTS_DIR_PATH
62
64
  ];
63
65
 
64
66
  exports.STATIC_CONTENT_DIR_PATH = STATIC_CONTENT_DIR_PATH;
@@ -0,0 +1,20 @@
1
+ import {
2
+ graphql,
3
+ useStaticQuery
4
+ } from "gatsby";
5
+
6
+ const paymentSettingsQuery = graphql`
7
+ query {
8
+ paymentsJson {
9
+ hidePostalCode
10
+ }
11
+ }
12
+ `;
13
+
14
+ const usePaymentSettings = () => {
15
+ const { paymentsJson } = useStaticQuery(paymentSettingsQuery);
16
+ return paymentsJson;
17
+ };
18
+
19
+ export default usePaymentSettings;
20
+
@@ -5,7 +5,7 @@ import {
5
5
  BUCKET_SUMMIT_DATA_KEY,
6
6
  saveFile
7
7
  } from "../../utils/dataUpdatesUtils";
8
-
8
+ import moment from "moment-timezone";
9
9
  /**
10
10
  * ActivityTypeSynchStrategy
11
11
  */
@@ -23,15 +23,14 @@ class ActivityTypeSynchStrategy extends AbstractSynchStrategy{
23
23
  if (!entity) return Promise.reject('ActivityTypeSynchStrategy::process entity not found.');
24
24
 
25
25
  // update summit
26
- this.summit.event_types = [...this.summit.event_types.filter(et => et.id !== entity_id), entity]
27
-
26
+ this.summit.event_types = [...this.summit.event_types.filter(et => et.id !== entity_id), entity];
27
+ this.summit.timestamp = moment().unix();
28
28
  // update events
29
29
  this.allEvents = this.allEvents.map(ev => {
30
30
  if (ev.type.id === entity_id) return ({...ev, type: entity});
31
31
  return ev;
32
32
  })
33
33
 
34
-
35
34
  // update files on cache
36
35
  console.log(`ActivityTypeSynchStrategy::process updating cache files`);
37
36
 
@@ -63,4 +62,4 @@ class ActivityTypeSynchStrategy extends AbstractSynchStrategy{
63
62
  }
64
63
  }
65
64
 
66
- export default ActivityTypeSynchStrategy;
65
+ export default ActivityTypeSynchStrategy;
@@ -4,7 +4,7 @@ import VenueRoomSynchStrategy from "./venue_room_synch_strategy";
4
4
  import SpeakerSynchStrategy from "./speaker_synch_strategy";
5
5
  import SummitSynchStrategy from "./summit_synch_strategy";
6
6
  import ActivityTypeSynchStrategy from "./activity_type_synch_strategy";
7
-
7
+ import TrackSynchStrategy from "./track_synch_strategy";
8
8
  /**
9
9
  * SynchStrategyFactory
10
10
  */
@@ -37,8 +37,11 @@ class SynchStrategyFactory {
37
37
  if (entity_type === 'Summit') {
38
38
  return new SummitSynchStrategy(summit, allEvents, allIDXEvents, allSpeakers, allIDXSpeakers, accessToken);
39
39
  }
40
+ if(entity_type === 'PresentationCategory'){
41
+ return new TrackSynchStrategy(summit, allEvents, allIDXEvents, allSpeakers, allIDXSpeakers, accessToken);
42
+ }
40
43
  return null;
41
44
  }
42
45
  }
43
46
 
44
- export default SynchStrategyFactory;
47
+ export default SynchStrategyFactory;
@@ -0,0 +1,76 @@
1
+ import AbstractSynchStrategy from "./abstract_synch_strategy";
2
+ import {fetchTrackById} from "../../actions/fetch-entities-actions";
3
+ import {
4
+ BUCKET_EVENTS_DATA_KEY,
5
+ BUCKET_SUMMIT_DATA_KEY,
6
+ saveFile
7
+ } from "../../utils/dataUpdatesUtils";
8
+ import moment from "moment-timezone";
9
+ /**
10
+ * TrackSynchStrategy
11
+ */
12
+ class TrackSynchStrategy extends AbstractSynchStrategy{
13
+
14
+ async process(payload){
15
+
16
+ console.log(`TrackSynchStrategy::process`, payload);
17
+
18
+ const {entity_operator, entity_id} = payload;
19
+
20
+ const entity = await fetchTrackById(this.summit.id, entity_id, this.accessToken);
21
+
22
+ if (entity_operator === 'UPDATE') {
23
+ if (!entity) return Promise.reject('TrackSynchStrategy::process entity not found.');
24
+
25
+ // update summit
26
+
27
+ this.summit = {
28
+ ...this.summit,
29
+ timestamp : moment().unix(),
30
+ tracks : this.summit.tracks.map(t => {
31
+ if(t?.id === entity_id) return {...t, ...entity};
32
+
33
+ return {...t, subtracks: t.subtracks.map(st => {
34
+ if(st?.id === entity_id) return {...st, ...entity};
35
+ return st;
36
+ })};
37
+ })
38
+ };
39
+ // update events
40
+ this.allEvents = this.allEvents.map(ev => {
41
+ if (ev?.track?.id === entity_id) return ({...ev, track: entity});
42
+ return ev;
43
+ })
44
+
45
+ // update files on cache
46
+ console.log(`TrackSynchStrategy::process updating cache files`);
47
+
48
+ try {
49
+ const localNowUtc = Date.now();
50
+
51
+ await saveFile(this.summit.id, BUCKET_EVENTS_DATA_KEY, this.allEvents, localNowUtc);
52
+ await saveFile(this.summit.id, BUCKET_SUMMIT_DATA_KEY, this.summit, localNowUtc);
53
+
54
+ }
55
+ catch (e){
56
+ console.log(e);
57
+ }
58
+
59
+ let res = {
60
+ payload,
61
+ entity,
62
+ summit : this.summit,
63
+ eventsData: this.allEvents,
64
+ allIDXEvents : this.allIDXEvents,
65
+ allSpeakers : this.allSpeakers,
66
+ allIDXSpeakers : this.allIDXSpeakers
67
+ };
68
+
69
+ console.log(`TrackSynchStrategy::process done`, res);
70
+
71
+ return Promise.resolve(res);
72
+ }
73
+ }
74
+ }
75
+
76
+ export default TrackSynchStrategy;