-
nwHacks 2024 is Western Canada’s largest 24 hour hackathon!
+
+ cmd-f 2024 is Western Canada's largest hackathon celebrating underrepresented genders in
+ tech!
+
Registration status: {hackerStatuses()[hackerStatus]?.cardText}
diff --git a/src/components/ApplicationForm/BasicInfo.js b/src/components/ApplicationForm/BasicInfo.js
index 35ee7878..ac3417a4 100644
--- a/src/components/ApplicationForm/BasicInfo.js
+++ b/src/components/ApplicationForm/BasicInfo.js
@@ -1,13 +1,15 @@
import React from 'react'
import styled from 'styled-components'
-import majors from '../../containers/Application/data/majors.json'
import schools from '../../containers/Application/data/schools.json'
import {
+ CULTURAL_BG_OPTIONS,
DIETARY_RESTRICTION_OPTIONS,
- ETHNICITY_OPTIONS,
+ MAJOR_OPTIONS,
PRONOUN_OPTIONS,
+ RACE_OPTIONS,
} from '../../utility/Constants'
import { applyCustomSort, creatableDropdownValue, findElement } from '../../utility/utilities'
+import { TextArea } from '../Input'
import Dropdown from '../Input/Dropdown'
import Select from '../Input/Select'
import { TextInput } from '../Input/TextInput'
@@ -24,11 +26,24 @@ import { FormSpacing, SubHeading } from './'
const genderOptions = [
{ value: 'female', label: 'Woman' },
{ value: 'male', label: 'Man' },
- { value: 'non-binary', label: 'Non-binary' },
+ { value: 'non-binary', label: 'Non-binary/Genderqueer/Gender non-conforming' },
+ { value: 'two-spirit', label: 'Two-Spirit' },
{ value: 'other', label: 'Prefer to self-describe' },
{ value: 'prefer not to answer', label: 'Prefer not to answer' },
]
+const indigenousIdentificationOptions = [
+ { value: 'yes', label: 'Yes' },
+ { value: 'no', label: 'No' },
+ { value: 'prefer not to answer', label: 'Prefer not to answer' },
+]
+
+const canadianStatusOptions = [
+ { value: 'international student', label: 'International Student' },
+ { value: 'canadian/on PR student', label: 'Canadian/on PR Student' },
+ { value: 'other', label: 'Other (Please Describe)' },
+]
+
const educationOptions = [
{ value: 'less than high school', label: 'Less than Secondary / High School' },
{ value: 'high school', label: 'Secondary/High school' },
@@ -52,13 +67,12 @@ const educationOptions = [
{ value: 'prefer not to answer', label: 'Prefer not to answer' },
]
-// Removed as of nwHacks 2024
-// const identifyAsUnderrepresentedOptions = [
-// { value: 'yes', label: 'Yes' },
-// { value: 'no', label: 'No' },
-// { value: 'unsure', label: 'Unsure' },
-// { value: 'preferNotToAnswer', label: 'Prefer not to answer' },
-// ]
+const identifyAsUnderrepresentedOptions = [
+ { value: 'yes', label: 'Yes' },
+ { value: 'no', label: 'No' },
+ { value: 'unsure', label: 'Unsure' },
+ { value: 'preferNotToAnswer', label: 'Prefer not to answer' },
+]
const academicYearOptions = [
{ value: 'Secondary/High School', label: 'Secondary/High School' },
@@ -67,6 +81,7 @@ const academicYearOptions = [
{ value: '3rd year', label: '3rd year' },
{ value: '4th year', label: '4th year' },
{ value: '5th year+', label: '5th year+' },
+ { value: 'New Grad', label: 'New Grad (<= 1 year)' },
{ value: 'Graduate school', label: 'Graduate school' },
]
@@ -362,6 +377,10 @@ const StyledTextInput = styled(TextInput)`
margin: 0.5em 1em 1em 0;
`
+const StyledTextArea = styled(TextArea)`
+ margin: 1em 0;
+`
+
// form part 1
export default ({ refs, errors, formInputs, onChange }) => (
<>
@@ -381,52 +400,47 @@ export default ({ refs, errors, formInputs, onChange }) => (
onChange({
- firstName: e.target.value,
+ legalFirstName: e.target.value,
})
}
- customRef={refs['firstNameRef']}
+ customRef={refs['legalFirstNameRef']}
/>
onChange({
- middleName: e.target.value,
+ legalMiddleName: e.target.value,
})
}
/>
onChange({
- lastName: e.target.value,
+ legalLastName: e.target.value,
})
}
- customRef={refs['lastNameRef']}
+ customRef={refs['legalLastNameRef']}
/>
question 02
-
- What is your preferred name?
-
-
+ What is your preferred name?
onChange({
preferredName: e.target.value,
@@ -442,7 +456,7 @@ export default ({ refs, errors, formInputs, onChange }) => (
What is your current age?
- We accept hackers currently in high school but require this for consent purposes.
+ We accept hackers currently in high school but require this information for consent purposes.
{errors?.ageByHackathon && {errors?.ageByHackathon} }
(
question 06
-
- {formInputs.educationLevel === 'high school'
- ? 'What do you plan on studying?'
- : 'What is your current or intended major?'}
-
-
- Enter your intended/current major, or unknown
- {errors?.major && {errors?.major} }
- `${inputValue}`}
- label={formInputs.major}
- value={creatableDropdownValue(majors, 'label', formInputs.major)}
- onChange={e =>
- onChange({
- major: e.label,
- })
- }
- emptySearchDefaultOption="Start typing to search"
- canCreateNewOption
- isValid={!errors?.major}
- customRef={refs['majorRef']}
- />
-
-
-
- question 07
What is your level of study?
@@ -589,51 +574,51 @@ export default ({ refs, errors, formInputs, onChange }) => (
- question 08
+ question 07
- What is your (expected) graduation year?
+ What is your current academic year?
- {errors?.graduation && {errors?.graduation} }
+ {errors?.academicYear && {errors?.academicYear} }
onChange({
- graduation: inputValue.value,
+ academicYear: inputValue.value,
})
}
- isValid={!errors?.graduation}
- customRef={refs['graduationRef']}
+ isValid={!errors?.academicYear}
+ customRef={refs['academicYearRef']}
/>
- question 09
+ question 08
- What is your current academic year?
+ What is your (expected) graduation year?
- {errors?.academicYear && {errors?.academicYear} }
+ {errors?.graduation && {errors?.graduation} }
onChange({
- academicYear: inputValue.value,
+ graduation: inputValue.value,
})
}
- isValid={!errors?.academicYear}
- customRef={refs['academicYearRef']}
+ isValid={!errors?.graduation}
+ customRef={refs['graduationRef']}
/>
- question 10
+ question 09
What is your country of residence?
@@ -641,7 +626,7 @@ export default ({ refs, errors, formInputs, onChange }) => (
{errors?.countryOfResidence && {errors?.countryOfResidence} }
@@ -656,11 +641,15 @@ export default ({ refs, errors, formInputs, onChange }) => (
- question 11
+ question 10
Dietary restrictions
+
+ Please answer to the best of your abilities so we are able to accommodate your needs! Note
+ that we may be unable to provide accommodations if you do not answer this accurately.
+
{errors?.dietaryRestriction && {errors?.dietaryRestriction} }
{formInputs &&
applyCustomSort(
@@ -696,7 +685,7 @@ export default ({ refs, errors, formInputs, onChange }) => (
)}
-
+ {/*
question 12
Will you be 19 years of age or older by January 20th, 2024?
@@ -716,21 +705,13 @@ export default ({ refs, errors, formInputs, onChange }) => (
checked={formInputs.willBeAgeOfMajority === false}
onChange={() => onChange({ willBeAgeOfMajority: false })}
/>
-
+ */}
- Optional Questions
-
- The following questions are completely optional and do not affect your application as a
- hacker.
-
-
-
- {/* Removed as of nwHacks 2024 */}
- {/*
- question 13
+ question 11
Do you identify as part of an underrepresented gender in the technology industry?
+
{errors?.identifyAsUnderrepresented && (
{errors?.identifyAsUnderrepresented}
@@ -752,10 +733,18 @@ export default ({ refs, errors, formInputs, onChange }) => (
isValid={!errors?.identifyAsUnderrepresented}
customRef={refs['identifyAsUnderrepresentedRef']}
/>
- */}
+
- question 13
+ Optional Questions
+
+ The following questions are completely optional and do not affect your application as a
+ hacker.
+
+
+
+
+ question 12
What are your pronouns?
{/* {errors?.pronouns && {errors?.pronouns} } */}
{formInputs &&
@@ -792,8 +781,8 @@ export default ({ refs, errors, formInputs, onChange }) => (
- question 14
- What gender do you identify as?
+ question 13
+ What is your gender identity?
{/* {errors?.gender && {errors?.gender} } */}
(
)}
+
+ question 14
+ Do you have trans experience?
+ onChange({ haveTransExperience: true })}
+ customRef={refs['haveTransExperienceRef']}
+ />
+ onChange({ haveTransExperience: false })}
+ />
+
+
+ {/*
+ question 14
+
+ {formInputs.educationLevel === 'high school'
+ ? 'What do you plan on studying?'
+ : 'What is your current or intended major?'}
+
+ Enter your intended/current major, or unknown
+ {errors?.major && {errors?.major} }
+ `${inputValue}`}
+ label={formInputs.major}
+ value={creatableDropdownValue(majors, 'label', formInputs.major)}
+ onChange={e =>
+ onChange({
+ major: e.label,
+ })
+ }
+ emptySearchDefaultOption="Start typing to search"
+ canCreateNewOption
+ isValid={true}
+ customRef={refs['majorRef']}
+ />
+ */}
+
question 15
- What is your race/ethnicity?
- {/* {errors?.ethnicity && {errors?.ethnicity} } */}
+
+ {formInputs.educationLevel === 'high school'
+ ? 'What do you plan on studying?'
+ : 'What is your current or intended major?'}
+
{formInputs &&
- applyCustomSort(Object.entries(formInputs?.ethnicity), Object.keys(ETHNICITY_OPTIONS)).map(
+ applyCustomSort(Object.entries(formInputs?.major), Object.keys(MAJOR_OPTIONS)).map(
([key, val]) => (
onChange({
- ethnicity: { ...formInputs.ethnicity, [key]: !val },
+ major: { ...formInputs.major, [key]: !val },
})
}
- customRef={refs['ethnicityRef']}
+ customRef={refs['majorRef']}
/>
)
)}
- {formInputs?.ethnicity?.other && (
+ {formInputs?.major?.other && (
onChange({
- otherEthnicity: e.target.value,
+ otherMajor: e.target.value,
})
}
/>
)}
- {/* ADD legally authorized to work in Canada */}
+ question 16
+ Which race(s) best describes you?
+ {formInputs &&
+ applyCustomSort(Object.entries(formInputs?.race), Object.keys(RACE_OPTIONS)).map(
+ ([key, val]) => (
+
+ onChange({
+ race: { ...formInputs.race, [key]: !val },
+ })
+ }
+ customRef={refs['raceRef']}
+ />
+ )
+ )}
+
+ {formInputs?.race?.other && (
+
+ onChange({
+ otherRace: e.target.value,
+ })
+ }
+ />
+ )}
+
+
+
+ question 17
+ Do you identify as Indigenous/First Nations?
+
+ onChange({
+ indigenousIdentification: e.value,
+ })
+ }
+ isValid={true}
+ customRef={refs['indigenousIdentificationRef']}
+ />
+ {formInputs.indigenousIdentification === 'yes' && (
+
+ onChange({
+ specifiedIndigenousIdentification: e.target.value,
+ })
+ }
+ />
+ )}
+
+
+
+ question 18
+ What is your cultural background?
+ {formInputs &&
+ applyCustomSort(
+ Object.entries(formInputs?.culturalBackground),
+ Object.keys(CULTURAL_BG_OPTIONS)
+ ).map(([key, val]) => (
+
+ onChange({
+ culturalBackground: { ...formInputs.culturalBackground, [key]: !val },
+ })
+ }
+ customRef={refs['culturalBackgroundRef']}
+ />
+ ))}
+
+ {formInputs?.culturalBackground?.other && (
+
+ onChange({
+ otherCulturalBackground: e.target.value,
+ })
+ }
+ />
+ )}
+ {formInputs?.culturalBackground?.firstNationsOrIndigenous && (
+
+ onChange({
+ otherFirstNationsOrIndigenous: e.target.value,
+ })
+ }
+ />
+ )}
+
+
+ {/*
question 16
Are you legally authorized to work in Canada?
(
checked={formInputs.isAuthorizedToWorkInCanada === false}
onChange={() => onChange({ isAuthorizedToWorkInCanada: false })}
/>
+ */}
+
+
+ question 19
+ What is your Canadian status?
+
+ Note: this does not affect your application and is only collected for potential employers at
+ the event.{' '}
+
+
+ onChange({
+ canadianStatus: inputValue.value,
+ })
+ }
+ isValid={true}
+ customRef={refs['canadianStatusRef']}
+ />
+ {formInputs.canadianStatus === 'other' && (
+
+ onChange({
+ otherCanadianStatus: e.target.value,
+ })
+ }
+ />
+ )}
+
+
+
+ question 20
+ Do you have any visible or invisible disabilities?
+
+ onChange({
+ disability: val,
+ })
+ }
+ customRef={refs['disabilityRef']}
+ />
>
)
diff --git a/src/components/ApplicationForm/HackathonInfo.js b/src/components/ApplicationForm/HackathonInfo.js
index c5bf48e6..2143a8d1 100644
--- a/src/components/ApplicationForm/HackathonInfo.js
+++ b/src/components/ApplicationForm/HackathonInfo.js
@@ -7,25 +7,46 @@ export default () => {
<>
- Western Canada’s largest hackathon is here! {''}
-
- 🎉
-
+ nwPlus is proud to present cmd-f 2024 - Western Canada's largest hackathon celebrating
+ underrepresented genders in tech.
- Join us on January 20-21, 2024, for a thrilling 24-hour hackathon of innovation and
- collaboration. Immerse yourself in a dynamic atmosphere with engaging workshops and
- events, and seize the chance to showcase your project live in front of a distinguished
- panel of judges and a vibrant community of hackers from across North America. Apply now
- and explore the exciting opportunities that await you at nwHacks 2024!{' '}
-
- 🚀
+ We are beyond excited to host the 6th iteration of our hackathon on March 9-10, 2024!
+ cmd-f is a hackathon focused on addressing gender inequality in technology. Our main
+ purpose is to create a safe and dedicated space for gender minorities to hack together.
+ We’re trying to create access for people who have historically been excluded. We encourage
+ participation from women, trans, non-binary, Two-Spirit and gender diverse people. Thus,
+ cmd-f is only open to individuals who identify as an underrepresented gender in
+ technology. Please make sure your participation in this event is aligned with the
+ intentions of the event. We also ask all participants who attend to trust that everyone
+ attending is meant to be here.
+
+
+
+ 🌱
+
+ Time: March 9-10, 2024
+
+
+
+ 🌱
+ Location: Life Sciences Institute, UBC
+
+
+ Hacker application deadline: February 22, 2024
+
+
+ If you have any questions, feel free to reach out to the team at{' '}
+
+ cmd-f@nwplus.io
+
+ !
Learn more at{' '}
-
- https://nwhacks.io
+
+ cmd-f.nwplus.io
!
diff --git a/src/components/ApplicationForm/Questionnaire.js b/src/components/ApplicationForm/Questionnaire.js
index f7d1b1ac..b5c2b211 100644
--- a/src/components/ApplicationForm/Questionnaire.js
+++ b/src/components/ApplicationForm/Questionnaire.js
@@ -1,17 +1,15 @@
import React from 'react'
-import styled from 'styled-components'
-import { Dropdown, Select, TextInput } from '../../components/Input'
+import { Select, TextInput } from '../../components/Input'
import { ErrorMessage, QuestionHeading, ErrorSpan as Required } from '../../components/Typography'
import { copyText } from '../../utility/Constants'
-import { findElement } from '../../utility/utilities'
import { CenteredH1 } from '../Typography'
import { FormSpacing, SubHeading } from './'
-const StyledDropdown = styled(Dropdown)`
- .react-select__control {
- margin: 0 0 1em;
- }
-`
+// const StyledDropdown = styled(Dropdown)`
+// .react-select__control {
+// margin: 0 0 1em;
+// }
+// `
// const StyledTextInput = styled(TextInput)`
// margin: 0.5em 1em 1em 0;
@@ -25,7 +23,7 @@ export const options = [
{ value: '4', label: 'Word of mouth' },
{ value: '5', label: 'Club newsletter' },
{ value: '6', label: 'Faculty newsletter' },
- { value: '7', label: 'Professor/in class' },
+ { value: '7', label: 'Professors/In Class' },
{ value: '8', label: 'Other' },
]
@@ -42,13 +40,14 @@ export default ({ errors, formInputs, onChange }) => {
- Question 23
+ Question 29
How did you hear about {copyText.hackathonName}?
{errors?.engagementSource && {errors?.resume} }
- {
})
}
isValid
+ /> */}
+
+
+ onChange({
+ ...formInputs,
+ engagementSource: {
+ ...formInputs.engagementSource,
+ attendedPreviously: !formInputs.engagementSource.attendedPreviously,
+ },
+ })
+ }
+ />
+
+ onChange({
+ ...formInputs,
+ engagementSource: {
+ ...formInputs.engagementSource,
+ MLH: !formInputs.engagementSource.MLH,
+ },
+ })
+ }
+ />
+
+ onChange({
+ ...formInputs,
+ engagementSource: {
+ ...formInputs.engagementSource,
+ instagram: !formInputs.engagementSource.instagram,
+ },
+ })
+ }
/>
- {formInputs.engagementSource === 'Other' && (
+
+ onChange({
+ ...formInputs,
+ engagementSource: {
+ ...formInputs.engagementSource,
+ facebook: !formInputs.engagementSource.facebook,
+ },
+ })
+ }
+ />
+
+ onChange({
+ ...formInputs,
+ engagementSource: {
+ ...formInputs.engagementSource,
+ linkedIn: !formInputs.engagementSource.linkedIn,
+ },
+ })
+ }
+ />
+
+ onChange({
+ ...formInputs,
+ engagementSource: {
+ ...formInputs.engagementSource,
+ website: !formInputs.engagementSource.website,
+ },
+ })
+ }
+ />
+
+ onChange({
+ ...formInputs,
+ engagementSource: {
+ ...formInputs.engagementSource,
+ wordOfMouth: !formInputs.engagementSource.wordOfMouth,
+ },
+ })
+ }
+ />
+
+ onChange({
+ ...formInputs,
+ engagementSource: {
+ ...formInputs.engagementSource,
+ nwPlusNewsletter: !formInputs.engagementSource.nwPlusNewsletter,
+ },
+ })
+ }
+ />
+
+ onChange({
+ ...formInputs,
+ engagementSource: {
+ ...formInputs.engagementSource,
+ facultyNewsletter: !formInputs.engagementSource.facultyNewsletter,
+ },
+ })
+ }
+ />
+
+ onChange({
+ ...formInputs,
+ engagementSource: {
+ ...formInputs.engagementSource,
+ professorInClass: !formInputs.engagementSource.professorInClass,
+ },
+ })
+ }
+ />
+
+ onChange({
+ ...formInputs,
+ engagementSource: {
+ ...formInputs.engagementSource,
+ other: !formInputs.engagementSource.other,
+ },
+ })
+ }
+ />
+
+ {formInputs.engagementSource.other && (
onChange({
@@ -79,7 +233,7 @@ export default ({ errors, formInputs, onChange }) => {
- Question 24
+ Question 30
Have you previously attended any nwPlus organized events? (select all that apply)
@@ -168,6 +322,20 @@ export default ({ errors, formInputs, onChange }) => {
})
}
/>
+
+ onChange({
+ ...formInputs,
+ eventsAttended: {
+ ...formInputs.eventsAttended,
+ nwHacks2024: !formInputs.eventsAttended.nwHacks2024,
+ },
+ })
+ }
+ />
(
)
+const getMajors = obj => Object.keys(obj).filter(key => obj[key])
+const getEngagementSources = obj => Object.keys(obj).filter(key => obj[key])
+const getPronouns = obj => Object.keys(obj).filter(key => obj[key])
+const getRaces = obj => Object.keys(obj).filter(key => obj[key])
+const getCulturalBackgrounds = obj => Object.keys(obj).filter(key => obj[key])
const getDietaryRestrictions = obj => Object.keys(obj).filter(key => obj[key])
const getEvents = obj => Object.keys(obj).filter(key => obj[key])
const getContribution = obj => Object.keys(obj).filter(key => obj[key])
@@ -97,6 +107,32 @@ export default ({ formInputs, handleEdit, onChange }) => {
const gender = capitalizeFirstLetter(formInputs.basicInfo.gender)
const countryOfResidence = capitalizeFirstLetter(formInputs.basicInfo.countryOfResidence)
const educationLevel = capitalizeFirstLetter(formInputs.basicInfo.educationLevel)
+ let identifyAsUnderrepresented = capitalizeFirstLetter(
+ formInputs.basicInfo.identifyAsUnderrepresented
+ )
+ if (identifyAsUnderrepresented === 'PreferNotToAnswer') {
+ identifyAsUnderrepresented = 'Prefer not to answer'
+ }
+
+ let canadianStatus = formInputs.basicInfo.canadianStatus
+
+ if (canadianStatus === 'other') {
+ canadianStatus = formInputs.basicInfo.otherCanadianStatus
+ ? formInputs.basicInfo.specifiedIndigenousIdentification
+ : 'Other Canadian Status'
+ } else {
+ canadianStatus = capitalizeFirstLetter(formInputs.basicInfo.canadianStatus)
+ }
+
+ let indigenousIdentification = capitalizeFirstLetter(
+ formInputs.basicInfo.indigenousIdentification
+ )
+
+ if (indigenousIdentification === 'Yes') {
+ indigenousIdentification += formInputs.basicInfo.specifiedIndigenousIdentification
+ ? ': ' + formInputs.basicInfo.specifiedIndigenousIdentification
+ : ' Identified as Indigenous/First Nations'
+ }
const dietaryRestrictions = getDietaryRestrictions(formInputs.basicInfo.dietaryRestriction).map(
e => DIETARY_RESTRICTION_OPTIONS[e]
@@ -104,9 +140,9 @@ export default ({ formInputs, handleEdit, onChange }) => {
var dietaryRestrictionValues = []
for (var i = 0; i < dietaryRestrictions.length; i++) {
- if (dietaryRestrictions[i] === 'Multiple restrictions/other') {
+ if (dietaryRestrictions[i] === 'Other (Please Specify)') {
dietaryRestrictionValues.push(
- formInputs.basicInfo?.otherDietaryRestriction || 'Multiple restrictions/other'
+ formInputs.basicInfo?.otherDietaryRestriction || 'Other Dietary Restriction'
)
} else {
dietaryRestrictionValues.push(dietaryRestrictions[i])
@@ -116,13 +152,47 @@ export default ({ formInputs, handleEdit, onChange }) => {
}
}
+ const majors = getMajors(formInputs.basicInfo.major).map(e => MAJOR_OPTIONS[e])
+ var majorValues = []
+
+ for (var j = 0; j < majors.length; j++) {
+ if (majors[j] === 'Other (Please Specify)') {
+ majorValues.push(formInputs.basicInfo?.otherMajor || 'Other Major')
+ } else {
+ majorValues.push(majors[j])
+ }
+ if (j < majors.length - 1) {
+ majorValues.push(', ')
+ }
+ }
+
+ const engagementSources = getEngagementSources(formInputs.questionnaire.engagementSource).map(
+ e => ENGAGEMENT_SOURCES[e]
+ )
+
+ var engagementSourcesValues = []
+
+ for (var k = 0; k < engagementSources.length; k++) {
+ if (engagementSources[k] === 'Other (Please Specify)') {
+ engagementSourcesValues.push(
+ formInputs.questionnaire?.otherEngagementSource || 'Other Engagement Source'
+ )
+ } else {
+ engagementSourcesValues.push(engagementSources[k])
+ }
+
+ if (k < engagementSources.length - 1) {
+ engagementSourcesValues.push(', ')
+ }
+ }
+
const events = getEvents(formInputs.questionnaire.eventsAttended).map(e => EVENTS_ATTENDED[e])
var attendedValues = []
- for (var j = 0; j < events.length; j++) {
- attendedValues.push(events[j])
+ for (var l = 0; l < events.length; l++) {
+ attendedValues.push(events[l])
- if (j < events.length - 1) {
+ if (l < events.length - 1) {
attendedValues.push(', ')
}
}
@@ -132,14 +202,66 @@ export default ({ formInputs, handleEdit, onChange }) => {
)
var contributionValues = []
- for (var k = 0; k < contribution.length; k++) {
- contributionValues.push(contribution[k])
+ for (var m = 0; m < contribution.length; m++) {
+ contributionValues.push(contribution[m])
- if (k < contribution.length - 1) {
+ if (m < contribution.length - 1) {
contributionValues.push(', ')
}
}
+ const pronouns = getPronouns(formInputs.basicInfo.pronouns).map(e => PRONOUN_OPTIONS[e])
+
+ var pronounValues = []
+
+ for (var n = 0; n < pronouns.length; n++) {
+ if (pronouns[n] === 'Other') {
+ pronounValues.push(formInputs.basicInfo?.otherPronoun || 'Other Pronoun')
+ } else {
+ pronounValues.push(pronouns[n])
+ }
+
+ if (n < pronouns.length - 1) {
+ pronounValues.push(', ')
+ }
+ }
+
+ const races = getRaces(formInputs.basicInfo.race).map(e => RACE_OPTIONS[e])
+
+ var racesValues = []
+
+ for (var o = 0; o < races.length; o++) {
+ if (races[o] === 'Other (Please Specify)') {
+ racesValues.push(formInputs.basicInfo?.otherRace || 'Other Race')
+ } else {
+ racesValues.push(races[o])
+ }
+
+ if (o < races.length - 1) {
+ racesValues.push(', ')
+ }
+ }
+
+ const culturalBgs = getCulturalBackgrounds(formInputs.basicInfo.culturalBackground).map(
+ e => CULTURAL_BG_OPTIONS[e]
+ )
+
+ var culturalBgsValues = []
+
+ for (var p = 0; p < culturalBgs.length; p++) {
+ if (culturalBgs[p] === 'Other (Please Specify)') {
+ culturalBgsValues.push(
+ formInputs.basicInfo?.otherCulturalBackground || 'Other Cultural Background'
+ )
+ } else {
+ culturalBgsValues.push(culturalBgs[p])
+ }
+
+ if (p < culturalBgs.length - 1) {
+ culturalBgsValues.push(', ')
+ }
+ }
+
return (
<>
@@ -167,17 +289,21 @@ export default ({ formInputs, handleEdit, onChange }) => {
-
-
+
{
/>
-
+
+
+
+ 0 ? pronounValues : 'None'}
+ />
+
+ 0 ? majorValues : 'None'}
+ />
+ 0 ? racesValues : 'None'} />
+
+ 0 ? culturalBgsValues : 'None'}
+ />
+
+
@@ -214,8 +368,8 @@ export default ({ formInputs, handleEdit, onChange }) => {
{/* TODO: Change hackathonsAttended to attendedHackathons and make sure the value is an accurate representation */}
{
+
+
@@ -259,11 +421,7 @@ export default ({ formInputs, handleEdit, onChange }) => {
{
-
- 💾
+
+ 🤖
{' '}
- We use your (anonymized!) data to help you get the best sponsors and continuously
- improve nwHacks with each iteration.
+ cmd-f 2024 is an MLH partner event. The following 3 checkboxes are for this partnership.
-
-
-
onChange({
- nwPlusPrivacyPolicy: !formInputs.termsAndConditions.nwPlusPrivacyPolicy,
+ MLHCodeOfConduct: !formInputs.termsAndConditions.MLHCodeOfConduct,
})
}
required
>
- I agree to the{' '}
-
- nwPlus Privacy Policy
+ I have read and agree to the{' '}
+
+ MLH Code of Conduct
-
+ .
onChange({
- shareWithnwPlus: !formInputs.termsAndConditions.shareWithnwPlus,
+ MLHPrivacyPolicy: !formInputs.termsAndConditions.MLHPrivacyPolicy,
})
}
- required
>
- I authorize nwPlus to use my anonymized data for data reporting.
+ I authorize nwPlus to share application/registration information with Major League
+ Hacking for event administration, ranking, MLH administration, in-line with the{' '}
+
+ MLH Privacy Policy
+
+ . I further agree to the terms of both the{' '}
+
+ MLH Contest Terms and Conditions
+ {' '}
+ and the{' '}
+
+ MLH Privacy Policy
+ {' '}
+
+ onChange({
+ MLHEmailSubscription: !formInputs.termsAndConditions.MLHEmailSubscription,
+ })
+ }
+ >
+
+ I authorize MLH to send me occasional emails about relevant events, career
+ opportunities, and community announcements.
+
+
-
- 💼
+
+ 🌱
{' '}
- Our hackathon aims to connect you with industry professionals, recruiters, and career
- opportunities. In doing so, information about our hackers is needed in order for
- attending companies to contact you.
+ Gender is deeply personal and can look different on each individual. We ask all
+ participants to trust that everyone attending belongs at cmd-f.
-
-
onChange({
- shareWithSponsors: !formInputs.termsAndConditions.shareWithSponsors,
+ genderAcknowledgement: !formInputs.termsAndConditions.genderAcknowledgement,
})
}
>
- I authorize nwPlus to provide my resume and supporting documents (Github, Linkedin, etc)
- to event sponsors for recruitment purposes upon request.
+
+ I agree
+
+
-
- 🤖
+
+ 💾
{' '}
- nwHacks 2024 is an MLH partner event. The following 3 checkboxes are for this
- partnership.
+ We use your (anonymized!) data to help you get the best sponsors and continuously
+ improve cmd-f with each iteration.
+
+
+
onChange({
- MLHCodeOfConduct: !formInputs.termsAndConditions.MLHCodeOfConduct,
+ nwPlusPrivacyPolicy: !formInputs.termsAndConditions.nwPlusPrivacyPolicy,
})
}
required
>
- I have read and agree to the{' '}
-
- MLH Code of Conduct
+ I agree to the{' '}
+
+ nwPlus Privacy Policy
- .
+
onChange({
- MLHPrivacyPolicy: !formInputs.termsAndConditions.MLHPrivacyPolicy,
+ shareWithnwPlus: !formInputs.termsAndConditions.shareWithnwPlus,
})
}
+ required
>
- I authorize nwPlus to share application/registration information with Major League
- Hacking for event administration, ranking, MLH administration, in-line with the{' '}
-
- MLH Privacy Policy
-
- . I further agree to the terms of both the{' '}
-
- MLH Contest Terms and Conditions
- {' '}
- and the{' '}
-
- MLH Privacy Policy
- {' '}
+ I authorize nwPlus to use my anonymized data for data reporting.
+
+
+
+
+
+ 💼
+ {' '}
+ Our hackathon aims to connect you with industry professionals, recruiters, and career
+ opportunities. In doing so, information about our hackers is needed in order for
+ attending companies to contact you.
+
+
+
+
onChange({
- MLHEmailSubscription: !formInputs.termsAndConditions.MLHEmailSubscription,
+ shareWithSponsors: !formInputs.termsAndConditions.shareWithSponsors,
})
}
>
-
- I authorize MLH to send me occasional emails about relevant events, career
- opportunities, and community announcements.
-
+ I authorize nwPlus to provide my resume and supporting documents (Github, Linkedin, etc)
+ to event sponsors for recruitment purposes upon request.
@@ -435,7 +617,7 @@ export default ({ formInputs, handleEdit, onChange }) => {
Social Media
- Connect with the community of nwHacks on Medium, Twitter, and Facebook! Share your story
+ Connect with the community of nwPlus on Medium, Twitter, and Facebook! Share your story
and excitement with us!
diff --git a/src/components/ApplicationForm/Skills.js b/src/components/ApplicationForm/Skills.js
index 6b25071e..ccaaeccb 100644
--- a/src/components/ApplicationForm/Skills.js
+++ b/src/components/ApplicationForm/Skills.js
@@ -1,12 +1,23 @@
import React from 'react'
import styled from 'styled-components'
import { CONTRIBUTION_ROLE_OPTIONS, copyText } from '../../utility/Constants'
-import { applyCustomSort } from '../../utility/utilities'
+import { applyCustomSort, findElement } from '../../utility/utilities'
import { Select, TextArea, TextInput } from '../Input'
+import Dropdown from '../Input/Dropdown'
import ResumeUploadBtn from '../ResumeUploadBtn'
import { CenteredH1, ErrorMessage, P, QuestionHeading, ErrorSpan as Required } from '../Typography'
import { FormSpacing, SubHeading } from './'
+const hackathonsAttendedOptions = [
+ { value: '0', label: '0' },
+ { value: '1', label: '1' },
+ { value: '2', label: '2' },
+ { value: '3', label: '3' },
+ { value: '4', label: '4' },
+ { value: '5', label: '5' },
+ { value: '5+', label: '5+' },
+]
+
const QuestionForm = styled.form`
display: flex;
flex-direction: column;
@@ -85,7 +96,31 @@ export default ({ refs, errors, formInputs, onChange, role, handleResume }) => {
- question 17
+ question 21
+
+ How many hackathons have you previously attended?
+
+
+ {errors?.numHackathonsAttended && (
+ {errors?.numHackathonsAttended}
+ )}
+
+ onChange({
+ numHackathonsAttended: e.value,
+ })
+ }
+ isValid={!errors?.numHackathonsAttended}
+ customRef={refs['numHackathonsAttendedRef']}
+ />
+
+
+
+ question 22
What is your intended role at {copyText.hackathonName}?
@@ -124,45 +159,17 @@ export default ({ refs, errors, formInputs, onChange, role, handleResume }) => {
)}
-
- question 18
-
- Is this your first hackathon?
-
-
- {errors?.firstTimeHacker && {errors?.firstTimeHacker} }
- onChange({ firstTimeHacker: true })}
- customRef={refs['firstTimeHackerRef']}
- />
- onChange({ firstTimeHacker: false })}
- />
-
-
- Short Answer Questions
+ Long Answer Questions
- question 19
+ question 23
- Although many come to hackathons to work together to build a software project, we
- recognize that there may be other reasons for attending a hackathon, such as attending
- workshops, or connecting with sponsors.
-
-
- In your own words, describe your definition of a hackathon, and what it means to you.
- (max 200 words)
+ Why do you want to attend cmd-f 2024? (150 words max)
{
/>
- question 20
+ question 24
- Describe a project (does not need to be a technical project) that you worked on and a
- useful skill that you learned from it. (max 200 words)
+ How would you make tech a more welcoming space for underrepresented demographics? (150
+ words max)
{
/>
- question 21
+ question 25
- What character (from a movie, show, book, etc.) do you relate to most and why? (max 50
- words)
+ Tell us about a project you’re really proud of and what you learned from it. (200 words
+ max)
{
customRef={refs['longAnswers3Ref']}
/>
+
+
+ question 26
+
+ In the past, have there been reasons deterring you from attending hackathons or other
+ tech events? (optional)
+
+
+ onChange({
+ longAnswers4: val,
+ })
+ }
+ customRef={refs['longAnswers4Ref']}
+ />
+
+
+
+ question 27
+
+ Is there anything you want to let us know to ensure that we can help you feel
+ comfortable throughout the event? (optional)
+
+
+ onChange({
+ longAnswers5: val,
+ })
+ }
+ customRef={refs['longAnswers5']}
+ />
+
- question 22
+ question 28
Help us get to know you better by providing as many links as you feel will support your
- registration!
+ application!
diff --git a/src/components/Common.js b/src/components/Common.js
index 66cd1e8c..5ea457bf 100644
--- a/src/components/Common.js
+++ b/src/components/Common.js
@@ -153,5 +153,5 @@ export const ScrollbarLike = css`
export const CenterHorizontally = css`
margin: 0 50%;
- transform: translateY(-50%);
+ transform: translateX(-50%);
`
diff --git a/src/components/Input/Dropdown.js b/src/components/Input/Dropdown.js
index a2ef7493..637f859f 100644
--- a/src/components/Input/Dropdown.js
+++ b/src/components/Input/Dropdown.js
@@ -1,10 +1,9 @@
import React from 'react'
-import ReactSelect from 'react-select'
-import CreatableSelect from 'react-select/creatable'
+import ReactSelect, { components } from 'react-select'
import AsyncSelect from 'react-select/async'
import AsyncCreatableSelect from 'react-select/async-creatable'
-import styled, { withTheme, css } from 'styled-components'
-import { components } from 'react-select'
+import CreatableSelect from 'react-select/creatable'
+import styled, { css, withTheme } from 'styled-components'
import customCursor from '../../assets/custom-cursor.png'
import Icon from '../Icon'
diff --git a/src/components/Input/TextInput.js b/src/components/Input/TextInput.js
index 5a09fcc1..daa68a4b 100644
--- a/src/components/Input/TextInput.js
+++ b/src/components/Input/TextInput.js
@@ -15,9 +15,10 @@ const TextInputContainer = styled.div`
${p =>
p.inline &&
`display: inline-block;
- margin-left: 0;
- margin-top: 0.5em;`}
+ margin-left: 0;
+ margin-top: 0.5em;`}
${p => p.noOutline && `margin: 0;`}
+ ${p => p.noLeftOutline && `margin-left: 0;`}
`
const TextInputBox = styled.input.attrs({
@@ -55,12 +56,18 @@ export const TextInput = ({
invalid,
errorMsg,
noOutline,
+ noLeftOutline,
inline,
customRef,
...rest
}) => {
return (
-
+
{invalid && {errorMsg} }
diff --git a/src/components/MobileMenuBar.js b/src/components/MobileMenuBar.js
index 864f9bdf..0f96acfc 100644
--- a/src/components/MobileMenuBar.js
+++ b/src/components/MobileMenuBar.js
@@ -1,7 +1,7 @@
import React from 'react'
import styled from 'styled-components'
-import logo from '../assets/logo.svg'
import menu from '../assets/menu.svg'
+import logo from '../assets/nwplus_icon.svg'
const MobileMenuBarContainer = styled.div`
display: none;
diff --git a/src/components/Navbar.js b/src/components/Navbar.js
index e3675815..19547d87 100644
--- a/src/components/Navbar.js
+++ b/src/components/Navbar.js
@@ -1,10 +1,9 @@
import React from 'react'
-import styled from 'styled-components'
-import { P } from './Typography'
-import nwHacksIcon from '../assets/nwhacks2024logo.png'
+import styled, { withTheme } from 'styled-components'
import cmdfIcon from '../assets/cmdf_logo.png'
+import nwplus_logo from '../assets/nwplus_icon.svg'
import { Button } from './Input'
-import { withTheme } from 'styled-components'
+import { P } from './Typography'
const NavContainer = styled.div`
direction: rtl;
@@ -75,7 +74,7 @@ const NavBar = ({ name, handleLogout, children, theme }) => {
{theme.name === 'nwHacks' && (
{/* */}
-
+
)}
{theme.name === 'cmdf' && (
diff --git a/src/components/Sidebar.js b/src/components/Sidebar.js
index 6a28e1b2..c70edc33 100644
--- a/src/components/Sidebar.js
+++ b/src/components/Sidebar.js
@@ -4,13 +4,13 @@ import { Link, useLocation } from 'wouter'
import cmdf_logo from '../assets/cmdf_logo.png'
import hc_logo from '../assets/hc_logo.svg'
import logo from '../assets/logo.svg'
-import nwhacks_logo from '../assets/logo2024.svg'
+import nwplus_logo from '../assets/nwplus_icon.svg'
import { useAuth } from '../utility/Auth'
+import { APPLICATION_STATUS } from '../utility/Constants'
import { getSponsors } from '../utility/firebase'
import { hackerStatuses } from './ApplicationDashboard'
import { Button } from './Input/index'
import { A } from './Typography'
-import { APPLICATION_STATUS } from '../utility/Constants'
/* Old styles
border-right: 1px solid ${p => p.theme.colors.border};
@@ -34,7 +34,7 @@ const chooseLogo = hackathon => {
case 'cmdf':
return cmdf_logo
case 'nwHacks':
- return nwhacks_logo
+ return nwplus_logo
default:
return logo
}
@@ -60,6 +60,13 @@ const Logo = styled.img.attrs(p => ({
width: 120px;
margin: 86px 0 24px 48px;
`}
+
+ ${p =>
+ p.theme.name === 'nwHacks' &&
+ `
+ margin-top: 20px;
+ margin-bottom: 20px;
+ `}
`
const ItemsContainer = styled.div`
diff --git a/src/containers/Application/Part1.js b/src/containers/Application/Part1.js
index ee4c7252..06ddc0ee 100644
--- a/src/containers/Application/Part1.js
+++ b/src/containers/Application/Part1.js
@@ -7,24 +7,29 @@ import { useHackerApplication } from '../../utility/HackerApplicationContext'
import { checkForError, validateFormSection } from '../../utility/Validation'
const questionsByOrder = [
- 'firstName',
- 'lastName',
+ 'legalFirstName',
+ 'legalLastName',
'preferredName',
'ageByHackathon',
'phoneNumber',
'school',
- 'major',
'educationLevel',
'graduation',
'academicYear',
'countryOfResidence',
'dietaryRestriction',
- 'willBeAgeOfMajority',
- // 'identifyAsUnderrepresented',
+ // 'willBeAgeOfMajority',
+ 'identifyAsUnderrepresented',
'pronouns',
'gender',
- 'ethnicity',
- 'isAuthorizedToWorkInCanada',
+ 'haveTransExperience',
+ 'major',
+ 'race',
+ 'indigenousIdentification',
+ 'culturalBackground',
+ // 'isAuthorizedToWorkInCanada',
+ 'canadianStatus',
+ 'disability',
]
export default () => {
@@ -55,13 +60,14 @@ export default () => {
}
const refs = {
- firstNameRef: useRef(null),
- lastNameRef: useRef(null),
+ legalFirstNameRef: useRef(null),
+ legalLastNameRef: useRef(null),
preferredNameRef: useRef(null),
genderRef: useRef(null),
pronounsRef: useRef(null),
dietaryRestrictionRef: useRef(null),
- // identifyAsUnderrepresentedRef: useRef(null),
+ identifyAsUnderrepresentedRef: useRef(null),
+ indigenousIdentificationRef: useRef(null),
ageByHackathonRef: useRef(null),
phoneNumberRef: useRef(null),
schoolRef: useRef(null),
@@ -69,13 +75,17 @@ export default () => {
educationLevelRef: useRef(null),
graduationRef: useRef(null),
academicYearRef: useRef(null),
- ethnicityRef: useRef(null),
- willBeAgeOfMajorityRef: useRef(null),
+ raceRef: useRef(null),
+ // willBeAgeOfMajorityRef: useRef(null),
+ haveTransExperienceRef: useRef(null),
hackathonsAttendedRef: useRef(null),
contributionRoleRef: useRef(null),
countryOfResidenceRef: useRef(null),
locationRef: useRef(null),
- isAuthorizedToWorkInCanadaRef: useRef(null),
+ culturalBackgroundRef: useRef(null),
+ // isAuthorizedToWorkInCanadaRef: useRef(null),
+ canadianStatusRef: useRef(null),
+ disabilityRef: useRef(null),
}
/**
diff --git a/src/containers/Application/Part2.js b/src/containers/Application/Part2.js
index 7f9d827c..7bbe29f2 100644
--- a/src/containers/Application/Part2.js
+++ b/src/containers/Application/Part2.js
@@ -1,13 +1,13 @@
import React, { useRef, useState } from 'react'
+import { useLocation } from 'wouter'
import Skills from '../../components/ApplicationForm/Skills'
import NavigationButtons from '../../components/NavigationButtons'
import VerticalProgressBar from '../../components/VerticalProgressBar'
-import { useLocation } from 'wouter'
-import { useHackerApplication, uploadResumeToStorage } from '../../utility/HackerApplicationContext'
+import { uploadResumeToStorage, useHackerApplication } from '../../utility/HackerApplicationContext'
import {
+ MAX_RESUME_FILE_SIZE_MB,
checkForError,
validateFormSection,
- MAX_RESUME_FILE_SIZE_MB,
} from '../../utility/Validation'
const questionsByOrder = [
@@ -17,6 +17,8 @@ const questionsByOrder = [
'longAnswers1',
'longAnswers2',
'longAnswers3',
+ 'longAnswers4',
+ 'longAnswers5',
]
export default () => {
@@ -83,7 +85,7 @@ export default () => {
}
const refs = {
- firstTimeHackerRef: useRef(null),
+ numHackathonsAttendedRef: useRef(null),
contributionRoleRef: useRef(null),
resumeRef: useRef(null),
githubRef: useRef(null),
@@ -92,6 +94,7 @@ export default () => {
longAnswers2Ref: useRef(null),
longAnswers3Ref: useRef(null),
longAnswers4Ref: useRef(null),
+ longAnswers5Ref: useRef(null),
}
return (
diff --git a/src/containers/Application/Review.js b/src/containers/Application/Review.js
index 52302734..d5a9df4c 100644
--- a/src/containers/Application/Review.js
+++ b/src/containers/Application/Review.js
@@ -24,7 +24,8 @@ export default () => {
setLoading(false)
}
- const handleEdit = href => {
+ const handleEdit = async href => {
+ await save()
setLocation(href)
window.scrollTo(0, 0)
}
diff --git a/src/containers/Landing/index.js b/src/containers/Landing/index.js
index f28fd48a..b81757c3 100644
--- a/src/containers/Landing/index.js
+++ b/src/containers/Landing/index.js
@@ -2,11 +2,10 @@ import React from 'react'
import styled from 'styled-components'
import cmdf_logo from '../../assets/cmdf_logo.png'
import hc_logo from '../../assets/hc_logo.svg'
-import nwhacks_logo from '../../assets/nwhacks2024logo.png'
+import nwplus_logo from '../../assets/nwplus_icon.svg'
import Banner from '../../components/Banner'
import { H1, P } from '../../components/Typography'
import Footer from './Footer'
-import nwHacksLoginBackground from '../../../src/assets/nwHacksLogin.svg'
const LandingContainer = styled.div`
position: absolute;
@@ -80,7 +79,6 @@ const StyledBanner = styled(Banner)`
text-align: center;
z-index: 0;
display: block;
- margin: 0 auto;
padding: 0;
width: 100%;
@@ -97,19 +95,19 @@ const StyledP = styled(P)`
font-size: 1.5rem;
`
-const NwHacksLoginBackgroundContainer = styled.img`
- height: 100%;
- width: 100vw;
- object-fit: cover;
- z-index: -1;
- position: fixed;
- left: 0;
- top: 0;
- ${p => p.theme.mediaQueries.xs} {
- height: 100vh;
- width: auto;
- }
-`
+// const NwHacksLoginBackgroundContainer = styled.img`
+// height: 100%;
+// width: 100vw;
+// object-fit: cover;
+// z-index: -1;
+// position: fixed;
+// left: 0;
+// top: 0;
+// ${p => p.theme.mediaQueries.xs} {
+// height: 100vh;
+// width: auto;
+// }
+// `
// TODO: add sponsors if footer is shown
export default ({ heading, description, showFooter, hackathon, children, background }) => {
@@ -141,9 +139,9 @@ export default ({ heading, description, showFooter, hackathon, children, backgro
case 'nwHacks':
return (
-
+ {/* */}
-
+
{heading}
{description}
diff --git a/src/containers/SubmissionLink.js b/src/containers/SubmissionLink.js
index 11e20d1f..66fc5542 100644
--- a/src/containers/SubmissionLink.js
+++ b/src/containers/SubmissionLink.js
@@ -36,7 +36,7 @@ export default ({ user, refreshCallback }) => {
} else {
let autoFill = [
{
- name: userData.basicInfo.firstName + ' ' + userData.basicInfo.lastName,
+ name: userData.basicInfo.preferredName,
email: userData.basicInfo.email,
},
]
diff --git a/src/pages/Application/Confirmation.js b/src/pages/Application/Confirmation.js
index 4ce7efcf..8a370d1b 100644
--- a/src/pages/Application/Confirmation.js
+++ b/src/pages/Application/Confirmation.js
@@ -1,15 +1,15 @@
import React from 'react'
-import Landing from '../../containers/Landing'
+import { useLocation } from 'wouter'
import { Button } from '../../components/Input'
+import Landing from '../../containers/Landing'
import { ButtonContainer } from '../Login'
-import { useLocation } from 'wouter'
export default () => {
const [, setLocation] = useLocation()
return (
diff --git a/src/theme/ThemeProvider.js b/src/theme/ThemeProvider.js
index a817f220..c814cda1 100644
--- a/src/theme/ThemeProvider.js
+++ b/src/theme/ThemeProvider.js
@@ -44,16 +44,16 @@ const nwTheme = {
...base,
name: 'nwHacks',
colors: {
- background: '#193545', // Background
- card: '#0A1C27', // BG Accent
- border: '#8E7EB4',
+ background: '#3C4BA5', // Background
+ card: '#0A1361', // BG Accent
+ border: 'rgba(255, 255, 255, 0.3)',
secondaryBackgroundTransparent: '#F0EEF299',
secondaryBackgroundTransparentHover: '#9D9FAD',
- secondaryBackground: '#244556', // Side bar background
+ secondaryBackground: '#5667CF', // Side bar background
sidebar: {
- background: '#193545',
- hover: '#244556',
- selected: '#244556',
+ background: '#5667CF',
+ hover: '#0A1361',
+ selected: '#3C4BA5',
primary: '#DCB551',
secondary: '#9D9FAD',
link: '#9D9FAD',
@@ -88,10 +88,10 @@ const nwTheme = {
border: '#9AD4DE',
hoverbg: ' linear-gradient(265.48deg, #D9DBFF 3.67%, #CCF2F9 78.93%)',
hoverborder: '#A4A9F1',
- outlineText: '#191C4F', // Secondary button
+ outlineText: '#FFF', // Secondary button
outlineHover: '#FFFFFF', // secondary
- outlineBackground: '#DCB551', //secondary button
- outlineBackgroundHover: 'linear-gradient(265.48deg, #244556 3.67%, #244556 78.93%)',
+ outlineBackground: '#A4A9F1', //secondary button
+ outlineBackgroundHover: 'linear-gradient(265.48deg, #D9DBFF 3.67%, #CCF2F9 78.93%)',
outlineBorder: '#CFD6FF',
grey500: '#BDBAC3',
grey700: '#55525B',
diff --git a/src/utility/Constants.js b/src/utility/Constants.js
index 8fa60bc5..2e286b44 100644
--- a/src/utility/Constants.js
+++ b/src/utility/Constants.js
@@ -1,15 +1,15 @@
export const DB_COLLECTION = 'Hackathons'
// CHANGE: firebase collection name for this hackathon
-export const DB_HACKATHON = 'nwHacks2024'
+export const DB_HACKATHON = 'cmd-f2024'
export const DAYOF_COLLECTION = 'DayOf'
export const FAQ_COLLECTION = 'FAQ'
export const NOTIFICATION_SETTINGS_CACHE_KEY = 'livesiteNotificationSettings'
export const IS_DEVICE_IOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream
export const copyText = Object.freeze({
// CHANGE: name of hackathon to be displayed on login splash
- hackathonName: 'nwHacks 2024',
- hackathonNameShort: 'nwHacks',
+ hackathonName: 'cmd-f 2024',
+ hackathonNameShort: 'cmd-f',
})
export const PROJECTS_TO_JUDGE_COUNT = 4
@@ -131,54 +131,92 @@ export const calculateGrade = score => {
}, 0).toFixed(2)
}
-export const ETHNICITY_OPTIONS = Object.freeze({
- asianIndian: 'Asian Indian',
- blackOrAfrican: 'Black or African',
- chinese: 'Chinese',
- filipino: 'Filipino',
- guamanianChamorro: 'Guamanian or Chamorro',
- hispanicLatinoSpanishOrigin: 'Hispanic / Latino / Spanish Origin',
- japanese: 'Japanese',
- korean: 'Korean',
+export const MAJOR_OPTIONS = Object.freeze({
+ computerScience: 'Computer science, computer engineering, or software engineering',
+ otherEngineering: 'Another engineering discipline (such as civil, electrical, mechanical, etc.)',
+ informationTech: 'Information systems, information technology, or system administration',
+ naturalScience: 'A natural science (such as biology, chemistry, physics, etc.)',
+ mathOrStats: 'Mathematics or statistics',
+ webDevOrDesign: 'Web development or web design',
+ business: 'Business discipline (such as accounting, finance, marketing, etc.)',
+ humanities: 'Humanities discipline (such as literature, history, philosophy, etc.)',
+ socialScience: 'Social science (such as anthropology, psychology, political science, etc.)',
+ arts: 'Fine arts or performing arts (such as graphic design, music, studio art, etc.)',
+ healthScience: 'Health science (such as nursing, pharmacy, radiology, etc.)',
+ other: 'Other (Please Specify)',
+ undecidedOrUndeclared: 'Undecided / No Declared Major',
+ schoolDoesNotOfferMajors: 'My school does not offer majors / primary areas of study',
+ preferNotToAnswer: 'Prefer not to answer',
+})
+
+export const RACE_OPTIONS = Object.freeze({
+ asian: 'Asian',
+ black: 'Black',
+ white: 'European/White',
+ hispanic: 'Hispanic',
+ pacificIslander: 'Pacific Islander',
+ dontKnow: "Don't Know",
+ preferNot: 'Prefer not to answer',
+ other: 'Other (Please Specify)',
+})
+
+export const CULTURAL_BG_OPTIONS = Object.freeze({
+ black: 'Black',
+ european: 'European',
+ eastAsian: 'East Asian',
+ southAsian: 'South Asian',
+ southEastAsian: 'South East Asian',
+ firstNationsOrIndigenous: 'First Nations or Indigenous (Please Specify)',
+ hispanicOrLatinx: 'Hispanic or Latinx',
middleEastern: 'Middle Eastern',
- nativeAmericanOrAlaskanNative: 'Native American or Alaskan Native',
- nativeHawaiian: 'Native Hawaiian',
- samoan: 'Samoan',
- vietnamese: 'Vietnamese',
- white: 'White',
- otherAsian: 'Other Asian (Thai, Cambodian, etc)',
- otherPacificIslander: 'Other Pacific Islander',
preferNot: 'Prefer not to answer',
other: 'Other (Please Specify)',
})
export const PRONOUN_OPTIONS = Object.freeze({
- hehim: 'he/him',
sheher: 'she/her',
theythem: 'they/them',
hethey: 'he/they',
shethey: 'she/they',
+ hehim: 'he/him',
preferNot: 'Prefer not to answer',
other: 'Other',
})
export const DIETARY_RESTRICTION_OPTIONS = Object.freeze({
none: 'None',
- celiacDisease: 'Celiac Disease',
+ dairy: 'Dairy',
+ glutenFree: 'Gluten Free',
halal: 'Halal',
kosher: 'Kosher',
+ nuts: 'Nuts',
vegetarian: 'Vegetarian',
vegan: 'Vegan',
- other: 'Allergies/other',
+ other: 'Other (Please Specify)',
})
export const CONTRIBUTION_ROLE_OPTIONS = Object.freeze({
+ beginner: 'Beginner',
designer: 'Designer',
developer: 'Developer',
pm: 'Product/project manager',
other: 'Other',
})
+export const ENGAGEMENT_SOURCES = Object.freeze({
+ attendedPreviously: 'Attended Previously',
+ MLH: 'MLH',
+ instagram: 'Instagram',
+ facebook: 'Facebook',
+ linkedIn: 'LinkedIn',
+ website: 'Website',
+ wordOfMouth: 'Word-of-mouth',
+ nwPlusNewsletter: 'nwPlus Newsletter',
+ facultyNewsletter: 'Faculty Newsletter',
+ professorInClass: 'Professors/In Class',
+ other: 'Other (Please Specify)',
+})
+
export const EVENTS_ATTENDED = Object.freeze({
cmdf2020: 'cmd-f 2020',
cmdf2021: 'cmd-f 2021',
@@ -190,6 +228,7 @@ export const EVENTS_ATTENDED = Object.freeze({
nwHacks2021: 'nwHacks 2021',
nwHacks2022: 'nwHacks 2022',
nwHacks2023: 'nwHacks 2023',
+ nwHacks2024: 'nwHacks 2024',
none: 'None',
})
@@ -197,11 +236,12 @@ export const HACKER_APPLICATION_TEMPLATE = Object.freeze({
_id: '',
basicInfo: {
email: '',
- firstName: '',
- middleName: '',
- lastName: '',
+ legalFirstName: '',
+ legalMiddleName: '',
+ legalLastName: '',
preferredName: '',
gender: '',
+ haveTransExperience: null,
pronouns: {
sheher: false,
hehim: false,
@@ -211,48 +251,73 @@ export const HACKER_APPLICATION_TEMPLATE = Object.freeze({
preferNot: false,
other: false,
},
- ethnicity: {
- asianIndian: false,
- blackOrAfrican: false,
- chinese: false,
- filipino: false,
- guamanianChamorro: false,
- hispanicLatinoSpanishOrigin: false,
- japanese: false,
- korean: false,
- middleEastern: false,
- nativeAmericanOrAlaskanNative: false,
- nativeHawaiian: false,
- samoan: false,
- vietnamese: false,
+ race: {
+ asian: false,
+ black: false,
white: false,
- otherAsian: false,
- otherPacificIslander: false,
+ hispanic: false,
+ pacificIslander: false,
+ dontKnow: false,
+ preferNot: false,
+ other: false,
+ },
+ culturalBackground: {
+ black: false,
+ european: false,
+ eastAsian: false,
+ southAsian: false,
+ southEastAsian: false,
+ firstNationsOrIndigenous: false,
+ hispanicOrLatinx: false,
+ middleEastern: false,
preferNot: false,
other: false,
},
dietaryRestriction: {
none: false,
+ dairy: false,
+ glutenFree: false,
+ halal: false,
+ kosher: false,
+ nuts: false,
vegetarian: false,
vegan: false,
- celiacDisease: false,
- kosher: false,
- halal: false,
other: false,
},
+ identifyAsUnderrepresented: '',
+ indigenousIdentification: '',
ageByHackathon: null,
+ canadianStatus: '',
phoneNumber: '',
school: '',
- major: '',
+ major: {
+ computerScience: false,
+ otherEngineering: false,
+ informationTech: false,
+ naturalScience: false,
+ mathOrStats: false,
+ webDevOrDesign: false,
+ business: false,
+ humanities: false,
+ socialScience: false,
+ arts: false,
+ healthScience: false,
+ other: false,
+ undecidedOrUndeclared: false,
+ schoolDoesNotOfferMajors: false,
+ preferNotToAnswer: false,
+ },
educationLevel: '',
graduation: null,
academicYear: '',
countryOfResidence: '',
- willBeAgeOfMajority: null,
+ // willBeAgeOfMajority: null,
+ disability: '',
},
skills: {
- firstTimeHacker: null,
+ numHackathonsAttended: '',
contributionRole: {
+ beginner: false,
designer: false,
developer: false,
pm: false,
@@ -265,9 +330,11 @@ export const HACKER_APPLICATION_TEMPLATE = Object.freeze({
longAnswers1: '',
longAnswers2: '',
longAnswers3: '',
+ longAnswers4: '',
+ longAnswers5: '',
},
questionnaire: {
- engagementSource: '',
+ engagementSource: [],
eventsAttended: [],
otherEngagementSource: '',
friendEmail: '',
@@ -285,6 +352,7 @@ export const HACKER_APPLICATION_TEMPLATE = Object.freeze({
MLHCodeOfConduct: false,
MLHPrivacyPolicy: false,
MLHEmailSubscription: false,
+ genderAcknowledgement: false,
shareWithnwPlus: false,
nwPlusPrivacyPolicy: false,
shareWithSponsors: false,
diff --git a/src/utility/HackerApplicationContext.js b/src/utility/HackerApplicationContext.js
index a42d58bf..db8748e2 100644
--- a/src/utility/HackerApplicationContext.js
+++ b/src/utility/HackerApplicationContext.js
@@ -41,7 +41,7 @@ export const uploadWaiverToStorage = async (userId, file) => {
export function HackerApplicationProvider({ children }) {
const { user } = useAuth()
- const [application, setApplication] = useState({})
+ const [application, setApplication] = useState(HACKER_APPLICATION_TEMPLATE)
const [, setUpdated] = useState(false)
const [applicationOpen, setApplicationOpen] = useState(null)
const applicationRef = useRef()
diff --git a/src/utility/Validation.js b/src/utility/Validation.js
index a619c22d..af00e3db 100644
--- a/src/utility/Validation.js
+++ b/src/utility/Validation.js
@@ -10,7 +10,8 @@ const MUST_BE_TRUE = 'You must agree to the required term/condition.'
export const MAX_RESUME_FILE_SIZE_MB = 2
export const MAX_WAIVER_FILE_SIZE_MB = 3
const LONG_ANSWER_WORD_LIMIT = 200
-const SHORT_ANSWER_WORD_LIMIT = 50
+const MED_ANSWER_WORD_LIMIT = 150
+// const SHORT_ANSWER_WORD_LIMIT = 50
export const validateURL = thing => {
const pattern = new RegExp(
'^(https?:\\/\\/)?' + // protocol
@@ -173,22 +174,22 @@ const validators = {
message: EMAIL_MESSAGE,
}
},
- firstName: noEmptyFunction,
- lastName: noEmptyFunction,
- preferredName: noEmptyFunction,
+ legalFirstName: noEmptyFunction,
+ legalLastName: noEmptyFunction,
+ // preferredName: noEmptyFunction,
// gender: noEmptyFunction,
- // identifyAsUnderrepresented: noEmptyFunction,
+ identifyAsUnderrepresented: noEmptyFunction,
// pronouns: noNoneFunction,
// ethnicity: noNoneFunction,
dietaryRestriction: noNoneFunction,
ageByHackathon: noEmptyFunction,
school: noEmptyFunction,
- major: noEmptyFunction,
+ // major: noEmptyFunction,
educationLevel: noEmptyFunction,
graduation: noEmptyFunction,
academicYear: noEmptyFunction,
countryOfResidence: noEmptyFunction,
- willBeAgeOfMajority: noNeitherFunction,
+ // willBeAgeOfMajority: noNeitherFunction,
phoneNumber: number => {
return {
error: !validatePhoneNumber(number),
@@ -203,33 +204,40 @@ const validators = {
github: optionalURLFunction,
linkedin: optionalURLFunction,
firstTimeHacker: noNeitherFunction,
- longAnswers1: answer => {
+ disability: answer => {
return {
- error: !validateStringNotEmpty(answer) || getWords(answer) > LONG_ANSWER_WORD_LIMIT,
+ error: getWords(answer) > LONG_ANSWER_WORD_LIMIT,
message: answer.length > LONG_ANSWER_WORD_LIMIT ? '' : NOT_EMPTY,
}
},
+ longAnswers1: answer => {
+ return {
+ error: !validateStringNotEmpty(answer) || getWords(answer) > MED_ANSWER_WORD_LIMIT,
+ message: answer.length > MED_ANSWER_WORD_LIMIT ? '' : NOT_EMPTY,
+ }
+ },
longAnswers2: answer => {
return {
- error: !validateStringNotEmpty(answer) || getWords(answer) > LONG_ANSWER_WORD_LIMIT,
- message: answer.length > LONG_ANSWER_WORD_LIMIT ? '' : NOT_EMPTY,
+ error: !validateStringNotEmpty(answer) || getWords(answer) > MED_ANSWER_WORD_LIMIT,
+ message: answer.length > MED_ANSWER_WORD_LIMIT ? '' : NOT_EMPTY,
}
},
longAnswers3: answer => {
return {
- error: !validateStringNotEmpty(answer) || getWords(answer) > SHORT_ANSWER_WORD_LIMIT,
- message: answer.length > SHORT_ANSWER_WORD_LIMIT ? '' : NOT_EMPTY,
+ error: !validateStringNotEmpty(answer) || getWords(answer) > LONG_ANSWER_WORD_LIMIT,
+ message: answer.length > LONG_ANSWER_WORD_LIMIT ? '' : NOT_EMPTY,
}
},
},
questionnaire: {
- engagementSource: noEmptyFunction,
+ engagementSource: noNoneFunction,
eventsAttended: noNoneFunction,
},
termsAndConditions: {
MLHCodeOfConduct: validateTrueFunction,
MLHPrivacyPolicy: validateTrueFunction,
// MLHEmailSubscription: validateTrueFunction,
+ genderAcknowledgement: validateTrueFunction,
shareWithnwPlus: validateTrueFunction,
nwPlusPrivacyPolicy: validateTrueFunction,
},
diff --git a/src/utility/firebase.js b/src/utility/firebase.js
index 7226d248..e4220ac5 100644
--- a/src/utility/firebase.js
+++ b/src/utility/firebase.js
@@ -51,12 +51,13 @@ const createNewApplication = async user => {
const basicInfo = user?.displayName?.includes(' ')
? {
email: user.email,
- firstName: user?.displayName?.split(' ')[0] ?? '',
- lastName: user?.displayName?.split(' ')[user?.displayName?.split(' ').length - 1] ?? '',
+ legalFirstName: user?.displayName?.split(' ')[0] ?? '',
+ legalLastName:
+ user?.displayName?.split(' ')[user?.displayName?.split(' ').length - 1] ?? '',
}
: {
email: user.email,
- firstName: user.displayName ?? '',
+ legalFirstName: user.displayName ?? '',
}
const submission = {
submission: {