From c65f30beb687488eb68d7e7826a20dbef3767a66 Mon Sep 17 00:00:00 2001 From: flatplum Date: Mon, 15 Sep 2025 22:24:34 +1000 Subject: [PATCH 1/9] chore: add eslint-config-google as dev-dep --- package-lock.json | 14 ++++++++++++++ package.json | 1 + 2 files changed, 15 insertions(+) diff --git a/package-lock.json b/package-lock.json index f2d9bb8..870a026 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,7 @@ "@vitejs/plugin-react": "^3.1.0", "autoprefixer": "^10.4.16", "eslint": "^8.51.0", + "eslint-config-google": "^0.14.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.1", "eslint-plugin-react": "^7.33.2", @@ -4768,6 +4769,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-google": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", + "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, "node_modules/eslint-config-prettier": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", diff --git a/package.json b/package.json index b98f448..74081f6 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "@vitejs/plugin-react": "^3.1.0", "autoprefixer": "^10.4.16", "eslint": "^8.51.0", + "eslint-config-google": "^0.14.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.1", "eslint-plugin-react": "^7.33.2", From 5a2d9ec602045fab1ddcdb196ea1f3032ecf2cb0 Mon Sep 17 00:00:00 2001 From: flatplum Date: Mon, 15 Sep 2025 22:26:19 +1000 Subject: [PATCH 2/9] chore: fix eslint problems across project Todo: - a large number of eslint errors remain --- functions/index.js | 2 +- src/components/Button/HMButton.tsx | 2 +- src/routes/Events.tsx | 8 ++++---- src/routes/MeetTheTeam.tsx | 8 ++++---- src/routes/Sponsors.tsx | 8 ++++---- src/routes/eventPages/GameComplete.tsx | 2 +- src/routes/eventPages/OWeek.tsx | 8 ++++---- src/routes/eventPages/OWeekGame.tsx | 6 +++--- src/services/cleanEmails.ts | 4 ++-- src/services/firestoreServices.ts | 2 +- src/services/linksPageServices.ts | 2 +- src/services/meetTeamServices.ts | 2 +- src/services/tournamentServices.ts | 2 +- 13 files changed, 28 insertions(+), 28 deletions(-) diff --git a/functions/index.js b/functions/index.js index 53a93b5..7be528a 100644 --- a/functions/index.js +++ b/functions/index.js @@ -239,4 +239,4 @@ exports.getLinksPage = onCall( // await getFirestore().collection("riserData").add(result); // return { text: "hi" }; -// }); \ No newline at end of file +// }); diff --git a/src/components/Button/HMButton.tsx b/src/components/Button/HMButton.tsx index e94594b..8b69f94 100644 --- a/src/components/Button/HMButton.tsx +++ b/src/components/Button/HMButton.tsx @@ -18,7 +18,7 @@ const HMButton = ({ text, color, style, span, link }: Props) => { style = 'disabled'; } - let key = { + const key = { filled: { primary: ['bg-yellow-500'], secondary: ['bg-blue-500'], diff --git a/src/routes/Events.tsx b/src/routes/Events.tsx index 7744bdf..839a565 100644 --- a/src/routes/Events.tsx +++ b/src/routes/Events.tsx @@ -60,14 +60,14 @@ const Events = () => { // Animations const scrollRef = useRef(null); - let { scrollYProgress } = useScroll({ + const { scrollYProgress } = useScroll({ target: scrollRef, offset: ["start start", "end start"], }); - let y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); - let opacityValue = useTransform(scrollYProgress, [0, 0.8], ["100%", "0%"]); - let scaleValue = useTransform(scrollYProgress, [0, 0.8], ["1", "0.9"]); + const y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); + const opacityValue = useTransform(scrollYProgress, [0, 0.8], ["100%", "0%"]); + const scaleValue = useTransform(scrollYProgress, [0, 0.8], ["1", "0.9"]); return (
diff --git a/src/routes/MeetTheTeam.tsx b/src/routes/MeetTheTeam.tsx index 23fba80..f4f2b32 100644 --- a/src/routes/MeetTheTeam.tsx +++ b/src/routes/MeetTheTeam.tsx @@ -108,14 +108,14 @@ const MeetTheTeam = () => { // Animations const scrollRef = useRef(null); - let { scrollYProgress } = useScroll({ + const { scrollYProgress } = useScroll({ target: scrollRef, offset: ["start start", "end start"], }); - let y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); - let opacityValue = useTransform(scrollYProgress, [0, 0.7], ["100%", "0%"]); - let scaleValue = useTransform(scrollYProgress, [0, 0.8], ["1", "0.9"]); + const y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); + const opacityValue = useTransform(scrollYProgress, [0, 0.7], ["100%", "0%"]); + const scaleValue = useTransform(scrollYProgress, [0, 0.8], ["1", "0.9"]); return (
diff --git a/src/routes/Sponsors.tsx b/src/routes/Sponsors.tsx index 2273860..a4b3cd2 100644 --- a/src/routes/Sponsors.tsx +++ b/src/routes/Sponsors.tsx @@ -96,14 +96,14 @@ const Sponsors = () => { // Animations const scrollRef = useRef(null); - let { scrollYProgress } = useScroll({ + const { scrollYProgress } = useScroll({ target: scrollRef, offset: ["start start", "end start"], }); - let y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); - let opacityValue = useTransform(scrollYProgress, [0, 0.7], ["100%", "0%"]); - let scaleValue = useTransform(scrollYProgress, [0, 0.8], ["1", "0.9"]); + const y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); + const opacityValue = useTransform(scrollYProgress, [0, 0.7], ["100%", "0%"]); + const scaleValue = useTransform(scrollYProgress, [0, 0.8], ["1", "0.9"]); return (
diff --git a/src/routes/eventPages/GameComplete.tsx b/src/routes/eventPages/GameComplete.tsx index 04708b6..5bd3f7f 100644 --- a/src/routes/eventPages/GameComplete.tsx +++ b/src/routes/eventPages/GameComplete.tsx @@ -6,7 +6,7 @@ import { RiserOutputData } from "./RiserGame.model"; import { useLocation, useNavigate } from "react-router-dom"; const GameComplete = () => { - let data: RiserOutputData = useLocation().state; + const data: RiserOutputData = useLocation().state; const navigate = useNavigate(); diff --git a/src/routes/eventPages/OWeek.tsx b/src/routes/eventPages/OWeek.tsx index 525ea29..eab52a5 100644 --- a/src/routes/eventPages/OWeek.tsx +++ b/src/routes/eventPages/OWeek.tsx @@ -82,13 +82,13 @@ export default function RiserGame() { // Animations const scrollRef = useRef(null); - let { scrollYProgress } = useScroll({ + const { scrollYProgress } = useScroll({ target: scrollRef, offset: ["start start", "end start"], }); - let y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); - let opacityValue = useTransform(scrollYProgress, [0, 0.6], ["100%", "0%"]); - let scaleValue = useTransform(scrollYProgress, [0, 0.9], ["1", "0.9"]); + const y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); + const opacityValue = useTransform(scrollYProgress, [0, 0.6], ["100%", "0%"]); + const scaleValue = useTransform(scrollYProgress, [0, 0.9], ["1", "0.9"]); // Form Field Values const [firstName, setFirstName] = useState(""); diff --git a/src/routes/eventPages/OWeekGame.tsx b/src/routes/eventPages/OWeekGame.tsx index a00ea97..a694246 100644 --- a/src/routes/eventPages/OWeekGame.tsx +++ b/src/routes/eventPages/OWeekGame.tsx @@ -7,7 +7,7 @@ import { RiserGameModel, RiserOutputData, RiserUserInput } from "./RiserGame.mod const OWeekGame = () => { const navigate = useNavigate(); - let data: RiserUserInput = useLocation().state; + const data: RiserUserInput = useLocation().state; // If data is empty useEffect(() => { @@ -23,7 +23,7 @@ const OWeekGame = () => { const [result, setResult] = useState([]); - let userGameData: RiserGameModel = { + const userGameData: RiserGameModel = { name: data.name, email: data.email, studentID: data.studentID, @@ -75,7 +75,7 @@ const OWeekGame = () => { alert("Oops! You went over 2024! Your score is disqualified"); result.push(0); } else { - let tempResult = result; + const tempResult = result; tempResult.push(time); setResult(tempResult); console.log(result); diff --git a/src/services/cleanEmails.ts b/src/services/cleanEmails.ts index c5566cf..3e026ba 100644 --- a/src/services/cleanEmails.ts +++ b/src/services/cleanEmails.ts @@ -1,9 +1,9 @@ export default function cleanEmail(email: string): string { // Define the regex pattern - var pattern = /\.(?=.*@)|\+.*(?=@)/g; + const pattern = /\.(?=.*@)|\+.*(?=@)/g; // Use replace() method to replace matches with an empty string - var outputString = email.replace(pattern, ""); + const outputString = email.replace(pattern, ""); return outputString; } diff --git a/src/services/firestoreServices.ts b/src/services/firestoreServices.ts index 0fecb5c..8ccb1ae 100644 --- a/src/services/firestoreServices.ts +++ b/src/services/firestoreServices.ts @@ -58,7 +58,7 @@ export async function isUniqueEmail(id: string): Promise { export async function getRiserLeaderboard(): Promise { const leaderboardRef = collection(db, "riserData"); - let leaderboardData: RankEntry[] = []; + const leaderboardData: RankEntry[] = []; try { // Add orderby time when firebase functions implements feature diff --git a/src/services/linksPageServices.ts b/src/services/linksPageServices.ts index d20b7d2..3cf1a2b 100644 --- a/src/services/linksPageServices.ts +++ b/src/services/linksPageServices.ts @@ -5,7 +5,7 @@ import { LinkItemProps } from "../features/LinkItem/LinkItemProps"; export async function getLinksPage(): Promise { try { - let result = await httpsCallable(functions, "getLinksPage")(); + const result = await httpsCallable(functions, "getLinksPage")(); // Storing result to localStorage for faster load times for next visits localStorage.setItem("links", JSON.stringify(result)); diff --git a/src/services/meetTeamServices.ts b/src/services/meetTeamServices.ts index 166f976..507260a 100644 --- a/src/services/meetTeamServices.ts +++ b/src/services/meetTeamServices.ts @@ -5,7 +5,7 @@ import { Member } from "../features/TeamComponent/TeamComponent.model"; export async function getMeetTheTeam(): Promise { try { - let result = await httpsCallable(functions, "getMeetTheTeam")(); + const result = await httpsCallable(functions, "getMeetTheTeam")(); return result.data as Member[]; } catch (e) { console.log(e); diff --git a/src/services/tournamentServices.ts b/src/services/tournamentServices.ts index 8b95124..9e40cd0 100644 --- a/src/services/tournamentServices.ts +++ b/src/services/tournamentServices.ts @@ -5,7 +5,7 @@ import { TournamentBracketProps } from "../features/TournamentBracket/Tournament export async function getHackiethonBrackets(): Promise { try { - let result = await httpsCallable(functions, "getHackiethonBrackets")(); + const result = await httpsCallable(functions, "getHackiethonBrackets")(); return result.data as TournamentBracketProps[]; } catch (e) { console.log(e); From 043eff11632b68856da2dc6fef03263db3d675f5 Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 16 Sep 2025 18:30:38 +0800 Subject: [PATCH 3/9] feat: application page --- functions/index.js | 123 +++++++++++++++++++++++++++++++++++++++++++++ functions/test.js | 89 ++++++++++++++++++++++++++++++++ 2 files changed, 212 insertions(+) diff --git a/functions/index.js b/functions/index.js index c82e7fb..2ab34e7 100644 --- a/functions/index.js +++ b/functions/index.js @@ -251,9 +251,132 @@ function createPageProperties(pageData) { return properties; } +// Helper function to handle API errors +function handleApiError(error, functionName) { + console.error(`Error in ${functionName}:`, error); + return { + success: false, + error: error.message || 'An unexpected error occurred', + details: error + }; +} + +// POST /api/pages - Create a new page +async function createNewPage(pageData) { + try { + // Validate the page data + if (!pageData.name) { + throw new Error('Page name is required'); + } + + if (!pageData.email) { + throw new Error('Email is required'); + } + // Email format validation + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(pageData.email)) { + throw new Error('Invalid email format'); + } + + // Create the page properties + const properties = createPageProperties(pageData); + + // Create the page in Notion + const newPage = await notion.pages.create({ + parent: { database_id: APPLICATION_DATABASE_ID }, + properties: properties + }); + + return { + success: true, + data: { + id: newPage.id, + url: newPage.url, + created_time: newPage.created_time + }, + message: 'Application submitted successfully' + }; + } catch (error) { + return handleApiError(error, 'createNewPage'); + } +} + +// GET /api/pages/:id - Get page by ID +async function getPageByID(pageId) { + try { + if (!pageId) { + throw new Error('Page ID is required'); + } + const page = await notion.pages.retrieve({ + page_id: pageId + }); + + const props = page.properties; + + // Parse the page data + const pageData = { + id: page.id, + name: props.Name?.title?.[0]?.plain_text || '', + email: props.Email?.email || '', + status: props.Status?.select?.name || '', + submissionDate: props["Submission Date"]?.date?.start || '', + role: props.Role?.select?.name || null, + motivation: props["Why are you applying?"]?.rich_text?.[0]?.plain_text || null, + created_time: page.created_time, + last_edited_time: page.last_edited_time, + url: page.url + }; + + return { + success: true, + data: pageData, + message: 'Page retrieved successfully' + }; + } catch (error) { + return handleApiError(error, 'getPageByID'); + } +} + +// DELETE /api/pages/:id - Delete (archive) a page +async function deletePage(pageId) { + try { + if (!pageId) { + throw new Error('Page ID is required'); + } + + // Soft delete by updating status to "Archived" + const updatedPage = await notion.pages.update({ + page_id: pageId, + properties: { + Status: { + select: { name: "Archived" } + } + } + }); + + return { + success: true, + data: { + id: updatedPage.id, + status: 'Archived' + }, + message: 'Application archived successfully' + }; + } catch (error) { + return handleApiError(error, 'deletePage'); + } +} +// Export the application functions +module.exports = { + createNewPage, + getPageByID, + deletePage, + createPageProperties, + handleApiError +}; // exports.setRiserData = onCall(async (req) => { // console.log(req.data.name); diff --git a/functions/test.js b/functions/test.js index 8f529ab..2958076 100644 --- a/functions/test.js +++ b/functions/test.js @@ -8,3 +8,92 @@ const testApplicationData = { role: "Education", motivation: "I want to help organize amazing hackathons and contribute to the tech community." }; + +// Test functions +async function runTests() { + console.log('šŸš€ Starting Application API Tests...\n'); + + try { + // Test 1: Create new page + console.log('šŸ“ Test 1: Creating new application...'); + const createResult = await createNewPage(testApplicationData); + console.log('Result:', createResult); + + if (createResult.success) { + const pageId = createResult.data.id; + console.log('āœ… Application created successfully!\n'); + + // Test 2: Get page by ID + console.log('šŸ“– Test 2: Retrieving application...'); + const getResult = await getPageByID(pageId); + console.log('Result:', getResult); + + if (getResult.success) { + console.log('āœ… Application retrieved successfully!\n'); + } else { + console.log('āŒ Failed to retrieve application\n'); + } + + // Test 3: Delete (archive) page + console.log('šŸ—‘ļø Test 3: Archiving application...'); + const deleteResult = await deletePage(pageId); + console.log('Result:', deleteResult); + + if (deleteResult.success) { + console.log('āœ… Application archived successfully!\n'); + } else { + console.log('āŒ Failed to archive application\n'); + } + + } else { + console.log('āŒ Failed to create application\n'); + } + + } catch (error) { + console.error('šŸ’„ Test failed with error:', error); + } + + console.log('šŸ Tests completed!'); +} + +// Test validation +async function testValidation() { + console.log('šŸ” Testing validation...\n'); + + // Test missing name + console.log('Test: Missing name'); + const result1 = await createNewPage({ email: "test@example.com" }); + console.log('Result:', result1); + + // Test missing email + console.log('\nTest: Missing email'); + const result2 = await createNewPage({ name: "Test User" }); + console.log('Result:', result2); + + // Test invalid email + console.log('\nTest: Invalid email'); + const result3 = await createNewPage({ name: "Test User", email: "invalid-email" }); + console.log('Result:', result3); + + console.log('\nāœ… Validation tests completed!\n'); +} + +// Run tests +if (require.main === module) { + console.log('Choose test to run:'); + console.log('1. Full API tests (requires valid Notion setup)'); + console.log('2. Validation tests only'); + + const testType = process.argv[2] || '2'; + + if (testType === '1') { + runTests(); + } else { + testValidation(); + } +} + +module.exports = { + runTests, + testValidation +}; From 1c26d2566218294011e7fc25301fb247bed82c00 Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 16 Sep 2025 18:31:25 +0800 Subject: [PATCH 4/9] simple create function --- functions/index.js | 123 --------------------------------------------- functions/test.js | 89 -------------------------------- 2 files changed, 212 deletions(-) diff --git a/functions/index.js b/functions/index.js index 2ab34e7..c82e7fb 100644 --- a/functions/index.js +++ b/functions/index.js @@ -251,132 +251,9 @@ function createPageProperties(pageData) { return properties; } -// Helper function to handle API errors -function handleApiError(error, functionName) { - console.error(`Error in ${functionName}:`, error); - return { - success: false, - error: error.message || 'An unexpected error occurred', - details: error - }; -} - -// POST /api/pages - Create a new page -async function createNewPage(pageData) { - try { - // Validate the page data - if (!pageData.name) { - throw new Error('Page name is required'); - } - - if (!pageData.email) { - throw new Error('Email is required'); - } - // Email format validation - const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - if (!emailRegex.test(pageData.email)) { - throw new Error('Invalid email format'); - } - - // Create the page properties - const properties = createPageProperties(pageData); - - // Create the page in Notion - const newPage = await notion.pages.create({ - parent: { database_id: APPLICATION_DATABASE_ID }, - properties: properties - }); - - return { - success: true, - data: { - id: newPage.id, - url: newPage.url, - created_time: newPage.created_time - }, - message: 'Application submitted successfully' - }; - } catch (error) { - return handleApiError(error, 'createNewPage'); - } -} - -// GET /api/pages/:id - Get page by ID -async function getPageByID(pageId) { - try { - if (!pageId) { - throw new Error('Page ID is required'); - } - const page = await notion.pages.retrieve({ - page_id: pageId - }); - - const props = page.properties; - - // Parse the page data - const pageData = { - id: page.id, - name: props.Name?.title?.[0]?.plain_text || '', - email: props.Email?.email || '', - status: props.Status?.select?.name || '', - submissionDate: props["Submission Date"]?.date?.start || '', - role: props.Role?.select?.name || null, - motivation: props["Why are you applying?"]?.rich_text?.[0]?.plain_text || null, - created_time: page.created_time, - last_edited_time: page.last_edited_time, - url: page.url - }; - - return { - success: true, - data: pageData, - message: 'Page retrieved successfully' - }; - } catch (error) { - return handleApiError(error, 'getPageByID'); - } -} - -// DELETE /api/pages/:id - Delete (archive) a page -async function deletePage(pageId) { - try { - if (!pageId) { - throw new Error('Page ID is required'); - } - - // Soft delete by updating status to "Archived" - const updatedPage = await notion.pages.update({ - page_id: pageId, - properties: { - Status: { - select: { name: "Archived" } - } - } - }); - - return { - success: true, - data: { - id: updatedPage.id, - status: 'Archived' - }, - message: 'Application archived successfully' - }; - } catch (error) { - return handleApiError(error, 'deletePage'); - } -} -// Export the application functions -module.exports = { - createNewPage, - getPageByID, - deletePage, - createPageProperties, - handleApiError -}; // exports.setRiserData = onCall(async (req) => { // console.log(req.data.name); diff --git a/functions/test.js b/functions/test.js index 2958076..8f529ab 100644 --- a/functions/test.js +++ b/functions/test.js @@ -8,92 +8,3 @@ const testApplicationData = { role: "Education", motivation: "I want to help organize amazing hackathons and contribute to the tech community." }; - -// Test functions -async function runTests() { - console.log('šŸš€ Starting Application API Tests...\n'); - - try { - // Test 1: Create new page - console.log('šŸ“ Test 1: Creating new application...'); - const createResult = await createNewPage(testApplicationData); - console.log('Result:', createResult); - - if (createResult.success) { - const pageId = createResult.data.id; - console.log('āœ… Application created successfully!\n'); - - // Test 2: Get page by ID - console.log('šŸ“– Test 2: Retrieving application...'); - const getResult = await getPageByID(pageId); - console.log('Result:', getResult); - - if (getResult.success) { - console.log('āœ… Application retrieved successfully!\n'); - } else { - console.log('āŒ Failed to retrieve application\n'); - } - - // Test 3: Delete (archive) page - console.log('šŸ—‘ļø Test 3: Archiving application...'); - const deleteResult = await deletePage(pageId); - console.log('Result:', deleteResult); - - if (deleteResult.success) { - console.log('āœ… Application archived successfully!\n'); - } else { - console.log('āŒ Failed to archive application\n'); - } - - } else { - console.log('āŒ Failed to create application\n'); - } - - } catch (error) { - console.error('šŸ’„ Test failed with error:', error); - } - - console.log('šŸ Tests completed!'); -} - -// Test validation -async function testValidation() { - console.log('šŸ” Testing validation...\n'); - - // Test missing name - console.log('Test: Missing name'); - const result1 = await createNewPage({ email: "test@example.com" }); - console.log('Result:', result1); - - // Test missing email - console.log('\nTest: Missing email'); - const result2 = await createNewPage({ name: "Test User" }); - console.log('Result:', result2); - - // Test invalid email - console.log('\nTest: Invalid email'); - const result3 = await createNewPage({ name: "Test User", email: "invalid-email" }); - console.log('Result:', result3); - - console.log('\nāœ… Validation tests completed!\n'); -} - -// Run tests -if (require.main === module) { - console.log('Choose test to run:'); - console.log('1. Full API tests (requires valid Notion setup)'); - console.log('2. Validation tests only'); - - const testType = process.argv[2] || '2'; - - if (testType === '1') { - runTests(); - } else { - testValidation(); - } -} - -module.exports = { - runTests, - testValidation -}; From 3ccf7a6d5c23c92f20fc024f702cb21507599f55 Mon Sep 17 00:00:00 2001 From: flatplum Date: Thu, 25 Sep 2025 23:15:24 +1000 Subject: [PATCH 5/9] fix: remove legacy tool options for subroles --- src/routes/Apply.tsx | 2 -- src/routes/applicationQuestions/sponsorships.tsx | 1 - src/routes/applicationQuestions/website.tsx | 3 +-- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/routes/Apply.tsx b/src/routes/Apply.tsx index 350f60f..c7ae462 100644 --- a/src/routes/Apply.tsx +++ b/src/routes/Apply.tsx @@ -345,7 +345,6 @@ function WebsiteOfficerForm() { ); case "Sponsorships Officer": @@ -353,7 +352,6 @@ function WebsiteOfficerForm() { ); default: diff --git a/src/routes/applicationQuestions/sponsorships.tsx b/src/routes/applicationQuestions/sponsorships.tsx index 8fda90d..8be012c 100644 --- a/src/routes/applicationQuestions/sponsorships.tsx +++ b/src/routes/applicationQuestions/sponsorships.tsx @@ -15,7 +15,6 @@ interface props { engagement: string }; handleChange: (e: React.ChangeEvent) => void; - toolsOptions: string[]; } const WebsiteQuestions: React.FC = ({ formData, handleChange }) => ( diff --git a/src/routes/applicationQuestions/website.tsx b/src/routes/applicationQuestions/website.tsx index d0f0946..443e718 100644 --- a/src/routes/applicationQuestions/website.tsx +++ b/src/routes/applicationQuestions/website.tsx @@ -14,8 +14,7 @@ interface websiteProps { ideas: string, goodweb: string }; - handleChange: (e: React.ChangeEvent) => void; - toolsOptions: string[]; + handleChange: (e: React.ChangeEvent) => void; } const WebsiteQuestions: React.FC = ({ formData, handleChange }) => ( From b68a02bfac27d4e685e363e2d991b86c679ba683 Mon Sep 17 00:00:00 2001 From: flatplum Date: Sat, 27 Sep 2025 00:16:20 +1000 Subject: [PATCH 6/9] fix: correct padding for apply page on mobile devices Padding was missing on the right for the apply banner. --- src/routes/Apply.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Apply.css b/src/routes/Apply.css index 0185f6b..d97c749 100644 --- a/src/routes/Apply.css +++ b/src/routes/Apply.css @@ -36,7 +36,7 @@ .apply-banner-grid { display: flex; flex-wrap: wrap; - padding: 0 min(5%, 60px) 0 0; + padding: 0 min(5%, 60px); justify-content: center; } From 3b668c2a57c1cbaf33aa7782330bc90f5b6211e2 Mon Sep 17 00:00:00 2001 From: flatplum Date: Mon, 15 Sep 2025 22:24:34 +1000 Subject: [PATCH 7/9] chore: add eslint-config-google as dev-dep --- package-lock.json | 14 ++++++++++++++ package.json | 1 + 2 files changed, 15 insertions(+) diff --git a/package-lock.json b/package-lock.json index f2d9bb8..870a026 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,7 @@ "@vitejs/plugin-react": "^3.1.0", "autoprefixer": "^10.4.16", "eslint": "^8.51.0", + "eslint-config-google": "^0.14.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.1", "eslint-plugin-react": "^7.33.2", @@ -4768,6 +4769,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-google": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", + "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, "node_modules/eslint-config-prettier": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", diff --git a/package.json b/package.json index b98f448..74081f6 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "@vitejs/plugin-react": "^3.1.0", "autoprefixer": "^10.4.16", "eslint": "^8.51.0", + "eslint-config-google": "^0.14.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.1", "eslint-plugin-react": "^7.33.2", From d14a1c776e15f3fd4c4ad52960ad99bf0fe40f35 Mon Sep 17 00:00:00 2001 From: flatplum Date: Mon, 15 Sep 2025 22:26:19 +1000 Subject: [PATCH 8/9] chore: fix eslint problems across project Todo: - a large number of eslint errors remain --- functions/index.js | 2 +- src/components/Button/HMButton.tsx | 2 +- src/routes/Events.tsx | 8 ++++---- src/routes/MeetTheTeam.tsx | 8 ++++---- src/routes/Sponsors.tsx | 8 ++++---- src/routes/eventPages/GameComplete.tsx | 2 +- src/routes/eventPages/OWeek.tsx | 8 ++++---- src/routes/eventPages/OWeekGame.tsx | 6 +++--- src/services/cleanEmails.ts | 4 ++-- src/services/firestoreServices.ts | 2 +- src/services/linksPageServices.ts | 2 +- src/services/meetTeamServices.ts | 2 +- src/services/tournamentServices.ts | 2 +- 13 files changed, 28 insertions(+), 28 deletions(-) diff --git a/functions/index.js b/functions/index.js index c82e7fb..42506d3 100644 --- a/functions/index.js +++ b/functions/index.js @@ -283,4 +283,4 @@ function createPageProperties(pageData) { // await getFirestore().collection("riserData").add(result); // return { text: "hi" }; -// }); \ No newline at end of file +// }); diff --git a/src/components/Button/HMButton.tsx b/src/components/Button/HMButton.tsx index e94594b..8b69f94 100644 --- a/src/components/Button/HMButton.tsx +++ b/src/components/Button/HMButton.tsx @@ -18,7 +18,7 @@ const HMButton = ({ text, color, style, span, link }: Props) => { style = 'disabled'; } - let key = { + const key = { filled: { primary: ['bg-yellow-500'], secondary: ['bg-blue-500'], diff --git a/src/routes/Events.tsx b/src/routes/Events.tsx index 7744bdf..839a565 100644 --- a/src/routes/Events.tsx +++ b/src/routes/Events.tsx @@ -60,14 +60,14 @@ const Events = () => { // Animations const scrollRef = useRef(null); - let { scrollYProgress } = useScroll({ + const { scrollYProgress } = useScroll({ target: scrollRef, offset: ["start start", "end start"], }); - let y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); - let opacityValue = useTransform(scrollYProgress, [0, 0.8], ["100%", "0%"]); - let scaleValue = useTransform(scrollYProgress, [0, 0.8], ["1", "0.9"]); + const y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); + const opacityValue = useTransform(scrollYProgress, [0, 0.8], ["100%", "0%"]); + const scaleValue = useTransform(scrollYProgress, [0, 0.8], ["1", "0.9"]); return (
diff --git a/src/routes/MeetTheTeam.tsx b/src/routes/MeetTheTeam.tsx index 23fba80..f4f2b32 100644 --- a/src/routes/MeetTheTeam.tsx +++ b/src/routes/MeetTheTeam.tsx @@ -108,14 +108,14 @@ const MeetTheTeam = () => { // Animations const scrollRef = useRef(null); - let { scrollYProgress } = useScroll({ + const { scrollYProgress } = useScroll({ target: scrollRef, offset: ["start start", "end start"], }); - let y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); - let opacityValue = useTransform(scrollYProgress, [0, 0.7], ["100%", "0%"]); - let scaleValue = useTransform(scrollYProgress, [0, 0.8], ["1", "0.9"]); + const y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); + const opacityValue = useTransform(scrollYProgress, [0, 0.7], ["100%", "0%"]); + const scaleValue = useTransform(scrollYProgress, [0, 0.8], ["1", "0.9"]); return (
diff --git a/src/routes/Sponsors.tsx b/src/routes/Sponsors.tsx index 2273860..a4b3cd2 100644 --- a/src/routes/Sponsors.tsx +++ b/src/routes/Sponsors.tsx @@ -96,14 +96,14 @@ const Sponsors = () => { // Animations const scrollRef = useRef(null); - let { scrollYProgress } = useScroll({ + const { scrollYProgress } = useScroll({ target: scrollRef, offset: ["start start", "end start"], }); - let y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); - let opacityValue = useTransform(scrollYProgress, [0, 0.7], ["100%", "0%"]); - let scaleValue = useTransform(scrollYProgress, [0, 0.8], ["1", "0.9"]); + const y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); + const opacityValue = useTransform(scrollYProgress, [0, 0.7], ["100%", "0%"]); + const scaleValue = useTransform(scrollYProgress, [0, 0.8], ["1", "0.9"]); return (
diff --git a/src/routes/eventPages/GameComplete.tsx b/src/routes/eventPages/GameComplete.tsx index 04708b6..5bd3f7f 100644 --- a/src/routes/eventPages/GameComplete.tsx +++ b/src/routes/eventPages/GameComplete.tsx @@ -6,7 +6,7 @@ import { RiserOutputData } from "./RiserGame.model"; import { useLocation, useNavigate } from "react-router-dom"; const GameComplete = () => { - let data: RiserOutputData = useLocation().state; + const data: RiserOutputData = useLocation().state; const navigate = useNavigate(); diff --git a/src/routes/eventPages/OWeek.tsx b/src/routes/eventPages/OWeek.tsx index 525ea29..eab52a5 100644 --- a/src/routes/eventPages/OWeek.tsx +++ b/src/routes/eventPages/OWeek.tsx @@ -82,13 +82,13 @@ export default function RiserGame() { // Animations const scrollRef = useRef(null); - let { scrollYProgress } = useScroll({ + const { scrollYProgress } = useScroll({ target: scrollRef, offset: ["start start", "end start"], }); - let y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); - let opacityValue = useTransform(scrollYProgress, [0, 0.6], ["100%", "0%"]); - let scaleValue = useTransform(scrollYProgress, [0, 0.9], ["1", "0.9"]); + const y = useTransform(scrollYProgress, [0, 1], ["0%", "80%"]); + const opacityValue = useTransform(scrollYProgress, [0, 0.6], ["100%", "0%"]); + const scaleValue = useTransform(scrollYProgress, [0, 0.9], ["1", "0.9"]); // Form Field Values const [firstName, setFirstName] = useState(""); diff --git a/src/routes/eventPages/OWeekGame.tsx b/src/routes/eventPages/OWeekGame.tsx index a00ea97..a694246 100644 --- a/src/routes/eventPages/OWeekGame.tsx +++ b/src/routes/eventPages/OWeekGame.tsx @@ -7,7 +7,7 @@ import { RiserGameModel, RiserOutputData, RiserUserInput } from "./RiserGame.mod const OWeekGame = () => { const navigate = useNavigate(); - let data: RiserUserInput = useLocation().state; + const data: RiserUserInput = useLocation().state; // If data is empty useEffect(() => { @@ -23,7 +23,7 @@ const OWeekGame = () => { const [result, setResult] = useState([]); - let userGameData: RiserGameModel = { + const userGameData: RiserGameModel = { name: data.name, email: data.email, studentID: data.studentID, @@ -75,7 +75,7 @@ const OWeekGame = () => { alert("Oops! You went over 2024! Your score is disqualified"); result.push(0); } else { - let tempResult = result; + const tempResult = result; tempResult.push(time); setResult(tempResult); console.log(result); diff --git a/src/services/cleanEmails.ts b/src/services/cleanEmails.ts index c5566cf..3e026ba 100644 --- a/src/services/cleanEmails.ts +++ b/src/services/cleanEmails.ts @@ -1,9 +1,9 @@ export default function cleanEmail(email: string): string { // Define the regex pattern - var pattern = /\.(?=.*@)|\+.*(?=@)/g; + const pattern = /\.(?=.*@)|\+.*(?=@)/g; // Use replace() method to replace matches with an empty string - var outputString = email.replace(pattern, ""); + const outputString = email.replace(pattern, ""); return outputString; } diff --git a/src/services/firestoreServices.ts b/src/services/firestoreServices.ts index 0fecb5c..8ccb1ae 100644 --- a/src/services/firestoreServices.ts +++ b/src/services/firestoreServices.ts @@ -58,7 +58,7 @@ export async function isUniqueEmail(id: string): Promise { export async function getRiserLeaderboard(): Promise { const leaderboardRef = collection(db, "riserData"); - let leaderboardData: RankEntry[] = []; + const leaderboardData: RankEntry[] = []; try { // Add orderby time when firebase functions implements feature diff --git a/src/services/linksPageServices.ts b/src/services/linksPageServices.ts index d20b7d2..3cf1a2b 100644 --- a/src/services/linksPageServices.ts +++ b/src/services/linksPageServices.ts @@ -5,7 +5,7 @@ import { LinkItemProps } from "../features/LinkItem/LinkItemProps"; export async function getLinksPage(): Promise { try { - let result = await httpsCallable(functions, "getLinksPage")(); + const result = await httpsCallable(functions, "getLinksPage")(); // Storing result to localStorage for faster load times for next visits localStorage.setItem("links", JSON.stringify(result)); diff --git a/src/services/meetTeamServices.ts b/src/services/meetTeamServices.ts index 166f976..507260a 100644 --- a/src/services/meetTeamServices.ts +++ b/src/services/meetTeamServices.ts @@ -5,7 +5,7 @@ import { Member } from "../features/TeamComponent/TeamComponent.model"; export async function getMeetTheTeam(): Promise { try { - let result = await httpsCallable(functions, "getMeetTheTeam")(); + const result = await httpsCallable(functions, "getMeetTheTeam")(); return result.data as Member[]; } catch (e) { console.log(e); diff --git a/src/services/tournamentServices.ts b/src/services/tournamentServices.ts index 8b95124..9e40cd0 100644 --- a/src/services/tournamentServices.ts +++ b/src/services/tournamentServices.ts @@ -5,7 +5,7 @@ import { TournamentBracketProps } from "../features/TournamentBracket/Tournament export async function getHackiethonBrackets(): Promise { try { - let result = await httpsCallable(functions, "getHackiethonBrackets")(); + const result = await httpsCallable(functions, "getHackiethonBrackets")(); return result.data as TournamentBracketProps[]; } catch (e) { console.log(e); From 379e5976a0785d1ebf9f9bd3c5784221b548ff56 Mon Sep 17 00:00:00 2001 From: flatplum Date: Sun, 28 Sep 2025 21:44:56 +1000 Subject: [PATCH 9/9] fix: adjust subtitle size on apply page to better suit mobile devices --- src/routes/Apply.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Apply.css b/src/routes/Apply.css index d97c749..42d6c57 100644 --- a/src/routes/Apply.css +++ b/src/routes/Apply.css @@ -61,6 +61,6 @@ } .apply-banner-title { - font-size: 3rem !important; + font-size: 2.7rem !important; } } \ No newline at end of file