From 5b9e0e1c29d098b429280b1abd329e2a45a78f61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Wed, 15 Oct 2025 18:45:25 -0300 Subject: [PATCH 1/3] fix: add badge data to show on swal popup on badge check in MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- src/pages/attendees/badge-checkin-page.js | 9 ++++++--- src/utils/methods.js | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/pages/attendees/badge-checkin-page.js b/src/pages/attendees/badge-checkin-page.js index b6be42d0e..8787a17d6 100644 --- a/src/pages/attendees/badge-checkin-page.js +++ b/src/pages/attendees/badge-checkin-page.js @@ -9,16 +9,17 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - **/ + * */ import React, { useState } from "react"; import { connect } from "react-redux"; import { Breadcrumb } from "react-breadcrumbs"; import T from "i18n-react/dist/i18n-react"; -import { checkInBadge } from "../../actions/badge-actions"; import QrReader from "modern-react-qr-reader"; import { isMobile } from "react-device-detect"; import Swal from "sweetalert2"; +import { checkInBadge } from "../../actions/badge-actions"; +import { formatBadgeQR } from "../../utils/methods"; import styles from "../../styles/badge-checkin-page.module.less"; const BadgeCheckinPage = ({ match, currentSummit, checkInBadge }) => { @@ -30,9 +31,10 @@ const BadgeCheckinPage = ({ match, currentSummit, checkInBadge }) => { setScanning(true); checkInBadge(data) .then(() => { + const badgeData = formatBadgeQR(data, currentSummit); Swal.fire( T.translate("badge_checkin.checked_in"), - `${qrValid[3]} (${qrValid[2]}) checked in!`, + `${badgeData.fullName} (${badgeData.email}) checked in!`, "success" ); }) @@ -77,6 +79,7 @@ const BadgeCheckinPage = ({ match, currentSummit, checkInBadge }) => { onClick={() => setCamera(camera === "environment" ? "user" : "environment") } + type="button" > { export const capitalizeFirstLetter = (val) => String(val).charAt(0).toUpperCase() + String(val).slice(1); + +export const formatBadgeQR = (code, summit) => { + const qrCodeArray = code.split(summit.qr_registry_field_delimiter); + + if (qrCodeArray.length > TWO && qrCodeArray[0] === summit.badge_qr_prefix) { + return { + badgePrefix: qrCodeArray[0], + ticketNumber: qrCodeArray[1], + email: qrCodeArray[2], + fullName: qrCodeArray[3] + }; + } + + return false; +}; From aa64ee8bb1ef0105a90eb83a9b40b2dac29c709d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Mon, 5 Jan 2026 16:15:16 -0300 Subject: [PATCH 2/3] fix: add catch for invalid qr badge format, empty string for missing badge data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- src/pages/attendees/badge-checkin-page.js | 14 ++++++++++++-- src/utils/constants.js | 2 ++ src/utils/methods.js | 13 ++++++++----- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/pages/attendees/badge-checkin-page.js b/src/pages/attendees/badge-checkin-page.js index 8787a17d6..1d79c8eab 100644 --- a/src/pages/attendees/badge-checkin-page.js +++ b/src/pages/attendees/badge-checkin-page.js @@ -32,6 +32,16 @@ const BadgeCheckinPage = ({ match, currentSummit, checkInBadge }) => { checkInBadge(data) .then(() => { const badgeData = formatBadgeQR(data, currentSummit); + + if (!badgeData) { + Swal.fire( + T.translate("general.error"), + T.translate("badge_checkin.error_invalid_qr"), + "warning" + ); + return; + } + Swal.fire( T.translate("badge_checkin.checked_in"), `${badgeData.fullName} (${badgeData.email}) checked in!`, @@ -46,8 +56,8 @@ const BadgeCheckinPage = ({ match, currentSummit, checkInBadge }) => { const handleError = () => { Swal.fire({ - title: "Error", - text: "cannot read QR code, please try again", + title: T.translate("general.error"), + text: T.translate("badge_checkin.error_qr"), type: "warning" }); }; diff --git a/src/utils/constants.js b/src/utils/constants.js index e273e38ce..7bc0f6789 100644 --- a/src/utils/constants.js +++ b/src/utils/constants.js @@ -224,3 +224,5 @@ export const ROOM_OCCUPANCY_OPTIONS = [ "FULL", "OVERFLOW" ]; + +export const BADGE_QR_MINIMUN_EXPECTED_FIELDS = 2; diff --git a/src/utils/methods.js b/src/utils/methods.js index 54613d74f..aeb1df334 100644 --- a/src/utils/methods.js +++ b/src/utils/methods.js @@ -31,7 +31,7 @@ import { INT_BASE, OR_FILTER, MARKETING_SETTING_TYPE_HEX_COLOR, - TWO + BADGE_QR_MINIMUN_EXPECTED_FIELDS } from "./constants"; const DAY_IN_SECONDS = 86400; // 86400 seconds per day @@ -509,14 +509,17 @@ export const capitalizeFirstLetter = (val) => export const formatBadgeQR = (code, summit) => { const qrCodeArray = code.split(summit.qr_registry_field_delimiter); - if (qrCodeArray.length > TWO && qrCodeArray[0] === summit.badge_qr_prefix) { + if ( + qrCodeArray.length > BADGE_QR_MINIMUN_EXPECTED_FIELDS && + qrCodeArray[0] === summit.badge_qr_prefix + ) { return { badgePrefix: qrCodeArray[0], ticketNumber: qrCodeArray[1], - email: qrCodeArray[2], - fullName: qrCodeArray[3] + email: qrCodeArray[2] || "", + fullName: qrCodeArray[3] || "" }; } - return false; + return null; }; From 61ad8e3ff90553536c00942e3043ba01240e759a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Castillo?= Date: Mon, 5 Jan 2026 16:29:08 -0300 Subject: [PATCH 3/3] fix: change constant name, adjust badge data error before checkInBadge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Castillo --- src/pages/attendees/badge-checkin-page.js | 20 +++++++++----------- src/utils/constants.js | 2 +- src/utils/methods.js | 4 ++-- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/pages/attendees/badge-checkin-page.js b/src/pages/attendees/badge-checkin-page.js index 1d79c8eab..7e7b10240 100644 --- a/src/pages/attendees/badge-checkin-page.js +++ b/src/pages/attendees/badge-checkin-page.js @@ -28,20 +28,18 @@ const BadgeCheckinPage = ({ match, currentSummit, checkInBadge }) => { const handleCheckIn = (data) => { if (data && !scanning) { + const badgeData = formatBadgeQR(data, currentSummit); + if (!badgeData) { + Swal.fire( + T.translate("general.error"), + T.translate("badge_checkin.error_invalid_qr"), + "warning" + ); + return; + } setScanning(true); checkInBadge(data) .then(() => { - const badgeData = formatBadgeQR(data, currentSummit); - - if (!badgeData) { - Swal.fire( - T.translate("general.error"), - T.translate("badge_checkin.error_invalid_qr"), - "warning" - ); - return; - } - Swal.fire( T.translate("badge_checkin.checked_in"), `${badgeData.fullName} (${badgeData.email}) checked in!`, diff --git a/src/utils/constants.js b/src/utils/constants.js index 7bc0f6789..280a9acf7 100644 --- a/src/utils/constants.js +++ b/src/utils/constants.js @@ -225,4 +225,4 @@ export const ROOM_OCCUPANCY_OPTIONS = [ "OVERFLOW" ]; -export const BADGE_QR_MINIMUN_EXPECTED_FIELDS = 2; +export const BADGE_QR_MINIMUM_EXPECTED_FIELDS = 3; diff --git a/src/utils/methods.js b/src/utils/methods.js index aeb1df334..a413e0390 100644 --- a/src/utils/methods.js +++ b/src/utils/methods.js @@ -31,7 +31,7 @@ import { INT_BASE, OR_FILTER, MARKETING_SETTING_TYPE_HEX_COLOR, - BADGE_QR_MINIMUN_EXPECTED_FIELDS + BADGE_QR_MINIMUM_EXPECTED_FIELDS } from "./constants"; const DAY_IN_SECONDS = 86400; // 86400 seconds per day @@ -510,7 +510,7 @@ export const formatBadgeQR = (code, summit) => { const qrCodeArray = code.split(summit.qr_registry_field_delimiter); if ( - qrCodeArray.length > BADGE_QR_MINIMUN_EXPECTED_FIELDS && + qrCodeArray.length >= BADGE_QR_MINIMUM_EXPECTED_FIELDS && qrCodeArray[0] === summit.badge_qr_prefix ) { return {