From 97a8080b14554e5a1cda993b6314fc8449ee9220 Mon Sep 17 00:00:00 2001 From: Bryce Meyer Date: Tue, 25 Nov 2025 00:10:40 +0100 Subject: [PATCH 1/3] added invitation token to sign up page --- src/pages/SignUp/index.tsx | 22 ++++++++++++++++++---- src/services/requests/AuthRequests.ts | 1 + 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/pages/SignUp/index.tsx b/src/pages/SignUp/index.tsx index d9a968b3..c89aa765 100644 --- a/src/pages/SignUp/index.tsx +++ b/src/pages/SignUp/index.tsx @@ -3,14 +3,18 @@ import * as Yup from 'yup'; import './index.scss'; import { useFormik } from "formik"; import AuthRequests, { SignUpData } from "../../services/requests/AuthRequests"; -import { useHistory } from "react-router-dom"; +import { useHistory, useLocation } from "react-router-dom"; import { Button, Form, FormControl, FormLabel } from "react-bootstrap"; import Page from "../../components/Template/Page"; const SignUp: React.FC = () => { const history = useHistory(); + const location = useLocation(); const [error, setError] = useState(null); + const searchParams = new URLSearchParams(location.search); + const invitationToken = searchParams.get('invite') || ''; + const SignupSchema = Yup.object().shape({ email: Yup.string() .email('Invalid email format') @@ -37,8 +41,17 @@ const SignUp: React.FC = () => { setError('Unknown Error'); } } catch (error: unknown) { - if (typeof error === 'object' && error !== null && 'status' in error && (error as { status: unknown }).status === 409) { - setError('Email already exists.'); + if (typeof error === 'object' && error !== null && 'status' in error) { + const status = (error as { status: number }).status; + if (status === 409) { + setError('Email already exists.'); + } else if (status === 400) { + setError('Invalid invitation token.'); + } else if (status === 404) { + setError('Invitation token not found or has expired.'); + } else { + setError('Failed to create account. Please try again.'); + } } else { setError('Failed to create account. Please try again.'); } @@ -50,7 +63,8 @@ const SignUp: React.FC = () => { email: '', password: '', first_name: '', - last_name: '' + last_name: '', + invitation_token: invitationToken }, validationSchema: SignupSchema, onSubmit: submit diff --git a/src/services/requests/AuthRequests.ts b/src/services/requests/AuthRequests.ts index 3797ba04..651cdd92 100644 --- a/src/services/requests/AuthRequests.ts +++ b/src/services/requests/AuthRequests.ts @@ -14,6 +14,7 @@ export interface SignUpData { password: string; first_name: string; last_name: string; + invitation_token?: string; } export default class AuthRequests { From 93ef1003071606780563391d260a544b05679792 Mon Sep 17 00:00:00 2001 From: Bryce Meyer Date: Tue, 25 Nov 2025 00:22:15 +0100 Subject: [PATCH 2/3] fixed error --- src/pages/SignUp/index.test.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pages/SignUp/index.test.tsx b/src/pages/SignUp/index.test.tsx index 20f57e57..a4da38b6 100644 --- a/src/pages/SignUp/index.test.tsx +++ b/src/pages/SignUp/index.test.tsx @@ -87,7 +87,8 @@ describe('SignUp', () => { email: 'test@example.com', password: 'password123', first_name: 'John', - last_name: '' + last_name: '', + invitation_token: '' }); }); @@ -135,7 +136,8 @@ describe('SignUp', () => { email: 'test@example.com', password: 'password123', first_name: 'John', - last_name: 'Doe' + last_name: 'Doe', + invitation_token: '' }); }); From c234e62a2805dbdf4d942b0cf22c3f3c3af02f61 Mon Sep 17 00:00:00 2001 From: Bryce Meyer Date: Tue, 25 Nov 2025 00:32:39 +0100 Subject: [PATCH 3/3] fixed audit --- package-lock.json | 51 ++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index a95b3755..c4b067b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2618,9 +2618,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "dependencies": { "argparse": "^2.0.1" @@ -5177,12 +5177,12 @@ } }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -5423,9 +5423,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -7133,9 +7133,9 @@ } }, "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "dependencies": { "argparse": "^2.0.1" @@ -7457,9 +7457,9 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" @@ -7562,13 +7562,14 @@ } }, "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -9666,9 +9667,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "dependencies": { "argparse": "^1.0.7", @@ -12660,9 +12661,9 @@ "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" }, "node_modules/vite": { - "version": "5.4.19", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", - "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "dependencies": { "esbuild": "^0.21.3",