@openeventkit/event-site 2.1.25 → 2.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/actions/user-actions.js +3 -2
- package/src/components/{CertificateSection.js → Certificates/DownloadButton.js} +18 -21
- package/src/components/Certificates/constants.js +4 -0
- package/src/components/{CertificatePDF.js → Certificates/generatePDF.js} +27 -5
- package/src/components/Certificates/index.js +4 -0
- package/src/{utils/certificateSettings.js → components/Certificates/settings.js} +3 -1
- package/src/components/Seo.js +1 -1
- package/src/i18n/locales/en.json +2 -0
- package/src/pages/a/overflow-player.js +3 -3
- package/src/reducers/user-reducer.js +41 -35
- package/src/templates/full-profile-page.js +6 -7
- package/src/templates/rsvp-page.js +14 -6
- package/src/utils/build-json/EventsAPIRequest.js +5 -2
- package/src/utils/build-json/SpeakersAPIRequest.js +5 -1
- package/src/utils/build-json/SummitAPIRequest.js +8 -3
- package/src/utils/rsvpConstants.js +7 -1
- package/src/utils/useMarketingSettings.js +2 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openeventkit/event-site",
|
|
3
3
|
"description": "Event Site",
|
|
4
|
-
"version": "2.1.
|
|
4
|
+
"version": "2.1.27",
|
|
5
5
|
"author": "Tipit LLC",
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"@emotion/server": "^11.11.0",
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
"rehype-mdx-import-media": "^1.2.0",
|
|
126
126
|
"remark-gfm": "^4.0.1",
|
|
127
127
|
"sass": "^1.49.9",
|
|
128
|
-
"schedule-filter-widget": "3.0.
|
|
128
|
+
"schedule-filter-widget": "3.0.7",
|
|
129
129
|
"simple-chat-widget": "^1.0.31",
|
|
130
130
|
"simple-oauth2": "^4.1.0",
|
|
131
131
|
"slick-carousel": "^1.8.1",
|
|
@@ -678,8 +678,9 @@ export const rejectInvitation = (token) => async (dispatch) => {
|
|
|
678
678
|
|
|
679
679
|
export const getRSVPInvitation = (token, eventId) => async (dispatch) => {
|
|
680
680
|
let params = {
|
|
681
|
-
fields: "status,
|
|
682
|
-
|
|
681
|
+
fields: "status,event.id,event.rsvp_capacity",
|
|
682
|
+
expand: "event",
|
|
683
|
+
relations: "none,event.none"
|
|
683
684
|
};
|
|
684
685
|
|
|
685
686
|
return getRequest(
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
import React, { useState, useEffect } from 'react';
|
|
2
2
|
import { connect } from 'react-redux';
|
|
3
|
-
import {
|
|
4
|
-
import { useCertificateSettings } from '
|
|
5
|
-
import useMarketingSettings from '
|
|
6
|
-
import { MARKETING_SETTINGS_KEYS, DISPLAY_OPTIONS } from '
|
|
7
|
-
import useSiteSettings from '
|
|
8
|
-
import styles from '
|
|
9
|
-
|
|
10
|
-
const USER_ROLES = {
|
|
11
|
-
SPEAKER: 'Speaker',
|
|
12
|
-
ATTENDEE: 'Attendee'
|
|
13
|
-
};
|
|
3
|
+
import { generatePDF } from './generatePDF';
|
|
4
|
+
import { useCertificateSettings } from './settings';
|
|
5
|
+
import useMarketingSettings from '../../utils/useMarketingSettings';
|
|
6
|
+
import { MARKETING_SETTINGS_KEYS, DISPLAY_OPTIONS } from '../../utils/useMarketingSettings';
|
|
7
|
+
import useSiteSettings from '../../utils/useSiteSettings';
|
|
8
|
+
import styles from '../../styles/full-profile.module.scss';
|
|
9
|
+
import { USER_ROLES } from './constants';
|
|
14
10
|
|
|
15
11
|
const CertificateSection = ({
|
|
16
12
|
user,
|
|
@@ -58,17 +54,15 @@ const CertificateSection = ({
|
|
|
58
54
|
// Check if any ticket has speaker role
|
|
59
55
|
const hasSpeakerTicket = allTickets.some(ticket => {
|
|
60
56
|
// Check badge type name for speaker
|
|
61
|
-
const badgeType =
|
|
57
|
+
const badgeType = ticket.badge?.type;
|
|
58
|
+
|
|
62
59
|
if (badgeType?.name?.toLowerCase().includes('speaker')) {
|
|
63
60
|
return true;
|
|
64
61
|
}
|
|
65
62
|
|
|
66
|
-
|
|
67
|
-
const featureIds = ticket.badge?.features || [];
|
|
68
|
-
const badgeFeaturesTypes = summit?.badge_features_types || [];
|
|
63
|
+
const features = ticket.badge?.features || [];
|
|
69
64
|
|
|
70
|
-
return
|
|
71
|
-
const feature = badgeFeaturesTypes.find(f => f.id === featureId);
|
|
65
|
+
return features.some(feature => {
|
|
72
66
|
return feature?.name?.toLowerCase().includes('speaker');
|
|
73
67
|
});
|
|
74
68
|
});
|
|
@@ -95,11 +89,10 @@ const CertificateSection = ({
|
|
|
95
89
|
const summitData = {
|
|
96
90
|
name: summit.name,
|
|
97
91
|
logo: summit.logo,
|
|
98
|
-
|
|
99
|
-
end_date: summit.end_date
|
|
92
|
+
dates_label: summit.dates_label
|
|
100
93
|
};
|
|
101
94
|
|
|
102
|
-
await
|
|
95
|
+
await generatePDF(attendeeData, summitData, certificateSettings);
|
|
103
96
|
} catch (err) {
|
|
104
97
|
console.error('Error downloading certificate:', err);
|
|
105
98
|
setError('Failed to download certificate. Please try again.');
|
|
@@ -117,7 +110,11 @@ const CertificateSection = ({
|
|
|
117
110
|
height: '5.5rem',
|
|
118
111
|
color: 'var(--color_input_text_color)',
|
|
119
112
|
backgroundColor: 'var(--color_input_background_color)',
|
|
120
|
-
borderColor: 'var(--color_input_border_color)'
|
|
113
|
+
borderColor: 'var(--color_input_border_color)',
|
|
114
|
+
whiteSpace: 'normal',
|
|
115
|
+
wordBreak: 'break-word',
|
|
116
|
+
lineHeight: '1.2',
|
|
117
|
+
padding: '1rem'
|
|
121
118
|
}}
|
|
122
119
|
>
|
|
123
120
|
Download Certificate of Attendance
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Document, Page, Text, View, Image, StyleSheet, Font, pdf } from "@react-pdf/renderer";
|
|
3
3
|
|
|
4
|
-
import fontRegular from "
|
|
5
|
-
import fontBold from "
|
|
4
|
+
import fontRegular from "../../../static/fonts/nunito-sans/nunito-sans-v18-latin-400.ttf";
|
|
5
|
+
import fontBold from "../../../static/fonts/nunito-sans/nunito-sans-v18-latin-700.ttf";
|
|
6
|
+
import { USER_ROLES } from './constants';
|
|
6
7
|
|
|
7
8
|
const registerDefaultFont = () => {
|
|
8
9
|
try {
|
|
@@ -147,6 +148,7 @@ const CertificatePDF = ({
|
|
|
147
148
|
logoUrl = null
|
|
148
149
|
}) => {
|
|
149
150
|
const role = attendee.role || "Attendee";
|
|
151
|
+
const isSpeaker = role === USER_ROLES.SPEAKER;
|
|
150
152
|
const position = attendee.jobTitle || "";
|
|
151
153
|
const company = attendee.company || "";
|
|
152
154
|
|
|
@@ -213,6 +215,7 @@ const CertificatePDF = ({
|
|
|
213
215
|
textAlign: "center",
|
|
214
216
|
letterSpacing: 0.15,
|
|
215
217
|
lineHeight: "160%",
|
|
218
|
+
marginBottom: 5,
|
|
216
219
|
},
|
|
217
220
|
summitName: {
|
|
218
221
|
fontSize: 24,
|
|
@@ -223,6 +226,15 @@ const CertificatePDF = ({
|
|
|
223
226
|
letterSpacing: 0,
|
|
224
227
|
lineHeight: "133%",
|
|
225
228
|
},
|
|
229
|
+
summitDate: {
|
|
230
|
+
fontSize: 16,
|
|
231
|
+
fontWeight: "normal",
|
|
232
|
+
color: "#000000",
|
|
233
|
+
textAlign: "center",
|
|
234
|
+
letterSpacing: 0.15,
|
|
235
|
+
lineHeight: "150%",
|
|
236
|
+
marginTop: 8,
|
|
237
|
+
},
|
|
226
238
|
name: {
|
|
227
239
|
fontSize: nameFontSize,
|
|
228
240
|
fontWeight: "normal",
|
|
@@ -275,7 +287,11 @@ const CertificatePDF = ({
|
|
|
275
287
|
|
|
276
288
|
{/* Title */}
|
|
277
289
|
<Text style={styles.title}>
|
|
278
|
-
{settings.
|
|
290
|
+
{isSpeaker && settings.speakerTitleText ?
|
|
291
|
+
settings.speakerTitleText :
|
|
292
|
+
!isSpeaker && settings.attendeeTitleText ?
|
|
293
|
+
settings.attendeeTitleText :
|
|
294
|
+
settings.titleText || (isSpeaker ? "CERTIFICATE OF APPRECIATION" : "CERTIFICATE OF ATTENDANCE")}
|
|
279
295
|
</Text>
|
|
280
296
|
|
|
281
297
|
{/* Event Name */}
|
|
@@ -283,6 +299,13 @@ const CertificatePDF = ({
|
|
|
283
299
|
{settings.summitName || summit.name || "EVENT NAME"}
|
|
284
300
|
</Text>
|
|
285
301
|
|
|
302
|
+
{/* Summit Date */}
|
|
303
|
+
{summit.dates_label && (
|
|
304
|
+
<Text style={styles.summitDate}>
|
|
305
|
+
{summit.dates_label}
|
|
306
|
+
</Text>
|
|
307
|
+
)}
|
|
308
|
+
|
|
286
309
|
{/* Attendee Name */}
|
|
287
310
|
<Text style={styles.name}>
|
|
288
311
|
{fullName}
|
|
@@ -312,7 +335,7 @@ const CertificatePDF = ({
|
|
|
312
335
|
};
|
|
313
336
|
|
|
314
337
|
// helper function to generate and download the certificate
|
|
315
|
-
export const
|
|
338
|
+
export const generatePDF = async (attendee, summit, settings) => {
|
|
316
339
|
try {
|
|
317
340
|
// Validate logo URL before generating PDF
|
|
318
341
|
const logoUrlToValidate = settings.logo || summit.logo;
|
|
@@ -341,4 +364,3 @@ export const generateCertificatePDF = async (attendee, summit, settings) => {
|
|
|
341
364
|
}
|
|
342
365
|
};
|
|
343
366
|
|
|
344
|
-
export default CertificatePDF;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import useMarketingSettings, { MARKETING_SETTINGS_KEYS, DISPLAY_OPTIONS } from '
|
|
1
|
+
import useMarketingSettings, { MARKETING_SETTINGS_KEYS, DISPLAY_OPTIONS } from '../../utils/useMarketingSettings';
|
|
2
2
|
|
|
3
3
|
export const useCertificateSettings = (siteFont = null) => {
|
|
4
4
|
const { getSettingByKey } = useMarketingSettings();
|
|
@@ -20,6 +20,8 @@ export const useCertificateSettings = (siteFont = null) => {
|
|
|
20
20
|
logoWidth: MARKETING_SETTINGS_KEYS.certificateLogoWidth,
|
|
21
21
|
logoHeight: MARKETING_SETTINGS_KEYS.certificateLogoHeight,
|
|
22
22
|
titleText: MARKETING_SETTINGS_KEYS.certificateTitleText,
|
|
23
|
+
attendeeTitleText: MARKETING_SETTINGS_KEYS.certificateAttendeeTitleText,
|
|
24
|
+
speakerTitleText: MARKETING_SETTINGS_KEYS.certificateSpeakerTitleText,
|
|
23
25
|
summitName: MARKETING_SETTINGS_KEYS.certificateSummitName,
|
|
24
26
|
showRole: MARKETING_SETTINGS_KEYS.certificateShowRole,
|
|
25
27
|
};
|
package/src/components/Seo.js
CHANGED
|
@@ -21,7 +21,7 @@ const Seo = ({ title, description, location, children }) => {
|
|
|
21
21
|
const { pathname } = location;
|
|
22
22
|
|
|
23
23
|
const seo = {
|
|
24
|
-
title: title ? `${siteTitle} - ${title}` : siteTitle,
|
|
24
|
+
title: title && siteTitle ? `${siteTitle} - ${title}` : (title || siteTitle || ''),
|
|
25
25
|
description: description || defaultDescription,
|
|
26
26
|
url: buildUrl(scheme, host, pathname),
|
|
27
27
|
image: host && image ? buildUrl(scheme, host, image.publicURL) : null,
|
package/src/i18n/locales/en.json
CHANGED
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
"invite_message": "You have been invited to RSVP {{event}}",
|
|
15
15
|
"decline_message": "You have declined your invitation.",
|
|
16
16
|
"confirm_message": "Your attendance to this event is confirmed.",
|
|
17
|
+
"waitlist_message": "This activity is currently full, but you have been added to the wait list and will be automatically confirmed should space become available.",
|
|
18
|
+
"full_message": "This activity is full.",
|
|
17
19
|
"speakers": "Speakers",
|
|
18
20
|
"accept_button": "YES, I will attend.",
|
|
19
21
|
"decline_button": "NO, I will not attend."
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import React, { useEffect, useState } from "react";
|
|
2
|
-
import { useParams } from "react-router-dom";
|
|
3
2
|
import { connect } from "react-redux";
|
|
4
3
|
import { useTranslation } from "react-i18next";
|
|
5
4
|
import { getOverflowEventByKey } from "../../actions/event-actions";
|
|
6
5
|
import { Container, Box, CircularProgress, Typography, Fade } from "@mui/material";
|
|
7
6
|
import VideoComponent from "../../components/VideoComponent";
|
|
8
7
|
import ErrorMessage from "../../components/ErrorMessage";
|
|
8
|
+
import withRealTimeUpdates from "../../utils/real_time_updates/withRealTimeUpdates";
|
|
9
9
|
import "../../i18n";
|
|
10
10
|
|
|
11
11
|
const OverflowPlayerPage = ({
|
|
@@ -25,7 +25,7 @@ const OverflowPlayerPage = ({
|
|
|
25
25
|
if (overflowStreamKey) {
|
|
26
26
|
fetchOverflowEvent(overflowStreamKey);
|
|
27
27
|
}
|
|
28
|
-
}, [overflowStreamKey, fetchOverflowEvent]);
|
|
28
|
+
}, [overflowStreamKey, fetchOverflowEvent, event?.overflow_streaming_url]);
|
|
29
29
|
|
|
30
30
|
useEffect(() => {
|
|
31
31
|
if (event && !loading && !error) {
|
|
@@ -146,4 +146,4 @@ const mapDispatchToProps = (dispatch) => ({
|
|
|
146
146
|
fetchOverflowEvent: (streamKey) => dispatch(getOverflowEventByKey(streamKey))
|
|
147
147
|
});
|
|
148
148
|
|
|
149
|
-
export default connect(mapStateToProps, mapDispatchToProps)(OverflowPlayerPage);
|
|
149
|
+
export default connect(mapStateToProps, mapDispatchToProps)(withRealTimeUpdates(OverflowPlayerPage));
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { reduceReducers } from '../utils/reducer-utils';
|
|
2
2
|
import { LOGOUT_USER } from 'openstack-uicore-foundation/lib/security/actions';
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
4
|
GET_DISQUS_SSO,
|
|
6
5
|
GET_USER_PROFILE,
|
|
7
6
|
START_LOADING_PROFILE,
|
|
@@ -65,7 +64,7 @@ const userReducer = (state = DEFAULT_STATE, action) => {
|
|
|
65
64
|
const { response: userProfile } = payload;
|
|
66
65
|
return {
|
|
67
66
|
...state,
|
|
68
|
-
userProfile: userProfile,
|
|
67
|
+
userProfile: { ...userProfile, rsvp_invitations: [] },
|
|
69
68
|
isAuthorized: isAuthorizedUser(userProfile.groups),
|
|
70
69
|
hasTicket: userProfile.summit_tickets?.length > 0
|
|
71
70
|
}
|
|
@@ -92,16 +91,18 @@ const userReducer = (state = DEFAULT_STATE, action) => {
|
|
|
92
91
|
case REMOVE_FROM_SCHEDULE: {
|
|
93
92
|
return { ...state, userProfile: { ...state.userProfile, schedule_summit_events: [...state.userProfile.schedule_summit_events.filter(ev => ev.id !== payload.id)] } }
|
|
94
93
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
94
|
+
case RSVP_CONFIRMED: {
|
|
95
|
+
return { ...state, userProfile: { ...state.userProfile, rsvp: [...state.userProfile.rsvp, { ...payload }] } }
|
|
96
|
+
}
|
|
97
|
+
case RSVP_CANCELLED: {
|
|
98
|
+
return {
|
|
99
|
+
...state, userProfile: {
|
|
100
|
+
...state.userProfile,
|
|
101
|
+
rsvp: [...state?.userProfile?.rsvp?.filter(r => r.event_id !== payload.id)],
|
|
102
|
+
rsvp_invitations: state?.userProfile?.rsvp_invitations?.filter(i => i.event_id !== payload.id),
|
|
103
|
+
}
|
|
104
104
|
}
|
|
105
|
+
}
|
|
105
106
|
case GET_DISQUS_SSO:
|
|
106
107
|
const disqus = payload.response;
|
|
107
108
|
return { ...state, loading: false, disqusSSO: disqus };
|
|
@@ -144,7 +145,9 @@ const userReducer = (state = DEFAULT_STATE, action) => {
|
|
|
144
145
|
return { ...state, rsvpInvitation: null }
|
|
145
146
|
}
|
|
146
147
|
case RECEIVE_RSVP_INVITATION: {
|
|
147
|
-
|
|
148
|
+
let invitation = payload.response;
|
|
149
|
+
invitation.event_id = invitation.event.id;
|
|
150
|
+
return { ...state, rsvpInvitation: invitation }
|
|
148
151
|
}
|
|
149
152
|
case RSVP_INVITATION_ERROR: {
|
|
150
153
|
const { errorMessage } = payload;
|
|
@@ -152,34 +155,37 @@ const userReducer = (state = DEFAULT_STATE, action) => {
|
|
|
152
155
|
}
|
|
153
156
|
case RSVP_INVITATION_ACCEPTED: {
|
|
154
157
|
const invitation = payload.response;
|
|
155
|
-
const userProfile = state.userProfile? {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
158
|
+
const userProfile = state.userProfile ? {
|
|
159
|
+
...state?.userProfile,
|
|
160
|
+
rsvp_invitations: [...state?.userProfile?.rsvp_invitations, {
|
|
161
|
+
event_id: invitation.event_id,
|
|
162
|
+
status: invitation.status,
|
|
163
|
+
}],
|
|
164
|
+
rsvp: [...state?.userProfile?.rsvp, { ...invitation.rsvp }],
|
|
165
|
+
schedule_summit_events: [...state?.userProfile?.schedule_summit_events, { id: invitation.event_id }]
|
|
163
166
|
} : null;
|
|
164
167
|
|
|
165
|
-
return {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
168
|
+
return {
|
|
169
|
+
...state,
|
|
170
|
+
rsvpInvitation: invitation,
|
|
171
|
+
// update invitations and rsvps
|
|
172
|
+
userProfile: userProfile,
|
|
169
173
|
}
|
|
170
174
|
}
|
|
171
175
|
case RSVP_INVITATION_REJECTED: {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
176
|
+
// update invitations
|
|
177
|
+
const invitation = payload.response;
|
|
178
|
+
const userProfile = state.userProfile ? {
|
|
179
|
+
...state?.userProfile,
|
|
180
|
+
rsvp_invitations: [...state?.userProfile?.rsvp_invitations, {
|
|
181
|
+
event_id: invitation.event_id,
|
|
182
|
+
status: invitation.status,
|
|
183
|
+
}],
|
|
184
|
+
} : null;
|
|
185
|
+
return {
|
|
186
|
+
...state,
|
|
187
|
+
rsvpInvitation: invitation,
|
|
188
|
+
userProfile: userProfile,
|
|
183
189
|
}
|
|
184
190
|
}
|
|
185
191
|
default:
|
|
@@ -17,7 +17,7 @@ import LiteScheduleComponent from '../components/LiteScheduleComponent'
|
|
|
17
17
|
import AvatarEditorModal from '../components/AvatarEditorModal'
|
|
18
18
|
import ChangePasswordComponent from '../components/ChangePasswordComponent';
|
|
19
19
|
import AccessTracker from "../components/AttendeeToAttendeeWidgetComponent";
|
|
20
|
-
import
|
|
20
|
+
import { DownloadButton as CertificateDownloadButton } from '../components/Certificates';
|
|
21
21
|
import useMarketingSettings from '../utils/useMarketingSettings';
|
|
22
22
|
import { MARKETING_SETTINGS_KEYS, DISPLAY_OPTIONS } from '../utils/useMarketingSettings';
|
|
23
23
|
import { getAccessTokenSafely } from '../utils/loginUtils';
|
|
@@ -209,8 +209,8 @@ export const FullProfilePageTemplate = ({ user, getIDPProfile, updateProfile, up
|
|
|
209
209
|
|
|
210
210
|
const params = new URLSearchParams({
|
|
211
211
|
access_token: accessToken,
|
|
212
|
-
fields: 'id,status',
|
|
213
|
-
expand: 'owner'
|
|
212
|
+
fields: 'id,status,owner.summit_hall_checked_in,owner.first_name,owner.last_name,owner.company,owner.email,badge.type.name,badge.features.name',
|
|
213
|
+
expand: 'owner,badge,badge.type,badge.features'
|
|
214
214
|
});
|
|
215
215
|
|
|
216
216
|
const apiBaseUrl = getEnvVariable(SUMMIT_API_BASE_URL);
|
|
@@ -239,12 +239,11 @@ export const FullProfilePageTemplate = ({ user, getIDPProfile, updateProfile, up
|
|
|
239
239
|
const certificatesEnabled = getSettingByKey(MARKETING_SETTINGS_KEYS.certificateEnabled) !== DISPLAY_OPTIONS.hide;
|
|
240
240
|
const checkedInTickets = freshTickets.filter(ticket => {
|
|
241
241
|
const isCheckedIn = ticket.owner?.summit_hall_checked_in === true;
|
|
242
|
-
console.log(ticket)
|
|
243
242
|
const isValidTicket = ticket.status === 'Paid';
|
|
244
243
|
return isCheckedIn && isValidTicket;
|
|
245
244
|
});
|
|
246
245
|
|
|
247
|
-
const
|
|
246
|
+
const showCertificateDownload = certificatesEnabled && checkedInTickets.length > 0;
|
|
248
247
|
|
|
249
248
|
const discardChanges = (state) => {
|
|
250
249
|
switch (state) {
|
|
@@ -317,8 +316,8 @@ export const FullProfilePageTemplate = ({ user, getIDPProfile, updateProfile, up
|
|
|
317
316
|
<h4>
|
|
318
317
|
@{user.idpProfile?.nickname}
|
|
319
318
|
</h4>
|
|
320
|
-
{
|
|
321
|
-
<
|
|
319
|
+
{showCertificateDownload && (
|
|
320
|
+
<CertificateDownloadButton freshTickets={freshTickets} />
|
|
322
321
|
)}
|
|
323
322
|
<ChangePasswordComponent updatePassword={handlePasswordUpdate} />
|
|
324
323
|
</div>
|
|
@@ -7,7 +7,7 @@ import Layout from "../components/Layout";
|
|
|
7
7
|
import { acceptRSVPInvitation, declineRSVPInvitation, getRSVPInvitation } from "../actions/user-actions";
|
|
8
8
|
import { getEventById } from "../actions/event-actions";
|
|
9
9
|
import styles from "../styles/rsvp-page.module.scss"
|
|
10
|
-
import { RSVP_STATUS } from "@utils/rsvpConstants";
|
|
10
|
+
import { RSVP_STATUS, RSVP_CAPACITY } from "@utils/rsvpConstants";
|
|
11
11
|
import { Badge } from "react-bootstrap";
|
|
12
12
|
import "../i18n";
|
|
13
13
|
|
|
@@ -96,15 +96,18 @@ const RSVPPage = ({ location, rsvpInvitation, event, getRSVPInvitation, acceptRS
|
|
|
96
96
|
}
|
|
97
97
|
<div className={styles.buttonWrapper}>
|
|
98
98
|
{errorMessage && (
|
|
99
|
-
|
|
99
|
+
<h3 dangerouslySetInnerHTML={{ __html: errorMessage }} />
|
|
100
100
|
)}
|
|
101
101
|
{rsvpInvitation?.status === RSVP_STATUS.rejected && (
|
|
102
102
|
<h4>{t("rsvp_page.decline_message")} </h4>
|
|
103
103
|
)}
|
|
104
104
|
{rsvpInvitation?.status === RSVP_STATUS.accepted && (
|
|
105
|
-
|
|
105
|
+
rsvpInvitation?.rsvp?.seat_type === RSVP_CAPACITY.waitlist ?
|
|
106
|
+
<h4>{t("rsvp_page.waitlist_message")} </h4>
|
|
107
|
+
:
|
|
108
|
+
<h4>{t("rsvp_page.confirm_message")} </h4>
|
|
106
109
|
)}
|
|
107
|
-
{rsvpInvitation?.status === RSVP_STATUS.pending && (
|
|
110
|
+
{rsvpInvitation?.status === RSVP_STATUS.pending && rsvpInvitation?.event?.rsvp_capacity !== RSVP_CAPACITY.full && (
|
|
108
111
|
<>
|
|
109
112
|
<button className="button is-large" onClick={() => handleConfirmRSVP(true)}>
|
|
110
113
|
{t("rsvp_page.accept_button")}
|
|
@@ -113,13 +116,18 @@ const RSVPPage = ({ location, rsvpInvitation, event, getRSVPInvitation, acceptRS
|
|
|
113
116
|
{t("rsvp_page.decline_button")}
|
|
114
117
|
</button>
|
|
115
118
|
</>
|
|
116
|
-
)
|
|
119
|
+
)
|
|
120
|
+
}
|
|
121
|
+
{rsvpInvitation?.status === RSVP_STATUS.pending && rsvpInvitation?.event?.rsvp_capacity === RSVP_CAPACITY.full && (
|
|
122
|
+
<h4>{t("rsvp_page.full_message")} </h4>
|
|
123
|
+
)
|
|
124
|
+
}
|
|
117
125
|
</div>
|
|
118
126
|
</>)
|
|
119
127
|
:
|
|
120
128
|
(
|
|
121
129
|
<>
|
|
122
|
-
|
|
130
|
+
<h3>Activity not found.</h3>
|
|
123
131
|
</>
|
|
124
132
|
)
|
|
125
133
|
}
|
|
@@ -8,6 +8,11 @@ class EventAPIRequest extends BaseAPIRequest {
|
|
|
8
8
|
static instance;
|
|
9
9
|
|
|
10
10
|
constructor() {
|
|
11
|
+
/*
|
|
12
|
+
* WARNING
|
|
13
|
+
* if any of these fields , relations or expand changes should be replicated here
|
|
14
|
+
* https://github.com/fntechgit/pub-api/blob/main/api/utils/summit_api_requests/event_api_request.py
|
|
15
|
+
*/
|
|
11
16
|
const primary_fields = [
|
|
12
17
|
"id",
|
|
13
18
|
"created",
|
|
@@ -79,8 +84,6 @@ class EventAPIRequest extends BaseAPIRequest {
|
|
|
79
84
|
|
|
80
85
|
const locations_relations = ["location.venue", "location.floor", "location.venue.none", "location.floor.none"];
|
|
81
86
|
|
|
82
|
-
// TODO: review relations for "current_attendance"
|
|
83
|
-
|
|
84
87
|
const relations = [
|
|
85
88
|
...track_relations,
|
|
86
89
|
...type_relations,
|
|
@@ -3,7 +3,11 @@ class SpeakersAPIRequest extends BaseAPIRequest {
|
|
|
3
3
|
static instance;
|
|
4
4
|
|
|
5
5
|
constructor() {
|
|
6
|
-
|
|
6
|
+
/*
|
|
7
|
+
* WARNING
|
|
8
|
+
* if any of these fields , relations or expand changes should be replicated here
|
|
9
|
+
* https://github.com/fntechgit/pub-api/blob/main/api/utils/summit_api_requests/speaker_api_request.py
|
|
10
|
+
*/
|
|
7
11
|
const primary_fields =
|
|
8
12
|
['id', 'first_name', 'last_name', 'title', 'bio', 'member_id', 'pic', 'big_pic', 'company'];
|
|
9
13
|
|
|
@@ -3,16 +3,21 @@ const BaseAPIRequest = require("./BaseAPIRequest");
|
|
|
3
3
|
class SummitAPIRequest extends BaseAPIRequest {
|
|
4
4
|
static instance;
|
|
5
5
|
|
|
6
|
+
|
|
6
7
|
constructor() {
|
|
8
|
+
/*
|
|
9
|
+
* WARNING
|
|
10
|
+
* if any of these fields , relations or expand changes should be replicated here
|
|
11
|
+
* https://github.com/fntechgit/pub-api/blob/main/api/utils/summit_api_requests/summit_api_request.py
|
|
12
|
+
*/
|
|
7
13
|
const primary_fields = [
|
|
8
14
|
"id", "name", "start_date", "end_date", "time_zone_id", "time_zone_label", "secondary_logo", "slug",
|
|
9
|
-
"support_email", "start_showing_venues_date", "dates_with_events", "logo",
|
|
15
|
+
"support_email", "start_showing_venues_date", "dates_with_events", "logo", "dates_label",
|
|
10
16
|
"registration_allowed_refund_request_till_date", "allow_update_attendee_extra_questions", "is_virtual",
|
|
11
17
|
"registration_disclaimer_mandatory", "registration_disclaimer_content", "reassign_ticket_till_date",
|
|
12
18
|
"is_main", "title", "description", "time_zone"
|
|
13
19
|
];
|
|
14
20
|
|
|
15
|
-
// TODO: to be reviewed later with data syncs actions to match the needs of the data update
|
|
16
21
|
const event_types_fields = [
|
|
17
22
|
"event_types.id"
|
|
18
23
|
];
|
|
@@ -39,7 +44,7 @@ class SummitAPIRequest extends BaseAPIRequest {
|
|
|
39
44
|
const ticket_types_relations = ["ticket_types.none"];
|
|
40
45
|
const tracks_relations = ["tracks", "tracks.subtracks.none"];
|
|
41
46
|
const track_groups_relations = ["track_groups.none"];
|
|
42
|
-
const location_relations = ["locations.none, locations.venue.none"];
|
|
47
|
+
const location_relations = ["locations.none", "locations.venue.none"];
|
|
43
48
|
const event_types_relations = ["event_types.none"];
|
|
44
49
|
|
|
45
50
|
const relations = [
|
|
@@ -68,6 +68,8 @@ export const MARKETING_SETTINGS_KEYS = {
|
|
|
68
68
|
certificateLogoWidth: "CERTIFICATE_LOGO_WIDTH",
|
|
69
69
|
certificateLogoHeight: "CERTIFICATE_LOGO_HEIGHT",
|
|
70
70
|
certificateTitleText: "CERTIFICATE_TITLE_TEXT",
|
|
71
|
+
certificateAttendeeTitleText: "CERTIFICATE_ATTENDEE_TITLE_TEXT",
|
|
72
|
+
certificateSpeakerTitleText: "CERTIFICATE_SPEAKER_TITLE_TEXT",
|
|
71
73
|
certificateSummitName: "CERTIFICATE_SUMMIT_NAME",
|
|
72
74
|
certificateShowRole: "CERTIFICATE_SHOW_ROLE",
|
|
73
75
|
}
|