From 1dfc704887fdfe36c001d53c6357fc45725fea90 Mon Sep 17 00:00:00 2001 From: chubby-ducky Date: Thu, 15 Jan 2026 11:47:08 -0800 Subject: [PATCH 1/2] verify-button-test-1 --- src/APIFunctions/MembershipPayment.js | 27 +++++ src/Pages/Profile/MemberView/Profile.js | 21 ++++ .../MemberView/VerifyMembershipModal.js | 99 +++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 src/APIFunctions/MembershipPayment.js create mode 100644 src/Pages/Profile/MemberView/VerifyMembershipModal.js diff --git a/src/APIFunctions/MembershipPayment.js b/src/APIFunctions/MembershipPayment.js new file mode 100644 index 000000000..38d2d892a --- /dev/null +++ b/src/APIFunctions/MembershipPayment.js @@ -0,0 +1,27 @@ +import { ApiResponse } from "./ApiResponses"; +import { BASE_API_URL } from "../Enums"; + +export async function verifyMembershipFromDb(token, confirmationCode) { + let status = new ApiResponse(); + try { + const url = new URL('/api/MembershipPayment/verifyMembership', BASE_API_URL); + const res = await fetch(url.href, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify({ confirmationCode }) + }); + if (res.ok) { + const result = await res.json(); + status.responseData = result; + } else { + status.error = true; + } + } catch (err) { + status.error = true; + status.responseData = err; + } + return status; +} diff --git a/src/Pages/Profile/MemberView/Profile.js b/src/Pages/Profile/MemberView/Profile.js index fc5ff3482..fcb4b72bc 100644 --- a/src/Pages/Profile/MemberView/Profile.js +++ b/src/Pages/Profile/MemberView/Profile.js @@ -3,6 +3,7 @@ import { getUserById } from '../../../APIFunctions/User'; import ChangePasswordModal from './ChangePassword'; import DeleteAccountModal from './DeleteAccountModal'; import GetApiKeyModal from './GetApiKeyModal'; +import VerifyMembershipModal from './VerifyMembershipModal'; import { membershipState, membershipStateToString } from '../../../Enums'; import { useSCE } from '../../../Components/context/SceContext'; @@ -53,6 +54,14 @@ export default function Profile() { {response.firstName} {response.lastName}
+
+ { + setBannerMessage(message); + setBannerColor(color); + setTimeout(() => { + setBannerMessage(''); + setBannerColor(''); + }, delay); + }} + accessLevel={response.accessLevel} + onVerificationSuccess={getUserFromApi} + /> { setBannerMessage(message); diff --git a/src/Pages/Profile/MemberView/VerifyMembershipModal.js b/src/Pages/Profile/MemberView/VerifyMembershipModal.js new file mode 100644 index 000000000..e8f0f0a2b --- /dev/null +++ b/src/Pages/Profile/MemberView/VerifyMembershipModal.js @@ -0,0 +1,99 @@ +import React, { useEffect, useState } from 'react'; +import { useSCE } from '../../../Components/context/SceContext'; +import { verifyMembershipFromDb } from '../../../APIFunctions/MembershipPayment'; + +export default function VerifyMembershipModal(props) { + const { bannerCallback = (message, color) => { }, confirmClassAddons, accessLevel, onVerificationSuccess = () => {} } = props; + const [confirmationCode, setConfirmationCode] = useState(''); + const { user } = useSCE(); + + const INPUT_CLASS_NAME = 'indent-2 block w-full rounded-md border-0 py-1.5 bg-white text-black shadow-sm ring-1 ring-inset ring-gray-300 placeholder-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6'; + + async function verifyMembership() { + const apiResponse = await verifyMembershipFromDb( + user.token, + confirmationCode, + ); + if (apiResponse.error) { + bannerCallback('Unable to verify membership. Please try again later.'); + return; + } + bannerCallback('Congrats, you confirmed your membership!'); + setConfirmationCode(''); + document.getElementById('verify-membership-modal').close(); + onVerificationSuccess(); + } + + return (<> + +
+

Verify Membership

+ {accessLevel > 0 ? ( + <> +

+ You are already verified!!! +

+
+
+
+ +
+
+
+ + ) : ( + <> +

+ Please enter the confirmation code you received via email. +

+ +
+ { + setConfirmationCode(e.target.value); + }} + className={INPUT_CLASS_NAME} + /> +
+ +
+
+
+ + +
+
+
+ + )} +
+
+ + ); +} From 1b240c3e12b2388e671d75402e8fef12570f7baf Mon Sep 17 00:00:00 2001 From: chubby-ducky Date: Thu, 15 Jan 2026 11:54:19 -0800 Subject: [PATCH 2/2] fix lint --- src/APIFunctions/MembershipPayment.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/APIFunctions/MembershipPayment.js b/src/APIFunctions/MembershipPayment.js index 38d2d892a..2da88e46b 100644 --- a/src/APIFunctions/MembershipPayment.js +++ b/src/APIFunctions/MembershipPayment.js @@ -1,5 +1,5 @@ -import { ApiResponse } from "./ApiResponses"; -import { BASE_API_URL } from "../Enums"; +import { ApiResponse } from './ApiResponses'; +import { BASE_API_URL } from '../Enums'; export async function verifyMembershipFromDb(token, confirmationCode) { let status = new ApiResponse();