diff --git a/pages/[id]/HackerInfo.js b/pages/[id]/HackerInfo.js index 4d3ea4f..667e0a5 100644 --- a/pages/[id]/HackerInfo.js +++ b/pages/[id]/HackerInfo.js @@ -1,7 +1,7 @@ import { useState, useEffect, useRef, useMemo } from 'react' import styled from 'styled-components' import { CSVLink } from 'react-csv' -import { getHackathonPaths, getHackathons, getHackerInfo } from '../../utility/firebase' +import { getHackathonPaths, getHackathons, getHackerInfo, getRaffleWheelEmails } from '../../utility/firebase' import Page from '../../components/page' import Button from '../../components/button' import Menu from '../../components/menu' @@ -102,6 +102,7 @@ const Calculate = styled.select` export default function HackerInfo({ id, hackathons }) { const [unfilteredData, setUnfilteredData] = useState([]) const [filteredData, setFilteredData] = useState([]) + const [raffleData, setRaffleData] = useState([]) const [currTable, setCurrTable] = useState('Applicants') const [unfilteredTableKeys, setUnfilteredTableKeys] = useState([]) const [filteredTableKeys, setFilteredTableKeys] = useState([]) @@ -122,6 +123,7 @@ export default function HackerInfo({ id, hackathons }) { const [filter, setFilter] = useState({}) const [calculate, setCalculate] = useState({}) const downloadLink = useRef() + const raffleDownloadLink = useRef() const [uniqueEvents, setUniqueEvents] = useState([]) const [selectedEvents, setSelectedEvents] = useState([]) @@ -229,6 +231,7 @@ export default function HackerInfo({ id, hackathons }) { }) } + const HackerInfoRow = ({ data }) => { return ( @@ -329,6 +332,22 @@ export default function HackerInfo({ id, hackathons }) { + + {/* TODO raffle */} + + + + + + diff --git a/utility/firebase.js b/utility/firebase.js index dfd7f79..d53c10e 100644 --- a/utility/firebase.js +++ b/utility/firebase.js @@ -754,6 +754,146 @@ export const getCSVData = async () => { return CSV } + +// export const getRaffleNumbers = async () => { +// const apps = await db +// .collection('Hackathons') +// .doc(HackerEvaluationHackathon) +// .collection('Applicants') +// .where('dayOf.checkedIn', '==', true) +// .get(); + +// // Use Promise.all to handle asynchronous logic for each applicant +// const CSV = await Promise.all( +// apps.docs.map(async (doc) => { +// const { +// basicInfo: { +// legalFirstName, +// legalLastName, +// preferredName, +// email, +// phoneNumber, +// }, +// dayOf, +// } = doc.data(); + +// // Ensure dayOf.events exists before proceeding +// if (!dayOf?.events || !Array.isArray(dayOf.events)) return null; + +// // Fetch event documents for each event in dayOf.events +// const dayOfDocsPromises = dayOf.events.map((e) => +// db +// .collection('Hackathons') +// .doc(HackerEvaluationHackathon) +// .collection('DayOf') +// .doc(e.eventId) +// .get() +// ); + +// // Wait for all dayOfDocs to resolve +// const dayOfDocs = await Promise.all(dayOfDocsPromises); + +// // Calculate total points from events +// const totalPoints = dayOfDocs.reduce( +// (acc, curr) => acc + Number(curr.data()?.points ?? 0), +// 0 +// ); + +// // Calculate raffle entries based on total points +// const totalRaffleEntries = Math.floor(totalPoints / 15); + +// return [ +// legalFirstName, +// legalLastName, +// preferredName, +// email, +// phoneNumber, +// totalPoints.toString(), +// totalRaffleEntries.toString(), +// ]; +// }) +// ); + +// // Filter out null results (in case any docs didn't have events or checked-in status) +// const validCSV = CSV.filter((entry) => entry !== null); + +// // Add headers to CSV +// validCSV.unshift([ +// 'First Name', +// 'Last Name', +// 'Preferred Name', +// 'Email', +// 'Phone Number', +// 'Total Points', +// 'Raffle Entries', +// ]); + +// console.log(validCSV); + +// return validCSV; +// }; + + +export const getRaffleWheelEmails = async () => { + const apps = await db + .collection('Hackathons') + .doc(HackerEvaluationHackathon) + .collection('Applicants') + .where('dayOf.checkedIn', '==', true) + .get(); + + // Create an array to hold all rows for the raffle entries + const raffleEntries = []; + + // Iterate over the documents and calculate raffle entries for each user + for (const doc of apps.docs) { + const { + basicInfo: { email }, + dayOf, + } = doc.data(); + + if (!dayOf?.events || !Array.isArray(dayOf.events)) continue; + + // Fetch event documents for each event in dayOf.events + const dayOfDocsPromises = dayOf.events.map((e) => + db + .collection('Hackathons') + .doc(HackerEvaluationHackathon) + .collection('DayOf') + .doc(e.eventId) + .get() + ); + + const dayOfDocs = await Promise.all(dayOfDocsPromises); + + // Calculate total points from events + // +15 is from check in : cmd-f 2025 + const totalPoints = 15 + dayOfDocs.reduce( + (acc, curr) => acc + Number(curr.data()?.points ?? 0), + 0 + ); + + // Calculate raffle entries based on total points + const totalRaffleEntries = Math.floor(totalPoints / 15); + + // Add the user's email multiple times based on raffle entries + for (let i = 0; i < totalRaffleEntries; i++) { + raffleEntries.push(email); // Repeat the email for each raffle entry + } + } + + // Prepare CSV with only the "Raffle Entries" column + const CSV = [ + ['Raffle Entries'], + ...raffleEntries.map(email => [email]), // Convert to array format for CSV + ]; + + console.log(CSV); + + return CSV; +}; + + export const getResumeFile = async userId => { try { const ref = storage.ref(`applicantResumes/${userId}`)