├── .eslintignore ├── src ├── react-app-env.d.ts ├── index.css ├── hooks │ ├── useDebounce │ │ ├── index.js │ │ ├── usDebounce.js │ │ └── useDebounce.test.js │ └── CancellablePromise │ │ └── index.js ├── components │ ├── _Landing │ │ ├── assets │ │ │ ├── animals │ │ │ │ ├── whale.png │ │ │ │ ├── frog-min.png │ │ │ │ ├── owl-min.png │ │ │ │ ├── rabbit-min.png │ │ │ │ ├── racoon-min.png │ │ │ │ ├── cloud-whale.png │ │ │ │ ├── little-whale.png │ │ │ │ └── skunkIslandv2-min.png │ │ │ ├── clouds │ │ │ │ ├── cloud1.png │ │ │ │ ├── cloud2.png │ │ │ │ ├── cloud3.png │ │ │ │ ├── cloud4.png │ │ │ │ ├── cloud5.png │ │ │ │ └── cloud6.png │ │ │ ├── yellow_hackru.png │ │ │ ├── sponsors │ │ │ │ ├── echo_3d.png │ │ │ │ ├── merck.png │ │ │ │ └── nj_transit.png │ │ │ ├── sun │ │ │ │ └── sun.tsx │ │ │ └── scripts │ │ │ │ └── stars.js │ │ ├── sections │ │ │ ├── about │ │ │ │ ├── contextAbout.tsx │ │ │ │ ├── components │ │ │ │ │ └── AboutContent.css │ │ │ │ ├── about.tsx │ │ │ │ ├── config │ │ │ │ │ └── aboutConfigAbout.ts │ │ │ │ └── hooks │ │ │ │ │ └── useConfigAbout.ts │ │ │ ├── library │ │ │ │ ├── ColorButton.jsx │ │ │ │ ├── WhiteTextField.jsx │ │ │ │ └── AuthForm.jsx │ │ │ ├── error.tsx │ │ │ ├── hero │ │ │ │ ├── hero.css │ │ │ │ ├── utilities.ts │ │ │ │ ├── MainHeroContent.tsx │ │ │ │ └── hero.tsx │ │ │ ├── schedule │ │ │ │ └── Schedule.css │ │ │ ├── faq │ │ │ │ └── FAQ.tsx │ │ │ ├── sponsors │ │ │ │ └── Sponsors.tsx │ │ │ └── footer │ │ │ │ └── Footer.tsx │ │ ├── global_components │ │ │ ├── CardLogReg.css │ │ │ ├── CardAbout.css │ │ │ ├── SectionTitle.tsx │ │ │ ├── CardLogReg.tsx │ │ │ ├── SocialMediaComponent.tsx │ │ │ └── CardAbout.tsx │ │ ├── utilities.ts │ │ ├── Landing.css │ │ ├── Default.js │ │ └── Landing.tsx │ ├── input.css │ ├── Dashboard │ │ ├── TeamViewer │ │ │ ├── TeamInfoModal │ │ │ │ ├── index.js │ │ │ │ ├── pure_component │ │ │ │ │ ├── ModalBackground.jsx │ │ │ │ │ ├── GenericList.jsx │ │ │ │ │ ├── TeamMemberList.jsx │ │ │ │ │ ├── PureSection.jsx │ │ │ │ │ ├── TeamMemberCard.jsx │ │ │ │ │ ├── ConfirmationModal.jsx │ │ │ │ │ ├── PureModal.jsx │ │ │ │ │ └── TeamInfoPure.jsx │ │ │ │ ├── tests │ │ │ │ │ ├── ModalBackground.test.jsx │ │ │ │ │ ├── TeamMemberCard.test.jsx │ │ │ │ │ ├── PureSection.test.jsx │ │ │ │ │ ├── TeamMemberList.test.jsx │ │ │ │ │ ├── GenericList.test.jsx │ │ │ │ │ ├── ConfirmationModal.test.jsx │ │ │ │ │ └── PureModal.test.jsx │ │ │ │ └── TeamInfoModal.jsx │ │ │ ├── UserItem.jsx │ │ │ ├── ExploreSearchBox.jsx │ │ │ └── RenderRow.jsx │ │ ├── QR.jsx │ │ ├── ProfileMessage.jsx │ │ ├── Forms │ │ │ └── UserProfileForm │ │ │ │ ├── CustomAVInput.jsx │ │ │ │ ├── ResumeUploader.jsx │ │ │ │ ├── majors.json │ │ │ │ ├── VaccineUploader.jsx │ │ │ │ └── WaiverUploader.jsx │ │ ├── TeamLoading.jsx │ │ ├── Loading.jsx │ │ └── Section.jsx │ ├── Landing │ │ └── Sections │ │ │ ├── Sponsors │ │ │ ├── Partners.jsx │ │ │ ├── Sponsors.jsx │ │ │ ├── SponsorItem.jsx │ │ │ ├── SponsorContainer.jsx │ │ │ ├── LogoWrapper.jsx │ │ │ ├── sponsors.json │ │ │ └── CarouselContainer.jsx │ │ │ ├── FaqsCollapse.jsx │ │ │ ├── Stats.jsx │ │ │ └── Logo.jsx │ ├── Live │ │ ├── Map.jsx │ │ ├── Links.jsx │ │ └── Live.jsx │ ├── Team │ │ ├── TeamNames.jsx │ │ └── Person.jsx │ ├── GlowButton.jsx │ ├── Card.jsx │ ├── Pages.jsx │ ├── Errors │ │ └── E404.jsx │ ├── Sponsorship │ │ ├── SponsorshipConfig.js │ │ ├── Sections │ │ │ └── AboutSponsorship.jsx │ │ └── Sponsorship.jsx │ └── Projector │ │ ├── Countdown.jsx │ │ └── Projector.jsx ├── secrets.js ├── library │ ├── ColorButton.jsx │ ├── WhiteTextField.jsx │ └── AuthForm.jsx ├── NavBar.css ├── index.js ├── MLHBadge.jsx └── FlyingLogo.jsx ├── public ├── resources │ ├── menu.pdf │ └── waiver.pdf ├── assets │ ├── icons │ │ ├── hru-logo.png │ │ ├── blue_hackru.png │ │ ├── green_hackru.png │ │ ├── greenemasset.png │ │ ├── red_hackru.png │ │ ├── greenbookasset.png │ │ ├── greenrockasset.png │ │ ├── pinkbookasset.png │ │ ├── yellow_hackru.png │ │ ├── colorful_hackru.png │ │ ├── greendragonasset.png │ │ ├── greendragonasset2.png │ │ ├── greeneyehatasset.png │ │ ├── greengriffinasset.png │ │ ├── greenspriteasset.png │ │ ├── greenunicornasset.png │ │ ├── mlh-logo-green-yo.png │ │ ├── mlh-logo-pink-yo.png │ │ ├── offwhite_hackru.png │ │ ├── pinkdragonasset.png │ │ ├── pinkdragonasset2.png │ │ ├── greenfirehandasset.png │ │ ├── greenrockhandasset.png │ │ ├── greenwaterhandasset.png │ │ ├── greenwingstarasset.png │ │ ├── hru-logo-small-pink.png │ │ ├── usacs-logo-green-yo.png │ │ ├── usacs-logo-pink-yo.png │ │ ├── hru-alien-noplat-color.png │ │ ├── hru-alien-noplat-white.png │ │ ├── hru-logo-circle-green.png │ │ ├── hru-logo-small-green.png │ │ ├── hackru-slogan.svg │ │ ├── hru-text-one.svg │ │ ├── hru-text.svg │ │ ├── hru-text-dyn.svg │ │ ├── hru-text-red.svg │ │ ├── hru-logo.svg │ │ ├── hru-logo-green.svg │ │ └── hru-logo-white.svg │ ├── testimonials │ │ ├── t1.png │ │ ├── t2.png │ │ ├── t3.png │ │ └── t4.png │ ├── hru-background-large.png │ ├── HackRU Website Sponsor Logo Format.ai │ └── background │ │ ├── target-thick_red.svg │ │ ├── target-thick_green.svg │ │ ├── target-thick_yellow.svg │ │ ├── circle_green.svg │ │ ├── circle_red.svg │ │ ├── circle_yellow.svg │ │ ├── circle_white.svg │ │ ├── target-thick_white.svg │ │ ├── circle-dotted_white.svg │ │ └── target_red.svg ├── manifest.json └── index.html ├── .editorconfig ├── .env-cmdrc ├── .gitignore ├── tsconfig.json ├── scripts ├── prod-deploy.sh └── dev-deploy.sh ├── .github └── workflows │ ├── code-quality-assurance.yml │ ├── code-build-assurance.yml │ ├── prod-deploy.yml │ └── dev-deploy.yml ├── LICENSE ├── tailwind.config.js ├── .eslintrc.js └── package.json /.eslintignore: -------------------------------------------------------------------------------- 1 | *.json 2 | *.css 3 | *.png 4 | *.svg 5 | *.jpeg -------------------------------------------------------------------------------- /src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /public/resources/menu.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/resources/menu.pdf -------------------------------------------------------------------------------- /public/resources/waiver.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/resources/waiver.pdf -------------------------------------------------------------------------------- /src/hooks/useDebounce/index.js: -------------------------------------------------------------------------------- 1 | import useDebounce from "./usDebounce"; 2 | 3 | export default useDebounce; -------------------------------------------------------------------------------- /public/assets/icons/hru-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/hru-logo.png -------------------------------------------------------------------------------- /public/assets/testimonials/t1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/testimonials/t1.png -------------------------------------------------------------------------------- /public/assets/testimonials/t2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/testimonials/t2.png -------------------------------------------------------------------------------- /public/assets/testimonials/t3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/testimonials/t3.png -------------------------------------------------------------------------------- /public/assets/testimonials/t4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/testimonials/t4.png -------------------------------------------------------------------------------- /public/assets/icons/blue_hackru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/blue_hackru.png -------------------------------------------------------------------------------- /public/assets/icons/green_hackru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/green_hackru.png -------------------------------------------------------------------------------- /public/assets/icons/greenemasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/greenemasset.png -------------------------------------------------------------------------------- /public/assets/icons/red_hackru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/red_hackru.png -------------------------------------------------------------------------------- /public/assets/hru-background-large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/hru-background-large.png -------------------------------------------------------------------------------- /public/assets/icons/greenbookasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/greenbookasset.png -------------------------------------------------------------------------------- /public/assets/icons/greenrockasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/greenrockasset.png -------------------------------------------------------------------------------- /public/assets/icons/pinkbookasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/pinkbookasset.png -------------------------------------------------------------------------------- /public/assets/icons/yellow_hackru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/yellow_hackru.png -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*.{js, jsx}] 4 | indent_style = space 5 | indent_size = 4 6 | trim_trailing_whitespace = true 7 | -------------------------------------------------------------------------------- /public/assets/icons/colorful_hackru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/colorful_hackru.png -------------------------------------------------------------------------------- /public/assets/icons/greendragonasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/greendragonasset.png -------------------------------------------------------------------------------- /public/assets/icons/greendragonasset2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/greendragonasset2.png -------------------------------------------------------------------------------- /public/assets/icons/greeneyehatasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/greeneyehatasset.png -------------------------------------------------------------------------------- /public/assets/icons/greengriffinasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/greengriffinasset.png -------------------------------------------------------------------------------- /public/assets/icons/greenspriteasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/greenspriteasset.png -------------------------------------------------------------------------------- /public/assets/icons/greenunicornasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/greenunicornasset.png -------------------------------------------------------------------------------- /public/assets/icons/mlh-logo-green-yo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/mlh-logo-green-yo.png -------------------------------------------------------------------------------- /public/assets/icons/mlh-logo-pink-yo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/mlh-logo-pink-yo.png -------------------------------------------------------------------------------- /public/assets/icons/offwhite_hackru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/offwhite_hackru.png -------------------------------------------------------------------------------- /public/assets/icons/pinkdragonasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/pinkdragonasset.png -------------------------------------------------------------------------------- /public/assets/icons/pinkdragonasset2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/pinkdragonasset2.png -------------------------------------------------------------------------------- /public/assets/icons/greenfirehandasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/greenfirehandasset.png -------------------------------------------------------------------------------- /public/assets/icons/greenrockhandasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/greenrockhandasset.png -------------------------------------------------------------------------------- /public/assets/icons/greenwaterhandasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/greenwaterhandasset.png -------------------------------------------------------------------------------- /public/assets/icons/greenwingstarasset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/greenwingstarasset.png -------------------------------------------------------------------------------- /public/assets/icons/hru-logo-small-pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/hru-logo-small-pink.png -------------------------------------------------------------------------------- /public/assets/icons/usacs-logo-green-yo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/usacs-logo-green-yo.png -------------------------------------------------------------------------------- /public/assets/icons/usacs-logo-pink-yo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/usacs-logo-pink-yo.png -------------------------------------------------------------------------------- /public/assets/icons/hru-alien-noplat-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/hru-alien-noplat-color.png -------------------------------------------------------------------------------- /public/assets/icons/hru-alien-noplat-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/hru-alien-noplat-white.png -------------------------------------------------------------------------------- /public/assets/icons/hru-logo-circle-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/hru-logo-circle-green.png -------------------------------------------------------------------------------- /public/assets/icons/hru-logo-small-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/icons/hru-logo-small-green.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/animals/whale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/animals/whale.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/clouds/cloud1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/clouds/cloud1.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/clouds/cloud2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/clouds/cloud2.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/clouds/cloud3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/clouds/cloud3.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/clouds/cloud4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/clouds/cloud4.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/clouds/cloud5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/clouds/cloud5.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/clouds/cloud6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/clouds/cloud6.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/yellow_hackru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/yellow_hackru.png -------------------------------------------------------------------------------- /src/secrets.js: -------------------------------------------------------------------------------- 1 | const MAP_KEY = process.env.REACT_APP_MAP_KEY ? process.env.REACT_APP_MAP_KEY : "< YOU MUST DEFINE A KEY >"; 2 | export { MAP_KEY }; -------------------------------------------------------------------------------- /public/assets/HackRU Website Sponsor Logo Format.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/public/assets/HackRU Website Sponsor Logo Format.ai -------------------------------------------------------------------------------- /src/components/_Landing/assets/animals/frog-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/animals/frog-min.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/animals/owl-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/animals/owl-min.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/sponsors/echo_3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/sponsors/echo_3d.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/sponsors/merck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/sponsors/merck.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/animals/rabbit-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/animals/rabbit-min.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/animals/racoon-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/animals/racoon-min.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/animals/cloud-whale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/animals/cloud-whale.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/animals/little-whale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/animals/little-whale.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/sponsors/nj_transit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/sponsors/nj_transit.png -------------------------------------------------------------------------------- /src/components/_Landing/assets/animals/skunkIslandv2-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackRU/frontend/HEAD/src/components/_Landing/assets/animals/skunkIslandv2-min.png -------------------------------------------------------------------------------- /src/components/input.css: -------------------------------------------------------------------------------- 1 | Input::selection { 2 | background-color: #4FAB5F !important; 3 | } 4 | Input::-moz-selection { 5 | background-color: #4FAB5F !important; 6 | } -------------------------------------------------------------------------------- /src/hooks/CancellablePromise/index.js: -------------------------------------------------------------------------------- 1 | import { useCancellablePromise, useCancellablePromises } from "./CancellablePromise"; 2 | 3 | export {useCancellablePromise, useCancellablePromises}; -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/TeamInfoModal/index.js: -------------------------------------------------------------------------------- 1 | import TeamInfoModal from "./TeamInfoModal"; 2 | import ConfirmationModal from "./pure_component/ConfirmationModal"; 3 | 4 | export default TeamInfoModal; 5 | 6 | export {ConfirmationModal}; -------------------------------------------------------------------------------- /src/components/_Landing/sections/about/contextAbout.tsx: -------------------------------------------------------------------------------- 1 | import { createContext } from "react"; 2 | import { AboutConfigPresets } from "./config/aboutConfigAbout"; 3 | 4 | const AboutContext = createContext(2); 5 | export default AboutContext; 6 | -------------------------------------------------------------------------------- /src/library/ColorButton.jsx: -------------------------------------------------------------------------------- 1 | import { Button, withStyles } from "@material-ui/core"; 2 | 3 | const ColorButton = withStyles(() => ({ 4 | root: { 5 | color: "white", 6 | backgroundColor: "#8db67e", 7 | "&:hover": { 8 | backgroundColor: "#8db67e", 9 | }, 10 | }, 11 | }))(Button); 12 | 13 | export default ColorButton; -------------------------------------------------------------------------------- /src/components/Dashboard/QR.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import QRCode from "qrcode.react"; 3 | import PropTypes from "prop-types"; 4 | 5 | const QR = ({ email }) => ( 6 | 9 | ); 10 | 11 | QR.propTypes = { 12 | email: PropTypes.string 13 | }; 14 | 15 | export default QR; 16 | -------------------------------------------------------------------------------- /.env-cmdrc: -------------------------------------------------------------------------------- 1 | { 2 | "development": { 3 | "PORT": 3000, 4 | "BROWSER": "none", 5 | "REACT_APP_MODE": "development" 6 | }, 7 | "build-dev": { 8 | "GENERATE_SOURCEMAP": true, 9 | "REACT_APP_MODE": "development" 10 | }, 11 | "build-prod": { 12 | "GENERATE_SOURCEMAP": false, 13 | "REACT_APP_MODE": "production" 14 | } 15 | } -------------------------------------------------------------------------------- /src/components/_Landing/sections/library/ColorButton.jsx: -------------------------------------------------------------------------------- 1 | import { Button, withStyles } from "@material-ui/core"; 2 | 3 | const ColorButton = withStyles(() => ({ 4 | root: { 5 | color: "white", 6 | backgroundColor: "#8db67e", 7 | "&:hover": { 8 | backgroundColor: "#3e8169", 9 | }, 10 | }, 11 | }))(Button); 12 | 13 | export default ColorButton; -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "HackRU", 3 | "name": "HackRU Fall 2023", 4 | "icons": [ 5 | { 6 | "src": "./assets/icons/red_hackru.png", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/png" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } -------------------------------------------------------------------------------- /src/components/_Landing/global_components/CardLogReg.css: -------------------------------------------------------------------------------- 1 | .logreg{ 2 | justify-content: center; 3 | align-items: center; 4 | position: relative; 5 | top: 50%; 6 | -webkit-transform: translateY(-50%); 7 | -ms-transform: translateY(-50%); 8 | transform: translateY(-50%); 9 | 10 | } 11 | /* @media only screen and (max-width: 700px) { 12 | .logreg { 13 | width:80%; 14 | 15 | background-color: red; 16 | } 17 | } */ 18 | 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # Dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # Testing 9 | /coverage 10 | 11 | # Production 12 | /build 13 | 14 | # Misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | 25 | # IDEs 26 | .swp 27 | .vscode/ 28 | .idea/ -------------------------------------------------------------------------------- /src/components/_Landing/global_components/CardAbout.css: -------------------------------------------------------------------------------- 1 | @media only screen and (min-width: 769px) { 2 | .cardStyleSplitCard { 3 | margin: 10px 100px; 4 | } 5 | .cardStyle{ 6 | margin: 100px 100px; 7 | } 8 | } 9 | /* small screen */ 10 | @media only screen and (max-width: 769px) { 11 | .cardStyleSplitCard { 12 | margin: 10px 8px 10px 8px; 13 | } 14 | .cardStyle{ 15 | margin: 100px 20px; 16 | } 17 | } 18 | 19 | -------------------------------------------------------------------------------- /src/components/_Landing/utilities.ts: -------------------------------------------------------------------------------- 1 | 2 | export function randomizeAnimationDurations(className: string, min: number, max: number) { 3 | const floatingComponents = document.getElementsByClassName(className); 4 | for (let i = 0; i < floatingComponents.length; i++) { 5 | const randomDuration = Math.random() * (max - min) + min; 6 | floatingComponents[i].setAttribute( 7 | "style", 8 | `animation-duration: ${randomDuration}s` 9 | ); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/TeamInfoModal/pure_component/ModalBackground.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import modalstyles from "../styles/ModalStyle.module.css"; 4 | 5 | const ModalBackground = (props) => { 6 | const {onClick} = props; 7 | return ( 8 |
10 | ); 11 | }; 12 | 13 | ModalBackground.propTypes = { 14 | onClick : PropTypes.func.isRequired, 15 | }; 16 | 17 | export default ModalBackground; -------------------------------------------------------------------------------- /src/components/Landing/Sections/Sponsors/Partners.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import LogoWrapper from "./LogoWrapper"; 3 | import { defaults } from "../../../../Defaults.js"; 4 | import PropTypes from "prop-types"; 5 | 6 | const Partners = ({ isMobile }) => ( 7 | 11 | ); 12 | Partners.propTypes = { 13 | isMobile: PropTypes.bool, 14 | }; 15 | 16 | 17 | export default Partners; -------------------------------------------------------------------------------- /src/components/Landing/Sections/Sponsors/Sponsors.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import LogoWrapper from "./LogoWrapper"; 3 | import { defaults } from "../../../../Defaults.js"; 4 | import PropTypes from "prop-types"; 5 | const Sponsors = ({ isMobile }) => ( 6 | 10 | ); 11 | 12 | Sponsors.propTypes = { 13 | isMobile: PropTypes.bool, 14 | }; 15 | 16 | export default Sponsors; -------------------------------------------------------------------------------- /src/components/_Landing/global_components/SectionTitle.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | function SectionTitle(props: { title: string }) { 4 | const { title } = props; 5 | return ( 6 |
7 |
8 |
{title}
9 |
10 |
11 | ); 12 | } 13 | 14 | export default SectionTitle; -------------------------------------------------------------------------------- /src/components/Live/Map.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import { defaults } from "../../Defaults"; 3 | class Map extends Component { 4 | render() { 5 | return ( 6 |
7 |
8 |

Map

9 | map 12 |
13 |
14 | ); 15 | } 16 | } 17 | export default Map; -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/UserItem.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { ListItem, ListItemText, } from "@material-ui/core"; 3 | import PropTypes from "prop-types"; 4 | 5 | function UserItem(props) { 6 | const { member } = props; 7 | console.log(member); 8 | return ( 9 | 10 | 11 | 13 | 14 | ); 15 | } 16 | UserItem.propTypes = { 17 | member: PropTypes.object, 18 | skills: PropTypes.array, 19 | }; 20 | 21 | export default UserItem; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "allowSyntheticDefaultImports": true, 13 | "strict": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "module": "esnext", 16 | "moduleResolution": "node", 17 | "resolveJsonModule": true, 18 | "isolatedModules": true, 19 | "noEmit": true, 20 | "jsx": "react" 21 | }, 22 | "include": [ 23 | "src" 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /src/NavBar.css: -------------------------------------------------------------------------------- 1 | .customButton { 2 | color: white !important; 3 | border: 1px solid white !important; 4 | border-color: white !important; 5 | text-decoration: none !important; 6 | transition: 1s ease !important; 7 | } 8 | 9 | .customButton:hover { 10 | background-color: #f1ba43 !important; 11 | color: black !important; 12 | border-color: black !important; 13 | transition: 1s ease; 14 | -o-transition: 1s ease; 15 | -ms-transition: 1s ease; 16 | -moz-transition: 1s ease; 17 | -webkit-transition: 1s ease; 18 | } 19 | 20 | button:focus { 21 | outline: none !important; 22 | } 23 | -------------------------------------------------------------------------------- /src/components/Team/TeamNames.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import {Col } from "reactstrap"; 3 | import Person from "./Person.jsx"; 4 | import PropTypes from "prop-types"; 5 | 6 | const TeamNames = ({ people, teamName }) => ( 7 | 8 |

{teamName}

9 | {people.map((person) => 10 | 13 | )} 14 | 15 | ); 16 | 17 | TeamNames.propTypes = { 18 | people: PropTypes.string, 19 | teamName: PropTypes.string, 20 | }; 21 | 22 | export default TeamNames; 23 | -------------------------------------------------------------------------------- /public/assets/icons/hackru-slogan.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | hack all knight 11 | 12 | -------------------------------------------------------------------------------- /src/components/Dashboard/ProfileMessage.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { UncontrolledAlert } from "reactstrap"; 3 | import PropTypes from "prop-types"; 4 | /** 5 | * Renders an alert based on the message 6 | * @param {String} message The displayed message 7 | */ 8 | const ProfileMessage = ({ message }) => ( 9 | message && 10 | 12 | {message.value} 13 | 14 | ); 15 | ProfileMessage.propTypes = { 16 | message: PropTypes.object, 17 | }; 18 | export default ProfileMessage; -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/TeamInfoModal/tests/ModalBackground.test.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | /* eslint-disable no-unused-vars */ 3 | 4 | import React from "react"; 5 | import { render } from "@testing-library/react"; 6 | import ModalBackground from "../pure_component/ModalBackground"; 7 | 8 | describe("ModalBackground", () => { 9 | test("background runs the onClick function on click", () => { 10 | const fun = jest.fn(); 11 | const {container} = render( fun()}/>); 12 | container.querySelector("div").click(); 13 | expect(fun).toHaveBeenCalledTimes(1); 14 | }); 15 | }); -------------------------------------------------------------------------------- /src/components/_Landing/global_components/CardLogReg.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "./CardLogReg.css"; 3 | 4 | function CardLogReg(props: any) { 5 | return ( 6 |
12 | {props.children} 13 |
14 | ); 15 | } 16 | 17 | export default CardLogReg; -------------------------------------------------------------------------------- /scripts/prod-deploy.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | # Mostly intended to be run from travis CI 3 | # It is expected that KEY and SECRET will be set in the environment 4 | set -e 5 | cd ../ 6 | npm run-script build-prod 7 | #empty bucket, then upload 8 | aws s3 rm s3://hackru-frontend-prod --recursive 9 | aws s3 cp --recursive build s3://hackru-frontend-prod --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers 10 | aws s3 cp --recursive --exclude '*' --include '*.svg' --content-type 'image/svg+xml' build s3://hackru-frontend-prod --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers 11 | aws cloudfront create-invalidation --distribution-id "E1YIAV5VULIMY7" --paths "/*" 12 | -------------------------------------------------------------------------------- /scripts/dev-deploy.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | # Mostly intended to be run from travis CI 3 | # It is expected that KEY and SECRET will be set in the environment 4 | set -e 5 | cd ../ 6 | NODE_ENV=development npm run-script build-dev 7 | #empty bucket, then upload 8 | aws s3 rm s3://hackru-frontend-dev --recursive 9 | aws s3 cp --recursive build s3://hackru-frontend-dev --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers 10 | aws s3 cp --recursive --exclude '*' --include '*.svg' --content-type 'image/svg+xml' build s3://hackru-frontend-dev --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers 11 | aws cloudfront create-invalidation --distribution-id "E1G9Y2VX0F41B6" --paths "/*" 12 | -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/TeamInfoModal/pure_component/GenericList.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | import modalstyles from "../styles/ModalStyle.module.css"; 5 | 6 | const GenericList = (props) => { 7 | const {entries} = props; 8 | return( 9 |
    10 | { 11 | entries && entries.map((entry) => 12 |
  • {entry}
  • 13 | ) 14 | } 15 |
16 | ); 17 | }; 18 | 19 | GenericList.propTypes = { 20 | entries : PropTypes.arrayOf(PropTypes.string), 21 | }; 22 | 23 | export default GenericList; -------------------------------------------------------------------------------- /src/components/_Landing/assets/sun/sun.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "./sun.css"; 3 | 4 | function Sun() { 5 | return ( 6 |
7 |
8 |
9 | 10 |
11 |
12 |
13 |
14 | 15 |
16 |
17 |
18 | 19 |
20 |
21 |
22 |
23 | ); 24 | } 25 | 26 | export default Sun; -------------------------------------------------------------------------------- /src/components/Team/Person.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { theme } from "../../Defaults"; 3 | import PropTypes from "prop-types"; 4 | 5 | const Person = ({ image, name, title }) => ( 6 |
7 | { 8 | image && {name} 11 | } 12 |
{name}
13 | {title && {title} } 14 |
15 | ); 16 | 17 | Person.propTypes = { 18 | image: PropTypes.string, 19 | name: PropTypes.string, 20 | title: PropTypes.string, 21 | }; 22 | 23 | export default Person; 24 | -------------------------------------------------------------------------------- /src/components/GlowButton.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Button } from "reactstrap"; 3 | import { Icon } from "react-fa"; 4 | import PropTypes from "prop-types"; 5 | 6 | const GlowButton = ({ href, icon, text }) => ( 7 | 18 | ); 19 | 20 | GlowButton.propTypes = { 21 | href: PropTypes.string, 22 | icon: PropTypes.string, 23 | text: PropTypes.string, 24 | }; 25 | 26 | export default GlowButton; 27 | -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/TeamInfoModal/tests/TeamMemberCard.test.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | /* eslint-disable no-unused-vars */ 3 | 4 | import React from "react"; 5 | import { render } from "@testing-library/react"; 6 | import TeamMemberCard from "../pure_component/TeamMemberCard"; 7 | 8 | describe("TeamMemberCard", () => { 9 | 10 | test("renders bio and user_id", () => { 11 | const user = { 12 | user_id : "John Doe", 13 | bio : "example biography", 14 | }; 15 | const {queryByText} = render(); 16 | expect(queryByText(/John Doe/)).toBeTruthy(); 17 | expect(queryByText(/example biography/)).toBeTruthy(); 18 | }); 19 | }); -------------------------------------------------------------------------------- /src/components/Card.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | // import { theme } from "../../../Defaults"; 5 | 6 | function Card(props){ 7 | 8 | return ( 9 |
10 | 11 | {props.sideBar ?
: ""} 12 | {props.children} 13 |
14 | ); 15 | } 16 | Card.propTypes = { 17 | backgroundColor: PropTypes.any, 18 | sideBar: PropTypes.any, 19 | children: PropTypes.element 20 | }; 21 | export default Card; -------------------------------------------------------------------------------- /src/components/_Landing/sections/error.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | /** 4 | * Error Section page with custom error title and message. 5 | * @param props 6 | * @returns 7 | */ 8 | function Error(props: { title: string, message: string }) { 9 | const { title, message } = props; 10 | return ( 11 |
12 |
13 |

14 | {title} 15 |

16 |

17 | {message} 18 |

19 |
20 |
21 | ); 22 | } 23 | 24 | export default Error; -------------------------------------------------------------------------------- /src/components/_Landing/sections/hero/hero.css: -------------------------------------------------------------------------------- 1 | 2 | .glowing-moon-container { 3 | position: absolute; 4 | top: 55%; 5 | left: 65%; 6 | transform: translate(-50%, -50%); 7 | width: 0.2rem; 8 | height: 0.2rem; 9 | border-radius: 50%; 10 | background-color: #d1e9ef; 11 | /* box-shadow: 0 0 30px 10px #d1e9ef; */ 12 | } 13 | 14 | .navbar-button:hover { 15 | text-shadow:1px 1px 10px #4bbede; 16 | } 17 | 18 | /* KEYFRAMES */ 19 | 20 | @keyframes animateCloud { 21 | 0% { 22 | transform: translateX(-34rem); 23 | } 24 | 100% { 25 | transform: translateX(100vw); 26 | } 27 | } 28 | 29 | /* ANIMATIONS */ 30 | 31 | .cloud { 32 | will-change: transform; 33 | animation: animateCloud 400s linear infinite; 34 | } -------------------------------------------------------------------------------- /.github/workflows/code-quality-assurance.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean node installation of the project, and test the code 2 | 3 | name: Code Quality Assurance 4 | 5 | on: 6 | push: 7 | branches: ["*", "*/*", "**", "!env/dev"] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | strategy: 14 | fail-fast: true 15 | matrix: 16 | node-version: [12.x, 14.x] 17 | 18 | steps: 19 | - uses: actions/checkout@v2 20 | - name: Test using Node ${{ matrix.node-version }} 21 | uses: actions/setup-node@v1 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | - run: npm install 25 | - run: npm run lint 26 | -------------------------------------------------------------------------------- /src/library/WhiteTextField.jsx: -------------------------------------------------------------------------------- 1 | import { TextField, withStyles } from "@material-ui/core"; 2 | 3 | const WhiteTextField = withStyles({ 4 | root: { 5 | "--input-color": "white", 6 | "& labl.Mui-focused": { 7 | color: "white", 8 | }, 9 | "& .MuiInput-underline:after": { 10 | borderBottomColor: "white", 11 | }, 12 | "& .MuiOutlinedInput-root": { 13 | "& fieldset": { 14 | borderColor: "white", 15 | color: "white", 16 | }, 17 | "&:hover fieldset": { 18 | borderColor: "white", 19 | }, 20 | "&.Mui-focused fieldset": { 21 | borderColor: "white", 22 | }, 23 | }, 24 | 25 | }, 26 | 27 | })(TextField); 28 | 29 | export default WhiteTextField; -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/TeamInfoModal/pure_component/TeamMemberList.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import TeamMemberCard from "./TeamMemberCard"; 4 | 5 | import modalstyles from "../styles/ModalStyle.module.css"; 6 | 7 | const TeamMemberList = (props) => { 8 | const {members} = props; 9 | return( 10 |
    11 | { 12 | members.map((member) => ) 14 | } 15 |
16 | ); 17 | }; 18 | 19 | TeamMemberList.propTypes = { 20 | members : PropTypes.arrayOf(PropTypes.shape({ 21 | user_id : PropTypes.string, 22 | seriousness : PropTypes.number, 23 | bio : PropTypes.string, 24 | })) 25 | }; 26 | 27 | export default TeamMemberList; -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/TeamInfoModal/pure_component/PureSection.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | import { Typography } from "@material-ui/core"; 4 | import modalstyles from "../styles/ModalStyle.module.css"; 5 | 6 | const PureSection = (props) => { 7 | const {sectionHeader, children} = props; 8 | return ( 9 | <> 10 |
11 |
12 | 13 | {sectionHeader} 14 | 15 |
16 | {children} 17 |
18 | 19 | ); 20 | }; 21 | 22 | PureSection.propTypes = { 23 | sectionHeader : PropTypes.string.isRequired, 24 | children : PropTypes.node.isRequired, 25 | }; 26 | 27 | export default PureSection; -------------------------------------------------------------------------------- /src/components/_Landing/sections/hero/utilities.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | 3 | export function scrollToSectionName(sectionName: string) { 4 | document.getElementById(sectionName)?.scrollIntoView({ behavior: "smooth" }); 5 | } 6 | 7 | export function useUserScrolled(scroll_y_threshold: number = 0) { 8 | const [userScrolled, setUserScrolled] = useState(false); 9 | 10 | useEffect(() => { 11 | const handleScroll = () => { 12 | if (window.scrollY > scroll_y_threshold) { 13 | setUserScrolled(true); 14 | } else { 15 | setUserScrolled(false); 16 | } 17 | }; 18 | 19 | window.addEventListener("scroll", handleScroll); 20 | 21 | return () => window.removeEventListener("scroll", handleScroll); 22 | }, []); 23 | 24 | return userScrolled; 25 | } 26 | 27 | export default { useUserScrolled }; -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/TeamInfoModal/pure_component/TeamMemberCard.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from "prop-types"; 2 | import React from "react"; 3 | 4 | import modalstyles from "../styles/ModalStyle.module.css"; 5 | 6 | const TeamMemberCard = (props) => { 7 | const {user_id, bio} = props.member; 8 | return ( 9 |
  • 10 |
    11 | 12 |
    {user_id}
    13 |
    {bio}
    14 |
    15 |
    16 |
  • 17 | ); 18 | }; 19 | 20 | TeamMemberCard.propTypes = { 21 | member : PropTypes.shape({ 22 | user_id : PropTypes.string.isRequired, 23 | seriousness: PropTypes.number, 24 | bio: PropTypes.string.isRequired, 25 | }).isRequired, 26 | }; 27 | 28 | export default TeamMemberCard; -------------------------------------------------------------------------------- /src/components/Landing/Sections/Sponsors/SponsorItem.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | class SponsorItem extends Component { 5 | render() { 6 | return ( 7 |
    9 | {this.props.name} 12 |
    13 | ); 14 | } 15 | } 16 | 17 | SponsorItem.propTypes = { 18 | size: PropTypes.object, 19 | href: PropTypes.string, 20 | name: PropTypes.string, 21 | baseURL: PropTypes.string, 22 | image: PropTypes.string 23 | }; 24 | 25 | export default SponsorItem; -------------------------------------------------------------------------------- /src/components/_Landing/sections/schedule/Schedule.css: -------------------------------------------------------------------------------- 1 | 2 | /* Table Header */ 3 | .MainLayout-stickyElement.MainLayout-header.MainLayout-flexRow { 4 | background-color: transparent; 5 | } 6 | 7 | .MainLayout-background.MainLayout-inlineFlex.MainLayout-ordinaryHeaderBorder { 8 | background-color: transparent; 9 | } 10 | 11 | .MainLayout-stickyElement.MainLayout-leftPanel.MainLayout-dayScaleEmptyCell.MainLayout-ordinaryLeftPanelBorder { 12 | background-color: transparent; 13 | } 14 | 15 | /* Table Side Bar */ 16 | .MainLayout-flexRow.MainLayout-stickyElement.MainLayout-leftPanel.MainLayout-ordinaryLeftPanelBorder { 17 | background-color: transparent; 18 | } 19 | 20 | /* Day of Week */ 21 | .Cell-dayOfWeek { 22 | color: #d1e9ef !important; 23 | } 24 | 25 | /* Day of Month */ 26 | .Cell-dayOfMonth { 27 | color: #d1e9ef !important; 28 | 29 | } 30 | 31 | /* Time Labels */ 32 | .css-1fbp63r .Label-text { 33 | color: #d1e9ef !important; 34 | } -------------------------------------------------------------------------------- /public/assets/background/target-thick_red.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/_Landing/sections/library/WhiteTextField.jsx: -------------------------------------------------------------------------------- 1 | // import { TextField, withStyles } from "@material-ui/core"; 2 | 3 | // const WhiteTextField = withStyles({ 4 | // root: { 5 | // "--input-color": "white", 6 | // "& labl.Mui-focused": { 7 | // color: "white", 8 | // }, 9 | // "& .MuiInput-underline:after": { 10 | // borderBottomColor: "white", 11 | // }, 12 | // "& .MuiOutlinedInput-root": { 13 | // "& fieldset": { 14 | // borderColor: "white", 15 | // color: "white", 16 | // }, 17 | // "&:hover fieldset": { 18 | // borderColor: "white", 19 | // }, 20 | // "&.Mui-focused fieldset": { 21 | // borderColor: "white", 22 | // }, 23 | // }, 24 | 25 | // }, 26 | 27 | // })(TextField); 28 | 29 | // export default WhiteTextField; -------------------------------------------------------------------------------- /public/assets/background/target-thick_green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /public/assets/background/target-thick_yellow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/components/Pages.jsx: -------------------------------------------------------------------------------- 1 | import LandingPage from "./Landing/Landing"; 2 | import DashboardPage from "./Dashboard/Dashboard"; 3 | import ProfilePage from "./Dashboard/Profile"; 4 | import LoginPage from "./Login"; 5 | import SignUpPage from "./Signup"; 6 | import ForgotPage from "./Forgot"; 7 | import ContactPage from "./Contact"; 8 | import MagicPage from "./Magic"; 9 | import LivePage from "./Live/Live"; 10 | import SponsorshipPage from "./Sponsorship/Sponsorship"; 11 | import ProjectorPage from "./Projector/Projector"; 12 | import E404 from "./Errors/E404"; 13 | import TeamPage from "./Team/Team"; 14 | import TeamViewerPage from "./Dashboard/TeamViewer/TeamViewer"; 15 | export { 16 | LandingPage, 17 | DashboardPage, 18 | ProfilePage, 19 | LoginPage, 20 | SignUpPage, 21 | MagicPage, 22 | ForgotPage, 23 | ContactPage, 24 | LivePage, 25 | TeamPage, 26 | SponsorshipPage, 27 | E404, 28 | ProjectorPage, 29 | TeamViewerPage 30 | }; 31 | -------------------------------------------------------------------------------- /.github/workflows/code-build-assurance.yml: -------------------------------------------------------------------------------- 1 | # You might ask why this workflow exists? Well apparently, the linter can pass but the build can still fail. So at some point during the review process we need to run the build. Hence, this file 2 | 3 | name: Code Build Assurance 4 | 5 | on: 6 | pull_request: 7 | branches: [env/dev, env/prod] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | strategy: 14 | fail-fast: true 15 | matrix: 16 | node-version: [12.x, 14.x] 17 | 18 | steps: 19 | - uses: actions/checkout@v2 20 | - name: Test using Node ${{ matrix.node-version }} 21 | env: 22 | NODE_OPTIONS: "--max_old_space_size=8192" 23 | uses: actions/setup-node@v1 24 | with: 25 | node-version: ${{ matrix.node-version }} 26 | - run: npm install 27 | - run: NODE_ENV=development CI=false npm run build-dev 28 | -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/TeamInfoModal/tests/PureSection.test.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | /* eslint-disable no-unused-vars */ 3 | 4 | import React from "react"; 5 | import { render } from "@testing-library/react"; 6 | import PureSection from "../pure_component/PureSection"; 7 | 8 | describe("PureSection", () => { 9 | 10 | test("renders section header", () => { 11 | const {queryByText} = render(Child); 12 | const sectionHeader = queryByText(/Section Header/i); 13 | expect(sectionHeader.innerHTML).toBe("Section Header"); 14 | }); 15 | 16 | test("renders child component", () => { 17 | const child =
    Child Component
    ; 18 | const {queryByText} = render({child}); 19 | const childComponent = queryByText(/Child Component/i); 20 | expect(childComponent).toBeTruthy(); 21 | }); 22 | }); -------------------------------------------------------------------------------- /src/components/_Landing/Landing.css: -------------------------------------------------------------------------------- 1 | /* * { 2 | font-family: 'Titillium Web', 'Arial', sans-serif; 3 | } */ 4 | 5 | .glow { 6 | /* text-shadow:1px 1px 6px #fff; */ 7 | } 8 | 9 | .glow-symbol { 10 | box-shadow:1px 1px 6px #fff; 11 | } 12 | 13 | .glow-subtitle-color { 14 | box-shadow: 1px 1px 6px #4bbede; 15 | } 16 | .glow-subtitles { 17 | /* text-shadow:1px 1px 20px #f1e192; */ 18 | } 19 | 20 | .transparent-black-background { 21 | background-color: rgba(0, 0, 0, 0.4); 22 | } 23 | 24 | .star { 25 | position: absolute; 26 | width: 4px; 27 | height: 4px; 28 | border-radius: 2px; 29 | background: white; 30 | } 31 | 32 | .floating { 33 | animation-name: floating; 34 | 35 | animation-iteration-count: infinite; 36 | animation-timing-function: ease-in-out; 37 | margin-left: 30px; 38 | margin-top: 5px; 39 | } 40 | 41 | @keyframes floating { 42 | 0% { transform: translate(0, 0px); } 43 | 50% { transform: translate(0, 15px); } 44 | 100% { transform: translate(0, -0px); } 45 | } -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/TeamInfoModal/tests/TeamMemberList.test.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | /* eslint-disable no-unused-vars */ 3 | 4 | import React from "react"; 5 | import { render } from "@testing-library/react"; 6 | import TeamMemberList from "../pure_component/TeamMemberList"; 7 | 8 | describe("TeamMemberList", () => { 9 | test("should render unordered list containing 6 list elements", () => { 10 | const consoleErr = console.error; 11 | console.error = jest.fn(); 12 | const members = Array(6).fill(0).map((it) => { 13 | return { 14 | user_id : "John Doe", 15 | seriousness : 5, 16 | bio : "example biography", 17 | }; 18 | }); 19 | const {container} = render(); 20 | expect(container.querySelector("ul")).toBeTruthy(); 21 | expect(container.querySelector("ul").querySelectorAll("li").length).toBe(6); 22 | console.error = consoleErr; 23 | }); 24 | }); -------------------------------------------------------------------------------- /src/components/_Landing/assets/scripts/stars.js: -------------------------------------------------------------------------------- 1 | import { TweenMax } from "gsap/TweenMax"; 2 | 3 | // Amount of stars 4 | function createStars(numberOfStars) { 5 | for (let i = 0; i < numberOfStars; i++) { 6 | placeStarRandomly(); 7 | } 8 | } 9 | // Create Stars 10 | function placeStarRandomly(){ 11 | const tmpStar = document.createElement("div"); 12 | tmpStar.className = "star"; 13 | tmpStar.style.position = "absolute"; 14 | tmpStar.style.top = 98*Math.random()+"%"; 15 | tmpStar.style.left = 100*Math.random()+"%"; 16 | document.getElementById("starryBackground").appendChild(tmpStar); 17 | } 18 | 19 | function animateStars() { 20 | const stars = document.querySelectorAll(".star"); 21 | Array.prototype.forEach.call(stars, function(el,){ 22 | TweenMax.to(el, Math.random() * 0.5 + 0.5, {opacity: Math.random(), onComplete: animateStars}); 23 | }); 24 | } 25 | 26 | 27 | export default function initStars(numberOfStars) { 28 | createStars(numberOfStars); 29 | animateStars(); 30 | } 31 | -------------------------------------------------------------------------------- /src/components/_Landing/global_components/SocialMediaComponent.tsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable react/jsx-no-target-blank */ 2 | /* eslint-disable react/jsx-max-props-per-line */ 3 | import React from "react"; 4 | import { FaInstagram } from "react-icons/fa"; 5 | import { FaTwitter } from "react-icons/fa"; 6 | import { FaFacebookF } from "react-icons/fa"; 7 | function SocialMediaComponent() { 8 | 9 | return ( 10 | 15 | ); 16 | } 17 | 18 | 19 | export default SocialMediaComponent; 20 | -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/ExploreSearchBox.jsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import Box from "@material-ui/core/Box"; 3 | import TextField from "@material-ui/core/TextField"; 4 | import PropTypes from "prop-types"; 5 | 6 | function ExploreSearchBox(props) { 7 | return ( 8 | { 17 | props.setSearchText(e.target.value); 18 | }} 19 | onKeyPress={(e) => { // Prevent page from reloading on Enter 20 | if (e.key === "Enter") { 21 | e.preventDefault(); 22 | } 23 | }} 24 | > 25 | 28 | 29 | ); 30 | } 31 | 32 | ExploreSearchBox.propTypes = { 33 | setSearchText: PropTypes.func 34 | }; 35 | 36 | export default ExploreSearchBox; -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 HackRU 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/components/Live/Links.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import GlowButton from "../GlowButton"; 3 | import { liveImportantLinks } from "../../Defaults"; 4 | import { ProfileType } from "../Profile"; 5 | 6 | class Links extends Component { 7 | render() { 8 | let items = []; 9 | for (let i = 0; i < liveImportantLinks.length; i++) { 10 | items.push( 11 | 17 | ); 18 | } 19 | return ( 20 |
    21 |
    22 |
    23 | {items} 24 |
    25 |
    26 |
    27 | ); 28 | } 29 | } 30 | 31 | Links.propTypes = { 32 | profile: ProfileType 33 | }; 34 | 35 | export default Links; 36 | -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/TeamInfoModal/tests/GenericList.test.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | /* eslint-disable no-unused-vars */ 3 | 4 | import React from "react"; 5 | import { render } from "@testing-library/react"; 6 | import GenericList from "../pure_component/GenericList"; 7 | 8 | describe("GenericList", () => { 9 | test("should be empty", () => { 10 | const {container} = render(); 11 | const list = container.querySelectorAll("li"); 12 | expect(list.length).toBe(0); 13 | }); 14 | test("should contains three li's", () => { 15 | const entries = ["hi", "bye", "yo"]; 16 | const {container} = render(); 17 | const list = container.querySelectorAll("li"); 18 | expect(list.length).toBe(3); 19 | }); 20 | test("should render list with proper text", () => { 21 | const entries = ["hi", "bye", "yo"]; 22 | const {container} = render(); 23 | const list = [...container.querySelectorAll("li")].map((node) => node.innerHTML); 24 | expect(list).toStrictEqual(entries); 25 | }); 26 | }); -------------------------------------------------------------------------------- /src/components/Errors/E404.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import { Container, Col } from "reactstrap"; 3 | import { theme } from "../../Defaults"; 4 | import { Link } from "react-router-dom"; 5 | class E404 extends Component { 6 | render() { 7 | return ( 8 | 11 | 12 | 14 |
    15 |

    ¯\_(ツ)_/¯, this page doesn't exist

    16 |

    Click here to go back to land!

    18 |
    19 | 20 | 21 |
    22 | ); 23 | } 24 | } 25 | 26 | export default E404; 27 | -------------------------------------------------------------------------------- /src/components/_Landing/sections/about/components/AboutContent.css: -------------------------------------------------------------------------------- 1 | .imgClass{ 2 | min-width: 100px; 3 | min-height: 100px; 4 | max-width: 600px; 5 | max-height: 600px; 6 | margin: 60px 20px 60px 20px; 7 | } 8 | 9 | .textStyle{ 10 | color: #f1e192; 11 | font-size: 25px; 12 | font-family: "Titillium Web"; 13 | text-align: center; 14 | } 15 | 16 | .text-text { 17 | text-align: center; 18 | } 19 | 20 | .rectangle-container { 21 | display: flex; 22 | justify-content: center; 23 | } 24 | .rectangle { 25 | background-color: #f0e192; 26 | width: 45%; 27 | height: 3px; 28 | margin-bottom: 10px; 29 | } 30 | 31 | @media only screen and (max-width: 1226px) { 32 | 33 | .titleClass{ 34 | padding-bottom: 40px; 35 | } 36 | } 37 | /* medium screen for split card*/ 38 | @media only screen and (max-width: 769px) { 39 | .HeaderText{ 40 | justify-content: center; 41 | } 42 | .textStyle{ 43 | font-size: 25px; 44 | } 45 | .titleClass{ 46 | padding-bottom: 0px; 47 | } 48 | } 49 | 50 | /* small screen for split card*/ 51 | @media only screen and (max-width: 480px) { 52 | .textStyle{ 53 | font-size: 20px; 54 | } 55 | 56 | } 57 | 58 | -------------------------------------------------------------------------------- /src/components/Landing/Sections/FaqsCollapse.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Collapse } from "@material-ui/core"; 3 | import { Icon } from "react-fa"; 4 | import PropTypes from "prop-types"; 5 | 6 | class FaqsCollapse extends React.Component { 7 | constructor(props) { 8 | super(props); 9 | this.toggle = this.toggle.bind(this); 10 | } 11 | UNSAFE_componentWillMount() { 12 | this.setState({ 13 | collapse: false 14 | }); 15 | } 16 | toggle() { 17 | this.setState({ collapse: !this.state.collapse }); 18 | } 19 | render() { 20 | let cat = this.props.cat; 21 | 22 | return ( 23 |
    24 |
    {cat.title}
    26 |
    27 | {cat.text}
    28 |
    29 | ); 30 | } 31 | } 32 | 33 | FaqsCollapse.propTypes = { 34 | cat: PropTypes.object 35 | }; 36 | 37 | export default FaqsCollapse; 38 | -------------------------------------------------------------------------------- /src/components/_Landing/sections/about/about.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Error from "../error"; 3 | import AboutContent from "./components/AboutContent"; 4 | import useAboutConfig, { useVerifyPreset } from "./hooks/useConfigAbout"; 5 | 6 | function About() { 7 | const validPreset = useVerifyPreset(); 8 | 9 | const { mainComponent } = useAboutConfig(); 10 | const { 11 | useSplitCards, 12 | } = mainComponent; 13 | 14 | if (!validPreset) { 15 | return ; 18 | } 19 | // probably not the most dynamic code. Instead of useSplitCards, it should be based on the presents #. derp 20 | if (useSplitCards) { 21 | return ( 22 |
    24 | 25 | 26 |
    27 | ); 28 | } else { 29 | return ( 30 |
    32 | 33 |
    34 | ); 35 | } 36 | 37 | 38 | } 39 | 40 | 41 | export default About; -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./src/**/*.{js,jsx,ts,tsx}", 5 | ], 6 | blocklist: [ 7 | "collapse", 8 | ], 9 | theme: { 10 | extend: { 11 | screens: { 12 | "xs-about": "300px", 13 | //replace this with section specific breakpoints 14 | "sm-about": "300px", 15 | "md-about": "900px", 16 | "lg-about": "1000px", 17 | "xl-about": "1440px" 18 | }, 19 | colors: { 20 | "mainBg": "#1f6aa0", 21 | "endBg": "#0f3854", 22 | "text": "#f1e192", 23 | "textSubtitle": "#f1e192", 24 | 25 | "f23-darkGreen": "#133d35", 26 | "f23-mediumGreen": "#3e8169", 27 | "f23-lightGreen": "#8db67e", 28 | "f23-yellowGreen": "#f1e192" 29 | }, 30 | fontSize: { 31 | "10xl": "9rem", 32 | "11xl": "10rem", 33 | "12xl": "11rem", 34 | "13xl": "12rem" 35 | }, 36 | spacing: { 37 | "128": "32rem", 38 | "144": "36rem", 39 | } 40 | }, 41 | }, 42 | plugins: [], 43 | }; 44 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import "./index.css"; 2 | import React from "react"; // Required react dependencies 3 | import ReactDOM from "react-dom"; // Required react dependencies 4 | import { register, unregister } from "./serviceWorker"; // Service worker dependencies 5 | import App from "./App"; // Default app and component to be rendered 6 | import { defaults } from "./Defaults"; // The standard list of strings that we will be using throughout the application 7 | import "bootstrap/dist/css/bootstrap.min.css"; // Boostrap import 8 | /** 9 | * Application entry point. Here we render the standard root components that are standard to all pages in the website 10 | * 11 | * @param {boolean} worker Toggle the default react service worker. 12 | * We default this to false because enabling the service worker brings with it application caching, which causes production 13 | * issues during version updates. If you would like to know about this issue in depth, read through the react documentation. 14 | */ 15 | function main(worker) { 16 | // Render the default title 17 | ReactDOM.render(defaults.title, document.getElementById("title")); 18 | // Render the default root object 19 | ReactDOM.render(, document.getElementById("root")); 20 | // Decide whether or not we need to enable the default serviceworker 21 | if (worker) { 22 | register(); 23 | } else { 24 | unregister(); 25 | } 26 | } 27 | main(false); -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/TeamInfoModal/tests/ConfirmationModal.test.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | /* eslint-disable no-unused-vars */ 3 | 4 | import React from "react"; 5 | import { render } from "@testing-library/react"; 6 | import ConfirmationModal from "../pure_component/ConfirmationModal"; 7 | 8 | describe("ConfirmationModal", () => { 9 | test("Confirm button should call onConfirm", () => { 10 | const fun = jest.fn(); 11 | const {queryByText} = render( fun()} 12 | onCancel={() => {}}/>); 13 | const confirmationBtn = queryByText(/Confirm/); 14 | confirmationBtn.click(); 15 | expect(fun).toHaveBeenCalledTimes(1); 16 | }); 17 | 18 | test("Cancel button should call onCancel", () => { 19 | const fun = jest.fn(); 20 | const {queryByText} = render( {}} 21 | onCancel={() => fun()}/>); 22 | const cancelBtn = queryByText(/Cancel/); 23 | cancelBtn.click(); 24 | expect(fun).toHaveBeenCalledTimes(1); 25 | }); 26 | 27 | test("message is rendered", () => { 28 | const msg = "This is the example message!"; 29 | const {queryByText} = render( {}} 30 | onConfirm={() => {}} 31 | message={msg}/>); 32 | expect(queryByText(/This is the example message!/)).toBeTruthy(); 33 | }); 34 | }); -------------------------------------------------------------------------------- /src/components/Dashboard/TeamViewer/TeamInfoModal/tests/PureModal.test.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | /* eslint-disable no-unused-vars */ 3 | 4 | import React from "react"; 5 | import { render } from "@testing-library/react"; 6 | import PureModal from "../pure_component/PureModal"; 7 | 8 | describe("PureModal", () => { 9 | test("renders header and subheader", () => { 10 | const {queryByText} = render( {}}>Child); 13 | 14 | const header = queryByText(/Header/); 15 | const subHeader = queryByText(/Subheader/); 16 | expect(header).toBeTruthy(); 17 | expect(subHeader).toBeTruthy(); 18 | }); 19 | 20 | test("onClick called when close button is clicked", () => { 21 | const fun = jest.fn(); 22 | const {container} = render( fun()}>Child); 25 | 26 | const button = container.querySelector("button")?.click(); 27 | expect(fun).toHaveBeenCalledTimes(1); 28 | }); 29 | 30 | test("renders child component", () => { 31 | const {queryByText} = render( {}}>Children); 34 | 35 | expect(queryByText(/Children/)).toBeTruthy(); 36 | }); 37 | }); -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es6: true, 5 | node: true 6 | }, 7 | extends: "eslint:recommended", 8 | globals: { 9 | Atomics: "readonly", 10 | SharedArrayBuffer: "readonly", 11 | JSX: true, 12 | }, 13 | parser: "babel-eslint", 14 | parserOptions: { 15 | ecmaVersion: 6, 16 | sourceType: "module", 17 | ecmaFeatures: { 18 | jsx: true, 19 | modules: true, 20 | experimentalObjectRestSpread: true 21 | } 22 | }, 23 | plugins: [ 24 | "react" 25 | ], 26 | extends: [ 27 | "eslint:recommended", 28 | "plugin:react/recommended" 29 | ], 30 | plugins: [ 31 | "react" 32 | ], 33 | rules: { 34 | "indent": [ 35 | "error", 36 | 4 37 | ], 38 | "quotes": [ 39 | "error", 40 | "double" 41 | ], 42 | "semi": [ 43 | "error", 44 | "always" 45 | ], 46 | "no-console": "off", // Allow log statements 47 | "react/display-name": "off", // Allow anonymous components 48 | "react/jsx-max-props-per-line": 1, 49 | "react/no-string-refs": "off", 50 | "react/no-unescaped-entities": "off", 51 | }, 52 | settings: { 53 | react: { 54 | version: "detect", 55 | } 56 | } 57 | }; 58 | -------------------------------------------------------------------------------- /src/components/_Landing/sections/about/config/aboutConfigAbout.ts: -------------------------------------------------------------------------------- 1 | type AboutConfigPresets = 0 | 1 | 2; 2 | 3 | interface AboutConfig { 4 | mainComponent: { 5 | sidebarVisible: boolean; 6 | horizontalBarsVisible: boolean; 7 | headerTextBubblesVisible: boolean; 8 | headerTextAlignment: "left" | "middle" | "right" | "NA"; 9 | subTextAlignment: "left" | "middle" | "right" | "NA"; 10 | useSplitCards: boolean; 11 | }; 12 | } 13 | 14 | const aboutOriginal: AboutConfig = { 15 | mainComponent: { 16 | sidebarVisible: true, 17 | horizontalBarsVisible: true, 18 | headerTextBubblesVisible: true, 19 | headerTextAlignment: "left", 20 | subTextAlignment: "left", 21 | useSplitCards: false, 22 | }, 23 | }; 24 | const aboutMiddleFocus: AboutConfig = { 25 | mainComponent: { 26 | sidebarVisible: false, 27 | horizontalBarsVisible: false, 28 | headerTextBubblesVisible: true, 29 | headerTextAlignment: "middle", 30 | subTextAlignment: "middle", 31 | useSplitCards: false, 32 | }, 33 | }; 34 | 35 | const aboutMIT: AboutConfig = { 36 | mainComponent: { 37 | sidebarVisible: false, 38 | horizontalBarsVisible: false, 39 | headerTextBubblesVisible: false, 40 | headerTextAlignment: "NA", 41 | subTextAlignment: "NA", 42 | useSplitCards: true, 43 | }, 44 | }; 45 | export { aboutOriginal, aboutMiddleFocus, aboutMIT }; 46 | export type { AboutConfig, AboutConfigPresets }; 47 | -------------------------------------------------------------------------------- /src/components/_Landing/sections/about/hooks/useConfigAbout.ts: -------------------------------------------------------------------------------- 1 | import { useContext } from "react"; 2 | import AboutContext from "../contextAbout"; 3 | import { 4 | aboutMIT, 5 | aboutMiddleFocus, 6 | aboutOriginal, 7 | AboutConfig, 8 | AboutConfigPresets, 9 | } from "../config/aboutConfigAbout"; 10 | 11 | /** 12 | * Contains all the configurations for the hero components. 13 | * ORDERING OF PRESETS IS IMPORTANT 14 | */ 15 | 16 | const configs = [aboutOriginal, aboutMiddleFocus, aboutMIT]; 17 | 18 | /** 19 | * Verifies that the preset is valid by checking with the configs array. 20 | * @returns {boolean} Whether the preset is valid or not. 21 | */ 22 | function useVerifyPreset() { 23 | const preset: AboutConfigPresets = useContext(AboutContext); 24 | return !(preset > configs.length || preset < 0 || !configs[preset]); 25 | } 26 | 27 | /** 28 | This is the hero config hook used by hero components to retrieve configuration. 29 | The configuration they receive is determined by the HeroContext provider. 30 | To change the HeroContext, you would need to go to contexts.tsx and change the value of the HeroContext. 31 | @returns {AboutConfig} The configuration for the hero component. 32 | */ 33 | function useAboutConfig(): AboutConfig { 34 | if (!useVerifyPreset()) { 35 | throw new Error("Invalid preset. "); 36 | } 37 | const preset: AboutConfigPresets = useContext(AboutContext); 38 | return configs[preset]; 39 | } 40 | 41 | export default useAboutConfig; 42 | export { useVerifyPreset }; 43 | -------------------------------------------------------------------------------- /src/components/Sponsorship/SponsorshipConfig.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import AboutSponsorship from "./Sections/AboutSponsorship"; 3 | import SponsorshipPackages from "./Sections/SponsorshipPackages"; 4 | import Testimonials from "./Sections/Testimonials"; 5 | import Recap from "./Sections/Recap"; 6 | import Footer from "./Sections/Footer"; 7 | 8 | 9 | const sponsorshipLinks = { 10 | "About": { 11 | "url": "#about", 12 | "enabled": true, 13 | "hideLink": false, 14 | "fullHeight": false, 15 | "component": (props) => 16 | }, 17 | "Recap": { 18 | "url": "#recap", 19 | "enabled": true, 20 | "hideLink": false, 21 | "fullHeight": false, 22 | "component": (props) => 23 | }, 24 | "Testimonials": { 25 | "url": "#testimonials", 26 | "enabled": true, 27 | "hideLink": false, 28 | "fullHeight": false, 29 | "component": (props) => 30 | }, 31 | "Packages": { 32 | "url": "#packages", 33 | "enabled": true, 34 | "hideLink": false, 35 | "fullHeight": false, 36 | "component": (props) => 37 | }, 38 | "Footer": { 39 | "url": "#footer", 40 | "enabled": true, 41 | "hideLink": true, 42 | "fullHeight": false, 43 | "skew": false, 44 | "component": (props) =>