├── .DS_Store ├── .expo ├── README.md └── settings.json ├── .vscode └── settings.json ├── HackRPIEventApp2023 ├── .gitignore ├── App.js ├── Box │ ├── Active_Check.js │ ├── Calander.js │ ├── CalanderObject.js │ ├── EventObject.js │ ├── Past_Check.js │ ├── Time_Convert.js │ └── WorkShops.json ├── Components │ ├── CircleProgress.jsx │ └── Notification │ │ ├── README.md │ │ └── cdfc961b25f7b61b980e28eee309bbf.jpg ├── HackerQue │ ├── QueCard.js │ ├── QueEntry.js │ └── Time_Dif.js ├── app.json ├── assets │ ├── adaptive-icon.png │ ├── check.png │ ├── chevron-right.png │ ├── favicon.png │ ├── icon.png │ ├── splash.png │ ├── x.png │ └── xRed.png ├── babel.config.js ├── components │ ├── CircleProgress.jsx │ └── CountdownTimer.jsx ├── information │ ├── Bubble_Tea.jpg │ ├── DeFazio_pizza.jpg │ ├── DiBella_Subs.jpg │ ├── Food.js │ ├── FoodObject.js │ ├── InnerObject.js │ ├── bagels.png │ ├── big_apple.jpg │ └── map │ │ ├── 1.jpg │ │ ├── 2.jpg │ │ ├── 3.jpg │ │ └── image_slideshow.js ├── package-lock.json ├── package.json └── styles.js ├── LICENSE ├── README.md └── package-lock.json /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/.DS_Store -------------------------------------------------------------------------------- /.expo/README.md: -------------------------------------------------------------------------------- 1 | > Why do I have a folder named ".expo" in my project? 2 | 3 | The ".expo" folder is created when an Expo project is started using "expo start" command. 4 | 5 | > What do the files contain? 6 | 7 | - "devices.json": contains information about devices that have recently opened this project. This is used to populate the "Development sessions" list in your development builds. 8 | - "packager-info.json": contains port numbers and process PIDs that are used to serve the application to the mobile device/simulator. 9 | - "settings.json": contains the server configuration that is used to serve the application manifest. 10 | 11 | > Should I commit the ".expo" folder? 12 | 13 | No, you should not share the ".expo" folder. It does not contain any information that is relevant for other developers working on the project, it is specific to your machine. 14 | 15 | Upon project creation, the ".expo" folder is already added to your ".gitignore" file. 16 | -------------------------------------------------------------------------------- /.expo/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "hostType": "lan", 3 | "lanType": "ip", 4 | "dev": true, 5 | "minify": false, 6 | "urlRandomness": null, 7 | "https": false 8 | } 9 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "terminal.integrated.profiles.windows": { 3 | "PowerShell": { 4 | "source": "PowerShell", 5 | "icon": "terminal-powershell", 6 | "args": ["-ExecutionPolicy", "Bypass"] 7 | } 8 | }, 9 | "terminal.integrated.defaultProfile.windows": "PowerShell", 10 | } -------------------------------------------------------------------------------- /HackRPIEventApp2023/.gitignore: -------------------------------------------------------------------------------- 1 | # Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files 2 | 3 | # dependencies 4 | node_modules/ 5 | 6 | # Expo 7 | .expo/ 8 | dist/ 9 | web-build/ 10 | 11 | # Native 12 | *.orig.* 13 | *.jks 14 | *.p8 15 | *.p12 16 | *.key 17 | *.mobileprovision 18 | 19 | # Metro 20 | .metro-health-check* 21 | 22 | # debug 23 | npm-debug.* 24 | yarn-debug.* 25 | yarn-error.* 26 | 27 | # macOS 28 | .DS_Store 29 | *.pem 30 | 31 | # local env files 32 | .env*.local 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/App.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { StyleSheet, View, Text } from "react-native"; 3 | import { NavigationContainer } from "@react-navigation/native"; 4 | import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; 5 | import { Feather } from "@expo/vector-icons"; 6 | import { StatusBar } from "expo-status-bar"; 7 | import Calander from "./Box/Calander"; 8 | import Food from "./information/Food"; 9 | import HackerQue from "./HackerQue/QueEntry.js"; 10 | // import { colors } from './colors'; 11 | import { globalStyles } from "./styles"; 12 | 13 | const Tab = createBottomTabNavigator(); 14 | 15 | function InfoScreen() { 16 | return ( 17 | 18 | 19 | 20 | ); 21 | } 22 | 23 | function HomeScreen() { 24 | return ( 25 | 26 | 27 | 28 | 29 | 30 | ); 31 | } 32 | 33 | function QueueScreen() { 34 | return ( 35 | 36 | 37 | 38 | ); 39 | } 40 | 41 | export default function App() { 42 | return ( 43 | 44 | ({ 46 | tabBarIcon: ({ focused, color, size }) => { 47 | //adding icons 48 | let iconName; 49 | if (route.name === "Info") { 50 | iconName = "info"; 51 | } else if (route.name === "Home") { 52 | iconName = "home"; 53 | } else if (route.name === "Queue") { 54 | iconName = "user"; 55 | } 56 | return ( 57 | 62 | ); 63 | }, 64 | tabBarLabelStyle: { 65 | fontSize: 12, 66 | }, 67 | tabBarStyle: { 68 | backgroundColor: globalStyles.primary, // should this be transparent? 69 | borderTopWidth: 0, // Hide top border of the tab bar 70 | }, 71 | tabBarActiveTintColor: globalStyles.accent, 72 | tabBarInactiveTintColor: "white", 73 | })}> 74 | 75 | 76 | 77 | 78 | 79 | ); 80 | } 81 | 82 | const styles = StyleSheet.create({ 83 | container: { 84 | flex: 1, 85 | backgroundColor: globalStyles.primary, 86 | alignItems: "center", 87 | justifyContent: "center", 88 | }, 89 | text: { 90 | fontSize: globalStyles.fontSize, 91 | fontWeight: globalStyles.fontWeight, 92 | color: globalStyles.text, 93 | }, 94 | circleContainer: { 95 | flexDirection: "row", 96 | alignItems: "center", 97 | justifyContent: "space-around", 98 | }, 99 | circle: { 100 | borderRadius: 50, 101 | overflow: "hidden", 102 | }, 103 | }); 104 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/Box/Active_Check.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | 3 | function Active_Check(date, StartTime, EndTime) { 4 | const [isInTimeRange, setIsInTimeRange] = useState(false); 5 | 6 | const compareTimeRange = () => { 7 | const currentDateTime = new Date(); 8 | // Get the current date in ISO 8601 format 9 | const currentDate = currentDateTime.toISOString().split('T')[0]; 10 | const currentTime = currentDateTime.toLocaleTimeString([], 11 | { hour: '2-digit', minute: '2-digit'}); 12 | if (currentDate === date && currentTime >= StartTime && currentTime <= EndTime) { 13 | setIsInTimeRange(true); 14 | } else { 15 | setIsInTimeRange(false); 16 | } 17 | }; 18 | useEffect(() => { 19 | compareTimeRange(); 20 | const interval = setInterval(() => { 21 | compareTimeRange(); 22 | }, 10000); 23 | return () => clearInterval(interval); 24 | }, [date, StartTime, EndTime]); 25 | return isInTimeRange; 26 | } 27 | 28 | export default Active_Check; -------------------------------------------------------------------------------- /HackRPIEventApp2023/Box/Calander.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { SafeAreaView, ScrollView, StyleSheet } from "react-native"; 3 | import CalanderObject from "./CalanderObject"; 4 | import WorkShops from "./WorkShops.json"; 5 | import Active_Check from "./Active_Check"; 6 | import Past_Check from "./Past_Check"; 7 | import Time_Convert from "./Time_Convert"; 8 | import CountdownTimer from "../Components/CountdownTimer"; 9 | 10 | // calander object that holds all events and handles which are visable, which are active, and which are upcoming. 11 | const Calander = () => { 12 | return ( 13 | 14 | 20 | 21 | 22 | {WorkShops.map((event, index) => { 23 | const Active = Active_Check( 24 | event.WorkShop_Date, 25 | event.WorkShop_StartTime, 26 | event.WorkShop_EndTime 27 | ); 28 | const Past = Past_Check( 29 | event.WorkShop_Date, 30 | event.WorkShop_StartTime, 31 | event.WorkShop_EndTime 32 | ); 33 | const Start_Time = Time_Convert(event.WorkShop_StartTime); 34 | const End_Time = Time_Convert(event.WorkShop_EndTime); 35 | if (Past) { 36 | return null; //if the event is in the past, don't display it 37 | } 38 | if (event.WorkShop_Title == "2023-12-04") { 39 | day = "Saturday"; 40 | } else { 41 | day = "Sunday"; 42 | } 43 | return ( 44 | 53 | ); 54 | })} 55 | 56 | 57 | ); 58 | }; 59 | 60 | const styles = StyleSheet.create({ 61 | CalanderStyle: { 62 | marginTop: 0, 63 | marginBottom: 20, 64 | backgroundColor: "transparent", 65 | flex: 1, 66 | justifyContent: "start", 67 | alignItems: "left", 68 | padding: 10, 69 | }, 70 | }); 71 | 72 | export default Calander; 73 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/Box/CalanderObject.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import { View, StyleSheet } from "react-native"; 3 | import { Feather } from "@expo/vector-icons"; 4 | import EventObject from "./EventObject"; // Import the EventObject component 5 | 6 | //reusable component that ties an event object to it's notification bell 7 | const CalanderObject = ({ 8 | workshop_Title, 9 | Time, 10 | Location, 11 | Presenter, 12 | Description, 13 | isRed, 14 | }) => { 15 | const [isActive, setIsActive] = useState(false); // Define isActive state 16 | 17 | const handleClick = () => { 18 | setIsActive(!isActive); 19 | }; 20 | 21 | return ( 22 | 23 | This line will be use instead if we implement checkCondition() function 31 | /> 32 | 36 | 44 | 45 | 46 | ); 47 | }; 48 | 49 | const styles = StyleSheet.create({ 50 | container: { 51 | flexDirection: "row", // Arrange children horizontally 52 | alignItems: "center", // Center children vertically 53 | backgroundColor: "transparent", // Replace with your desired background color 54 | padding: 10, 55 | borderRadius: 10, 56 | marginBottom: 0, 57 | }, 58 | notifBox: { 59 | width: 60, 60 | height: 150, 61 | borderWidth: 3, 62 | borderRadius: 20, 63 | padding: 10, 64 | marginLeft: 20, 65 | justifyContent: "center", 66 | alignItems: "center", 67 | marginBottom: 0, 68 | zIndex: 1, 69 | }, 70 | }); 71 | 72 | export default CalanderObject; -------------------------------------------------------------------------------- /HackRPIEventApp2023/Box/EventObject.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import { View, Text, TouchableOpacity, StyleSheet} from "react-native"; 3 | import { AntDesign } from "@expo/vector-icons"; 4 | 5 | // Reusable component that that creates the main content box 6 | const EventObject = ({ 7 | workshop_title, 8 | time, 9 | location, 10 | presenter, 11 | description, 12 | isRed, 13 | }) => { 14 | const [expanded, setExpanded] = useState(false); 15 | 16 | const toggleExpansion = () => { 17 | setExpanded(!expanded); 18 | }; 19 | 20 | return ( 21 | 22 | 29 | 30 | {workshop_title} 31 | {time} 32 | {"Location: " +location} 33 | {"Presenter: " +presenter} 34 | {expanded && {"\t" + description}} 35 | 36 | 37 | 38 | 39 | 40 | 41 | ); 42 | }; 43 | 44 | const styles = StyleSheet.create({ 45 | rectangle: { 46 | width: 300, 47 | height: 150, 48 | borderWidth: 1, 49 | borderColor: "#000", 50 | borderRadius: 20, 51 | padding: 10, 52 | left: 10, 53 | justifyContent: "center", 54 | alignItems: "left", 55 | 56 | marginBottom: 0, 57 | backgroundColor: "white", 58 | }, 59 | iconContainer: { 60 | left: 130, 61 | top: 5, 62 | }, 63 | expanded: { 64 | height: 300, // Adjust the height as needed 65 | }, 66 | redBackground: { 67 | backgroundColor: "red", 68 | }, 69 | 70 | workshop_title: { 71 | left:10, 72 | fontSize: 18, 73 | fontWeight: "bold", 74 | }, 75 | time: { 76 | left:10, 77 | fontSize: 14, 78 | }, 79 | location: { 80 | left:10, 81 | fontSize: 14, 82 | }, 83 | presenter: { 84 | left:10, 85 | fontSize: 14, 86 | }, 87 | description: { 88 | left:10, 89 | fontSize: 14, 90 | marginTop: 10, 91 | marginRight: 10, 92 | }, 93 | }); 94 | 95 | export default EventObject; 96 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/Box/Past_Check.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | 3 | function Past_Check(date, StartTime, EndTime) { 4 | const [isTimePast, setIsTimePast] = useState(false); 5 | const Check_Time = () => { 6 | const currentDateTime = new Date(); 7 | // Get the current date in ISO 8601 format 8 | const currentDate = currentDateTime.toISOString().split('T')[0]; 9 | const currentTime = currentDateTime.toLocaleTimeString([], 10 | { hour: '2-digit', minute: '2-digit'}); 11 | if (currentDate === date && currentTime >= EndTime || currentDate > date) { 12 | setIsTimePast(true); 13 | } else { 14 | setIsTimePast(false); 15 | } 16 | }; 17 | useEffect(() => { 18 | Check_Time(); 19 | const interval = setInterval(() => { 20 | Check_Time(); 21 | }, 10000); 22 | return () => clearInterval(interval); 23 | }, [date, StartTime, EndTime]); 24 | return isTimePast; 25 | } 26 | export default Past_Check; -------------------------------------------------------------------------------- /HackRPIEventApp2023/Box/Time_Convert.js: -------------------------------------------------------------------------------- 1 | function Time_Converte(Time){ 2 | const Hour = parseInt(Time.split(":")[0]); 3 | const Minute = Time.split(":")[1]; 4 | if(0 <= Hour && Hour <= 11){ 5 | return Hour + ":" + Minute + " AM"; 6 | } 7 | else if(Hour == 0){ 8 | return "12:" + Minute + " AM"; 9 | } 10 | else{ 11 | return Hour - 12 + ":" + Minute + " PM"; 12 | } 13 | } 14 | export default Time_Converte; 15 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/Box/WorkShops.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "WorkShop_Title": "Participant Check-In", 4 | "WorkShop_Presenter": "TBD", 5 | "WorkShop_Date": "2024-11-28", 6 | "WorkShop_StartTime": "10:00", 7 | "WorkShop_EndTime": "18:00", 8 | "WorkShop_Location": "DCC Lobby", 9 | "WorkShop_Description": "TBD" 10 | }, 11 | { 12 | "WorkShop_Title": "Opening Ceremony begins", 13 | "WorkShop_Presenter": "TBD", 14 | "WorkShop_Date": "2024-12-04", 15 | "WorkShop_StartTime": "11:00", 16 | "WorkShop_EndTime": "11:30", 17 | "WorkShop_Location": "TBD", 18 | "WorkShop_Description": "TBD" 19 | }, 20 | { 21 | "WorkShop_Title": "Opening Ceremony", 22 | "WorkShop_Presenter": "TBD", 23 | "WorkShop_Date": "2024-12-04", 24 | "WorkShop_StartTime": "11:00", 25 | "WorkShop_EndTime": "12:00", 26 | "WorkShop_Location": "DCC 308", 27 | "WorkShop_Description": "This is here just for presentation purposes. \n\tThis is here just for presentation purposes." 28 | }, 29 | { 30 | "WorkShop_Title": "API demos", 31 | "WorkShop_Presenter": "TBD", 32 | "WorkShop_Date": "2024-12-04", 33 | "WorkShop_StartTime": "11:30", 34 | "WorkShop_EndTime": "12:00", 35 | "WorkShop_Location": "TBD", 36 | "WorkShop_Description": "TBD" 37 | }, 38 | { 39 | "WorkShop_Title": "Hacking Begins @ 12", 40 | "WorkShop_Presenter": "TBD", 41 | "WorkShop_Date": "2024-12-04", 42 | "WorkShop_StartTime": "12:00", 43 | "WorkShop_EndTime": "12:30", 44 | "WorkShop_Location": "TBD", 45 | "WorkShop_Description": "TBD" 46 | }, 47 | { 48 | "WorkShop_Title": "Team Pairing", 49 | "WorkShop_Presenter": "TBD", 50 | "WorkShop_Date": "2024-12-04", 51 | "WorkShop_StartTime": "12:00", 52 | "WorkShop_EndTime": "12:30", 53 | "WorkShop_Location": "TBD", 54 | "WorkShop_Description": "TBD" 55 | }, 56 | { 57 | "WorkShop_Title": "Patient Safety", 58 | "WorkShop_Presenter": "TBD", 59 | "WorkShop_Date": "2024-12-04", 60 | "WorkShop_StartTime": "12:00", 61 | "WorkShop_EndTime": "12:30", 62 | "WorkShop_Location": "DCC 318", 63 | "WorkShop_Description": "This workshop is designed for hackers interested in the Patient Safety Tech Prize. It will give you background on patient safety as an urgent issue and will help inspire you to spend your weekend hacking together a project that has the potential to save lives! The team with the best tech-enabled solution will win $1000." 64 | }, 65 | { 66 | "WorkShop_Title": "Intro to Tech Stack Workshop", 67 | "WorkShop_Presenter": "TBD", 68 | "WorkShop_Date": "2024-12-04", 69 | "WorkShop_StartTime": "12:30", 70 | "WorkShop_EndTime": "13:30", 71 | "WorkShop_Location": "DCC 308", 72 | "WorkShop_Description": "TBD" 73 | }, 74 | { 75 | "WorkShop_Title": "Lunch", 76 | "WorkShop_Presenter": "TBD", 77 | "WorkShop_Date": "2024-12-04", 78 | "WorkShop_StartTime": "13:00", 79 | "WorkShop_EndTime": "14:00", 80 | "WorkShop_Location": "DCC Lounge", 81 | "WorkShop_Description": "TBD" 82 | }, 83 | { 84 | "WorkShop_Title": "MERN Web Dev Workshop", 85 | "WorkShop_Presenter": "Yash Kaul", 86 | "WorkShop_Date": "2024-12-04", 87 | "WorkShop_StartTime": "13:30", 88 | "WorkShop_EndTime": "14:30", 89 | "WorkShop_Location": "DCC 308", 90 | "WorkShop_Description": "Gain hands-on experience with MongoDB—covering schema validation, client to database connection, and implementing API controllers. Learn about Express: including routing, middleware, and error handling. Utilize React to quickly build interactive applications with state management. Explore Node.js and Npm to manage package dependenciesand build/run/test your application easily. This workshop aims to introduce the basics of MERN applications for use in thehackathon and discuss potential considerations for real world use and deployment." 91 | }, 92 | { 93 | "WorkShop_Title": "Mobile DevWorkshop", 94 | "WorkShop_Presenter": "TBD", 95 | "WorkShop_Date": "2024-12-04", 96 | "WorkShop_StartTime": "13:30", 97 | "WorkShop_EndTime": "14:30", 98 | "WorkShop_Location": "DCC 318", 99 | "WorkShop_Description": "TBD" 100 | }, 101 | { 102 | "WorkShop_Title": "Quantum", 103 | "WorkShop_Presenter": "TBD", 104 | "WorkShop_Date": "2024-12-04", 105 | "WorkShop_StartTime": "14:30", 106 | "WorkShop_EndTime": "15:30", 107 | "WorkShop_Location": "DCC 308", 108 | "WorkShop_Description": "TBD" 109 | }, 110 | { 111 | "WorkShop_Title": "Scrum Workshop", 112 | "WorkShop_Presenter": "TBD", 113 | "WorkShop_Date": "2024-12-04", 114 | "WorkShop_StartTime": "15:30", 115 | "WorkShop_EndTime": "16:30", 116 | "WorkShop_Location": "DCC 318", 117 | "WorkShop_Description": "TBD" 118 | }, 119 | { 120 | "WorkShop_Title": "Hacking the Machine for Fun (and sometimes profit)", 121 | "WorkShop_Presenter": "Dr. Brian Callahan (w/ Ayah Tharwat )", 122 | "WorkShop_Date": "2024-12-04", 123 | "WorkShop_StartTime": "16:30", 124 | "WorkShop_EndTime": "17:30", 125 | "WorkShop_Location": "DCC 318", 126 | "WorkShop_Description": "Securing software requires developers to learn how to think like an attacker; you cannot defend against what you cannot imagine going wrong with your software. There are a wide variety of potential attacks, but learning just a basic few can go a very long way towards improving your coding skills. In this workshop, we will participate in a set of interactive Capture the Flag (CTF) challenges designed to demonstrate some of the ways attackers think. Alongside hacking our machines, we will also learn some secure coding paradigms to protect against these attacks. By the end of the workshop, you will have a newfound appreciation for the importance of secure coding and be armed with the ability to build more secure software." 127 | }, 128 | { 129 | "WorkShop_Title": "Design, Thinking, and Technical Innovation", 130 | "WorkShop_Presenter": "Kylinn Askew", 131 | "WorkShop_Date": "2024-12-04", 132 | "WorkShop_StartTime": "16:30", 133 | "WorkShop_EndTime": "17:30", 134 | "WorkShop_Location": "DCC 308", 135 | "WorkShop_Description": "Explore the power of design thinking to drive innovation and foster collaboration to build strong technical products and startups. Learn how to harness creative problem-solving, empathetic user-centric approaches, and cross-functional teamwork to create products that not only meet technical requirements but also exceed user expectations" 136 | }, 137 | { 138 | "WorkShop_Title": "Password Exploitation - FBI Albany", 139 | "WorkShop_Presenter": "Alex Vargas & Ryan Gallagher", 140 | "WorkShop_Date": "2024-12-04", 141 | "WorkShop_StartTime": "17:30", 142 | "WorkShop_EndTime": "18:30", 143 | "WorkShop_Location": "DCC 318", 144 | "WorkShop_Description": "Join the FBI as they explain the math behind password complexity, including tactics for how to attack andbreak passwords. They will cover steps on how to extract a password hash from a file and run it with hashcat to crack the password." 145 | }, 146 | { 147 | "WorkShop_Title": "Global Foundries", 148 | "WorkShop_Presenter": "TBD", 149 | "WorkShop_Date": "2024-12-04", 150 | "WorkShop_StartTime": "17:30", 151 | "WorkShop_EndTime": "18:30", 152 | "WorkShop_Location": "DCC 327", 153 | "WorkShop_Description": "TBD" 154 | }, 155 | { 156 | "WorkShop_Title": "Hugging Face", 157 | "WorkShop_Presenter": "Raven Levitt", 158 | "WorkShop_Date": "2024-12-04", 159 | "WorkShop_StartTime": "18:30", 160 | "WorkShop_EndTime": "19:30", 161 | "WorkShop_Location": "DCC 327", 162 | "WorkShop_Description": "Have a hack that needs AI but no idea where to start? In this workshop I’ll go over how to use the Hugging Face API to easily leverage thousands of different machine learning models to tackle whatever challenge you’re dealing with, be it text-generation, object detection, or just about any other machine learning challenge, hugging face is a great place to start! After a short presentation we’ll hold a mini competition for the best use of the API, and there just might be prizes…" 163 | }, 164 | { 165 | "WorkShop_Title": "Small Club", 166 | "WorkShop_Presenter": "TBD", 167 | "WorkShop_Date": "2024-12-04", 168 | "WorkShop_StartTime": "18:30", 169 | "WorkShop_EndTime": "23:00", 170 | "WorkShop_Location": "DCC 318", 171 | "WorkShop_Description": "TBD" 172 | }, 173 | { 174 | "WorkShop_Title": "Dinner", 175 | "WorkShop_Presenter": "TBD", 176 | "WorkShop_Date": "2024-12-04", 177 | "WorkShop_StartTime": "19:00", 178 | "WorkShop_EndTime": "20:00", 179 | "WorkShop_Location": "DCC Lounge", 180 | "WorkShop_Description": "TBD" 181 | }, 182 | { 183 | "WorkShop_Title": "Title to come", 184 | "WorkShop_Presenter": "TBD", 185 | "WorkShop_Date": "2024-12-04", 186 | "WorkShop_StartTime": "19:30", 187 | "WorkShop_EndTime": "20:30", 188 | "WorkShop_Location": "Forge", 189 | "WorkShop_Description": "TBD" 190 | }, 191 | { 192 | "WorkShop_Title": "!Light MLH Event", 193 | "WorkShop_Presenter": "TBD", 194 | "WorkShop_Date": "2024-12-04", 195 | "WorkShop_StartTime": "21:00", 196 | "WorkShop_EndTime": "22:00", 197 | "WorkShop_Location": "DCC 308", 198 | "WorkShop_Description": "TBD" 199 | }, 200 | { 201 | "WorkShop_Title": "Ugliest Code Competition", 202 | "WorkShop_Presenter": "TBD", 203 | "WorkShop_Date": "2024-12-04", 204 | "WorkShop_StartTime": "22:00", 205 | "WorkShop_EndTime": "23:00", 206 | "WorkShop_Location": "DCC 308", 207 | "WorkShop_Description": "TBD" 208 | }, 209 | { 210 | "WorkShop_Title": "Boba", 211 | "WorkShop_Presenter": "TBD", 212 | "WorkShop_Date": "2024-12-04", 213 | "WorkShop_StartTime": "23:00", 214 | "WorkShop_EndTime": "23:30", 215 | "WorkShop_Location": "DCC Lounge", 216 | "WorkShop_Description": "TBD" 217 | }, 218 | { 219 | "WorkShop_Title": "Movie Starts", 220 | "WorkShop_Presenter": "TBD", 221 | "WorkShop_Date": "2024-12-04", 222 | "WorkShop_StartTime": "23:00", 223 | "WorkShop_EndTime": "24:00", 224 | "WorkShop_Location": "DCC 324", 225 | "WorkShop_Description": "TBD" 226 | }, 227 | { 228 | "WorkShop_Title": "Midnight Snacks", 229 | "WorkShop_Presenter": "TBD", 230 | "WorkShop_Date": "2024-12-05", 231 | "WorkShop_StartTime": "00:00", 232 | "WorkShop_EndTime": "02:00", 233 | "WorkShop_Location": "DCC Lounge", 234 | "WorkShop_Description": "TBD" 235 | }, 236 | { 237 | "WorkShop_Title": "Daylight Savings Party", 238 | "WorkShop_Presenter": "TBD", 239 | "WorkShop_Date": "2024-12-05", 240 | "WorkShop_StartTime": "01:00", 241 | "WorkShop_EndTime": "02:00", 242 | "WorkShop_Location": "DCC Lounge", 243 | "WorkShop_Description": "TBD" 244 | }, 245 | { 246 | "WorkShop_Title": "Breakfast", 247 | "WorkShop_Presenter": "TBD", 248 | "WorkShop_Date": "2024-12-05", 249 | "WorkShop_StartTime": "07:00", 250 | "WorkShop_EndTime": "09:00", 251 | "WorkShop_Location": "DCC Lounge", 252 | "WorkShop_Description": "TBD" 253 | }, 254 | { 255 | "WorkShop_Title": "Submissions Due", 256 | "WorkShop_Presenter": "TBD", 257 | "WorkShop_Date": "2024-12-05", 258 | "WorkShop_StartTime": "10:00", 259 | "WorkShop_EndTime": "11:00", 260 | "WorkShop_Location": "TBD", 261 | "WorkShop_Description": "TBD" 262 | }, 263 | { 264 | "WorkShop_Title": "Hacking Ends @ 12", 265 | "WorkShop_Presenter": "TBD", 266 | "WorkShop_Date": "2024-12-05", 267 | "WorkShop_StartTime": "11:30", 268 | "WorkShop_EndTime": "12:00", 269 | "WorkShop_Location": "TBD", 270 | "WorkShop_Description": "TBD" 271 | }, 272 | { 273 | "WorkShop_Title": "Showcase", 274 | "WorkShop_Presenter": "TBD", 275 | "WorkShop_Date": "2024-12-05", 276 | "WorkShop_StartTime": "12:00", 277 | "WorkShop_EndTime": "15:00", 278 | "WorkShop_Location": "DCC 308", 279 | "WorkShop_Description": "TBD" 280 | }, 281 | { 282 | "WorkShop_Title": "Lunch", 283 | "WorkShop_Presenter": "TBD", 284 | "WorkShop_Date": "2024-12-05", 285 | "WorkShop_StartTime": "13:00", 286 | "WorkShop_EndTime": "14:00", 287 | "WorkShop_Location": "DCC Lounge", 288 | "WorkShop_Description": "TBD" 289 | }, 290 | { 291 | "WorkShop_Title": "Closing Ceremony", 292 | "WorkShop_Presenter": "TBD", 293 | "WorkShop_Date": "2024-12-05", 294 | "WorkShop_StartTime": "15:00", 295 | "WorkShop_EndTime": "16:00", 296 | "WorkShop_Location": "DCC 308", 297 | "WorkShop_Description": "TBD" 298 | }, 299 | { 300 | "WorkShop_Title": "Event Closes", 301 | "WorkShop_Presenter": "TBD", 302 | "WorkShop_Date": "2024-12-05", 303 | "WorkShop_StartTime": "16:00", 304 | "WorkShop_EndTime": "16:30", 305 | "WorkShop_Location": "TBD", 306 | "WorkShop_Description": "TBD" 307 | } 308 | ] 309 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/Components/CircleProgress.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { View, StyleSheet } from 'react-native'; 3 | import { Svg, Circle } from 'react-native-svg'; 4 | 5 | const style = StyleSheet.create({ 6 | circleBackground: { 7 | fill: 'none', 8 | stroke: 'red', 9 | }, 10 | circleProgress: { 11 | fill: 'none', 12 | stroke: 'white', // You can use the variable here if needed 13 | }, 14 | }); 15 | 16 | const CircleProgress = ({ percentage, circleWidth }) => { 17 | const radius = circleWidth / 2 - 4; 18 | const dashArray = radius * Math.PI * 2; 19 | const dashOffset = dashArray - (dashArray * percentage) / 100; 20 | return ( 21 | 22 | 23 | 30 | 31 | 45 | 46 | 47 | ); 48 | }; 49 | 50 | export default CircleProgress; 51 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/Components/Notification/README.md: -------------------------------------------------------------------------------- 1 | To send notification to user's device. 2 | For IOS device we need to get APNs Key: 3 | Step 1: Access Apple Developer Account: 4 | Go to the Apple Developer website: https://developer.apple.com. 5 | Sign in to your Apple Developer account using your Apple ID and password. 6 | 7 | Step 2: Create an App ID 8 | Navigate to the "Certificates, Identifiers & Profiles" section. 9 | Select "App IDs" from the left-hand menu. 10 | Click the "+" button to create a new App ID. 11 | Fill in the required information, including a unique Bundle ID for your app. Make sure your Bundle ID is correct and corresponds to your app. 12 | 13 | Step 3: Configure Push Notifications 14 | In the "Capabilities" section of your App ID, enable "Push Notifications." 15 | 16 | Step 4: Create an APNs Key 17 | In the same "Capabilities" section, under "Push Notifications," you'll find a "Create Key" button. Click on it to create a new APNs Key. 18 | Give the key a name (e.g., "MyApp APNs Key"). 19 | Select the App ID you created earlier in the "Key" configuration. 20 | Click "Continue." 21 | Review the information and click "Register" to create the key. 22 | 23 | Step 5: Download Your APNs Key 24 | After registering the key, you'll be presented with a confirmation page. Click the "Download" button to save the key to your computer. 25 | 26 | Puch notifaction method should be in beckend. 27 | Need to download express, apn, body-parser from npm. 28 | example code of creating connection: 29 | const express = require('express'); 30 | const apn = require('apn'); 31 | const admin = require('firebase-admin'); 32 | 33 | const app = express(); 34 | app.use(express.json()); 35 | 36 | // Configure APNs for iOS 37 | const apnProvider = new apn.Provider({ 38 | token: { 39 | key: 'path/to/your/APNsKey.p8', 40 | keyId: 'yourKeyID', 41 | teamId: 'yourTeamID', 42 | }, 43 | production: false, // Set to true for production environment 44 | }); 45 | 46 | // Configure FCM for Android 47 | const serviceAccount = require('path/to/your/serviceAccountKey.json'); 48 | admin.initializeApp({ 49 | credential: admin.credential.cert(serviceAccount), 50 | }); 51 | 52 | app.post('/send-notification', (req, res) => { 53 | const { deviceToken, fcmToken, message } = req.body; 54 | 55 | if (deviceToken) { 56 | // Send APNs notification for iOS devices 57 | const apnNotification = new apn.Notification(); 58 | apnNotification.alert = message; 59 | apnProvider.send(apnNotification, deviceToken).then(result => { 60 | console.log('APNs Notification:', result); 61 | }).catch(error => { 62 | console.error('APNs Error:', error); 63 | }); 64 | } 65 | 66 | if (fcmToken) { 67 | // Send FCM notification for Android devices 68 | const fcmPayload = { 69 | notification: { 70 | title: 'Notification Title', 71 | body: message, 72 | }, 73 | }; 74 | admin.messaging().sendToDevice(fcmToken, fcmPayload) 75 | .then(response => { 76 | console.log('FCM Notification:', response); 77 | }) 78 | .catch(error => { 79 | console.error('FCM Error:', error); 80 | }); 81 | } 82 | 83 | res.json({ success: true }); 84 | }); 85 | 86 | 87 | 88 | ------------------------------------------------------------------------- 89 | For Android System (Using Google Firebase) 90 | 91 | **May include some cost -> 92 | https://firebase.google.com/pricing 93 | 94 | 95 | Step 1: Create a blank react-native app 96 | 97 | Step 2 : Creating a Firebase Project or use a existing one: 98 | https://console.firebase.google.com/u/0/ 99 | 100 | Click on the project and enter the project’s dashboard. Look for ​Cloud Messaging​ tab and click on android. 101 | 102 | During the process, it will ask for app’s ​package name​ and provide ​google-services.json You will find your package name from AndroidManifest.xml file. And you will need to download google-services.json. Copy google-services.json file into the Project. 103 | 104 | Step 3 : Setup for react-native-firebase v 5.6.0 105 | -> Now install by: 106 | npm install react-native-firebase@5.6.0 107 | -> Similarly, install: 108 | npm install @react-native-community/async-storage 109 | 110 | 111 | -> On ​build.gradle​ file add this line: 112 | 113 | buildscript { 114 | //... 115 | dependencies { 116 | //... 117 | classpath 'com.google.gms:google-services:4.3.3’ // (Add this line) 118 | //... 119 | } 120 | } 121 | 122 | -> On your​ app/build.gradle​ add the following lines dependencies 123 | 124 | //... 125 | dependencies { 126 | //... 127 | implementation "com.google.android.gms:play-services-base:16.1.0" 128 | implementation "com.google.firebase:firebase-core:16.0.9" 129 | implementation "com.google.firebase:firebase-messaging:18.0.0" 130 | implementation "com.google.firebase:firebase-analytics:15.0.0" 131 | implementation "com.google.firebase:firebase-config:17.0.0" 132 | implementation 'me.leolin:ShortcutBadger:1.1.21@aar' 133 | //... 134 | } 135 | //... 136 | apply plugin: 'com.google.gms.google-services' 137 | 138 | -> import some packages in your android/app/src/main/java/com/rnpush/MainApplication.java: 139 | 140 | //... 141 | import com.facebook.react.ReactInstanceManager; 142 | import com.facebook.react.ReactNativeHost; 143 | import com.facebook.react.ReactPackage; 144 | import com.facebook.soloader.SoLoader; 145 | import java.lang.reflect.InvocationTargetException; 146 | import java.util.List; 147 | 148 | //Firebase Dependencies (Add these lines) 149 | import io.invertase.firebase.messaging.RNFirebaseMessagingPackage; 150 | import io.invertase.firebase.links.RNFirebaseLinksPackage; 151 | import io.invertase.firebase.config.RNFirebaseRemoteConfigPackage; 152 | import io.invertase.firebase.notifications.RNFirebaseNotificationsPackage; 153 | //... 154 | 155 | protected List getPackages() { 156 | @SuppressWarnings("UnnecessaryLocalVariable") 157 | List packages = new PackageList(this).getPackages(); 158 | //… 159 | // Add these lines 160 | packages.add(new RNFirebaseMessagingPackage()); 161 | packages.add(new RNFirebaseLinksPackage()); 162 | packages.add(new RNFirebaseRemoteConfigPackage()); 163 | packages.add(new RNFirebaseNotificationsPackage()); 164 | return packages; 165 | } 166 | 167 | -> add the following lines to your ​AndroidManifest.xml: 168 | 169 | 170 | 171 | 172 | 173 | ... 174 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | After the setup, we will need JavaScript Code to actually build the function. After the code is successfully implement, we can test our code by run the react native app on device: 213 | -> react-native run-android 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/Components/Notification/cdfc961b25f7b61b980e28eee309bbf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/Components/Notification/cdfc961b25f7b61b980e28eee309bbf.jpg -------------------------------------------------------------------------------- /HackRPIEventApp2023/HackerQue/QueCard.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { View, Text, StyleSheet } from "react-native"; 3 | import CircleProgress from "../Components/CircleProgress"; 4 | import calculateTimeDifference from "../HackerQue/Time_Dif"; 5 | import { useState, useEffect } from "react"; 6 | 7 | function QueCard() { 8 | const Start_Time = "2023-11-10T10:00:00Z"; 9 | const Position = 20; 10 | const Total = 100; 11 | const [Time_In_Queue, setTimeInQueueHours] = useState( 12 | calculateTimeDifference(Start_Time) 13 | ); 14 | 15 | useEffect(() => { 16 | // Update the time difference every second 17 | const intervalId = setInterval(() => { 18 | setTimeInQueueHours(calculateTimeDifference(Start_Time)); 19 | }, 1000); 20 | 21 | // Cleanup the interval when the component is unmounted 22 | return () => clearInterval(intervalId); 23 | }, []); 24 | 25 | return ( 26 | 27 | {/* Inner View for heading */} 28 | 29 | Issue: HTML 30 | 31 | 32 | 33 | 37 | 38 | 39 | TIQ: {Time_In_Queue} 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | Position: {Position} 48 | 49 | 50 | 51 | ); 52 | } 53 | 54 | const styles = StyleSheet.create({ 55 | box: { 56 | width: 300, 57 | height: 350, 58 | borderRadius: 15, 59 | marginBottom: 20, 60 | backgroundColor: "#191919", 61 | }, 62 | row: { 63 | flexDirection: "row", 64 | justifyContent: "space-between", 65 | width: 300, 66 | }, 67 | subBox: { 68 | width: 150, 69 | height: 200, 70 | alignContent: "center", 71 | alignItems: "center", 72 | justifyContent: "center", 73 | }, 74 | heading: { 75 | width: 300, 76 | height: 50, 77 | backgroundColor: "#910307", 78 | justifyContent: "center", // To vertically center the text 79 | alignItems: "center", // To horizontally center the text 80 | borderRadius: 15, 81 | borderWidth: 3, 82 | borderColor: "#FFFFFF", 83 | }, 84 | circleTemp: { 85 | width: 130, 86 | height: 130, 87 | borderRadius: 100, 88 | margin: 20, 89 | backgroundColor: "#FFFFFF", 90 | }, 91 | textHeader: { 92 | color: "#ffffff", 93 | fontSize: 20, 94 | fontWeight: "bold", 95 | }, 96 | textBody: { 97 | color: "#ffffff", 98 | fontSize: 20, 99 | }, 100 | }); 101 | 102 | export default QueCard; 103 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/HackerQue/QueEntry.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import { View, Text, TextInput, StyleSheet } from "react-native"; 3 | import SwipeButton from "rn-swipe-button"; 4 | import checkIcon from "../assets/xRed.png"; 5 | import slideIcon from "../assets/chevron-right.png"; 6 | import QueCard from "./QueCard"; 7 | 8 | const QueEntry = ({ name, roomNumber, problemType }) => { 9 | const [inQue, setQue] = useState(false); 10 | const [stateName, setName] = useState(""); 11 | const [stateRoomNumber, setRoomNumber] = useState(""); 12 | const [stateProblemType, setProblemType] = useState(""); 13 | 14 | const toggleQue = () => { 15 | if (!inQue) { 16 | } 17 | setQue(!inQue); 18 | }; 19 | 20 | const handleNameChange = (name) => { 21 | setName(name); 22 | }; 23 | 24 | const handleRoomNumberChange = (roomNumber) => { 25 | setRoomNumber(roomNumber); 26 | }; 27 | 28 | const handleProblemTypeChange = (problemType) => { 29 | setProblemType(problemType); 30 | }; 31 | 32 | const submitForm = () => { 33 | // You can perform actions with the entered data here. 34 | // For example, send the data to a server or perform local processing. 35 | 36 | // add error checking for vals 37 | if (!inQue) { 38 | // enter que code 39 | console.log("Name:", stateName); 40 | console.log("Room Number:", stateRoomNumber); 41 | console.log("Problem Type:", stateProblemType); 42 | // value checking 43 | } else { 44 | // exit que code 45 | console.log("exiting que"); 46 | // reset vals 47 | setName(""); 48 | setRoomNumber(""); 49 | setProblemType(""); 50 | } 51 | toggleQue(); 52 | // jump to other page 53 | }; 54 | 55 | return ( 56 | 57 | {inQue ? ( 58 | 59 | 60 | 61 | ) : ( 62 | 63 | Name: 64 | 69 | Room Number: 70 | 75 | Type of Problem: 76 | 81 | 82 | )} 83 | 100 | 101 | ); 102 | }; 103 | 104 | const styles = StyleSheet.create({ 105 | container: { 106 | margin: 20, 107 | }, 108 | input: { 109 | height: 60, 110 | width: 300, 111 | borderColor: "white", 112 | borderWidth: 2, 113 | marginBottom: 10, 114 | paddingHorizontal: 10, 115 | borderRadius: 8, 116 | color: "white", 117 | }, 118 | text: { 119 | color: "#ffffff", 120 | fontSize: 15, 121 | padding: 5, 122 | }, 123 | buttonContainer: { 124 | borderWidth: 2, 125 | borderRadius: 100, 126 | }, 127 | rail: { 128 | borderRadius: 100, 129 | borderWidth: 3, 130 | }, 131 | 132 | thumbIcon: { 133 | borderRadius: 100, 134 | borderWidth: 2, 135 | borderColor: "#FFFFFF", 136 | height: 20, 137 | width: 20, 138 | }, 139 | }); 140 | 141 | export default QueEntry; 142 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/HackerQue/Time_Dif.js: -------------------------------------------------------------------------------- 1 | function formatTime(hours, minutes, seconds) { 2 | return `${hours}:${minutes}:${seconds}`; 3 | } 4 | 5 | // Function to calculate and return time difference 6 | function calculateTimeDifference(t) { 7 | // Function to update current time every second 8 | function updateCurrentTime() { 9 | currentTime.setTime(currentTime.getTime() + 1000); 10 | } 11 | 12 | // Create a Date object for the current time 13 | const currentTime = new Date(); 14 | 15 | // Parse the input time string to create a Date object 16 | const targetTime = new Date(t); 17 | 18 | // Calculate the initial time difference in milliseconds 19 | let timeDifference = currentTime.getTime() - targetTime.getTime(); 20 | 21 | // Convert the initial time difference to hours, minutes, and seconds 22 | let hours = Math.floor(timeDifference / (1000 * 60 * 60)); 23 | let minutes = Math.floor((timeDifference % (1000 * 60 * 60)) / (1000 * 60)); 24 | let seconds = Math.floor((timeDifference % (1000 * 60)) / 1000); 25 | 26 | // Update the current time every second and recalculate the time difference 27 | const intervalId = setInterval(() => { 28 | updateCurrentTime(); 29 | timeDifference = currentTime.getTime() - targetTime.getTime(); 30 | hours = Math.floor(timeDifference / (1000 * 60 * 60)); 31 | minutes = Math.floor((timeDifference % (1000 * 60 * 60)) / (1000 * 60)); 32 | seconds = Math.floor((timeDifference % (1000 * 60)) / 1000); 33 | }, 1000); 34 | 35 | // Return an object with the hours, minutes, and seconds 36 | return formatTime(hours, minutes, seconds); 37 | } 38 | 39 | // Export the calculateTimeDifference function 40 | module.exports = calculateTimeDifference; -------------------------------------------------------------------------------- /HackRPIEventApp2023/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo": { 3 | "name": "HackRPIEventApp2023", 4 | "slug": "HackRPIEventApp2023", 5 | "version": "1.0.0", 6 | "orientation": "portrait", 7 | "icon": "./assets/icon.png", 8 | "userInterfaceStyle": "light", 9 | "splash": { 10 | "image": "./assets/splash.png", 11 | "resizeMode": "contain", 12 | "backgroundColor": "#ffffff" 13 | }, 14 | "assetBundlePatterns": [ 15 | "**/*" 16 | ], 17 | "ios": { 18 | "supportsTablet": true 19 | }, 20 | "android": { 21 | "adaptiveIcon": { 22 | "foregroundImage": "./assets/adaptive-icon.png", 23 | "backgroundColor": "#ffffff" 24 | } 25 | }, 26 | "web": { 27 | "favicon": "./assets/favicon.png" 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/assets/adaptive-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/assets/adaptive-icon.png -------------------------------------------------------------------------------- /HackRPIEventApp2023/assets/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/assets/check.png -------------------------------------------------------------------------------- /HackRPIEventApp2023/assets/chevron-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/assets/chevron-right.png -------------------------------------------------------------------------------- /HackRPIEventApp2023/assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/assets/favicon.png -------------------------------------------------------------------------------- /HackRPIEventApp2023/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/assets/icon.png -------------------------------------------------------------------------------- /HackRPIEventApp2023/assets/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/assets/splash.png -------------------------------------------------------------------------------- /HackRPIEventApp2023/assets/x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/assets/x.png -------------------------------------------------------------------------------- /HackRPIEventApp2023/assets/xRed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/assets/xRed.png -------------------------------------------------------------------------------- /HackRPIEventApp2023/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function(api) { 2 | api.cache(true); 3 | return { 4 | presets: ['babel-preset-expo'], 5 | }; 6 | }; 7 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/components/CircleProgress.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { View, StyleSheet } from 'react-native'; 3 | import { Svg, Circle } from 'react-native-svg'; 4 | 5 | const style = StyleSheet.create({ 6 | circleBackground: { 7 | fill: 'none', 8 | stroke: 'red', 9 | }, 10 | circleProgress: { 11 | fill: 'none', 12 | stroke: 'white', // You can use the variable here if needed 13 | }, 14 | }); 15 | 16 | const CircleProgress = ({ percentage, circleWidth }) => { 17 | const radius = circleWidth / 2 - 4; 18 | const dashArray = radius * Math.PI * 2; 19 | const dashOffset = dashArray - (dashArray * percentage) / 100; 20 | return ( 21 | 22 | 23 | 30 | 31 | 45 | 46 | 47 | ); 48 | }; 49 | 50 | export default CircleProgress; 51 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/components/CountdownTimer.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from "react"; 2 | import { StatusBar, Dimensions } from "react-native"; 3 | import { StyleSheet, View, Text } from "react-native"; 4 | import CircleProgress from "./CircleProgress"; 5 | 6 | const Timer = ({ percentage, circleSize, timeUnit, timeRemaining }) => { 7 | return ( 8 | 13 | 14 | 15 | {timeRemaining} 16 | 6 ? 10 : 14 }, 20 | ]}> 21 | {timeUnit} 22 | 23 | 24 | 25 | ); 26 | }; 27 | 28 | export default function CountdownTimer() { 29 | // Calculate the target date (November 4) in EDT 30 | const targetDate = new Date("2023-12-05T12:00:00"); 31 | const currentDate = new Date(); 32 | const totalSeconds = Math.max(Math.floor((targetDate - currentDate) / 20), 0); 33 | 34 | const [secondsRemaining, setSecondsRemaining] = useState(totalSeconds); 35 | 36 | // Get screen dimensions 37 | const { width } = Dimensions.get("window"); 38 | 39 | useEffect(() => { 40 | const interval = setInterval(() => { 41 | setSecondsRemaining((prevSeconds) => { 42 | if (prevSeconds > 0) { 43 | return prevSeconds - 1; 44 | } else { 45 | clearInterval(interval); // Clear the interval when countdown reaches 0 46 | return 0; 47 | } 48 | }); 49 | }, 20); 50 | 51 | // Clear the interval when the component is unmounted 52 | return () => clearInterval(interval); 53 | }, []); 54 | 55 | const days = Math.floor(secondsRemaining / 50 / (3600 * 24)); 56 | const hours = Math.floor(((secondsRemaining / 50) % (3600 * 24)) / 3600); 57 | const minutes = Math.floor(((secondsRemaining / 50) % 3600) / 60); 58 | const remainingSeconds = (secondsRemaining / 50) % 60; 59 | 60 | // Format the countdown timer values according to the system timezone 61 | const formattedDays = new Intl.NumberFormat([], { 62 | minimumIntegerDigits: 1, 63 | }).format(days); 64 | const formattedHours = new Intl.NumberFormat([], { 65 | minimumIntegerDigits: 1, 66 | }).format(hours); 67 | const formattedMinutes = new Intl.NumberFormat([], { 68 | minimumIntegerDigits: 1, 69 | }).format(minutes); 70 | const formattedSeconds = new Intl.NumberFormat([], { 71 | maximumIntegerDigits: 2, 72 | }).format(Math.round(remainingSeconds)); 73 | 74 | // Calculate the circle size based on screen width 75 | const circleSize = width * 0.2; // Adjust the multiplier as needed 76 | 77 | return ( 78 | 79 | 80 | HackRPI X 81 | November 4-5 82 | 83 | 84 | {/* Add space between header and circles */} 85 | 86 | 87 | 88 | 89 | 95 | 96 | 97 | 103 | 104 | 105 | 111 | 112 | 113 | 119 | 120 | 121 | 122 | 123 | ); 124 | } 125 | 126 | const styles = StyleSheet.create({ 127 | container: { 128 | flex: 1, 129 | backgroundColor: "#191919", // Updated background color 130 | alignItems: "center", 131 | justifyContent: "flex-start", 132 | paddingTop: 80, 133 | }, 134 | header: { 135 | alignItems: "center", 136 | justifyContent: "center", 137 | }, 138 | circleContainer: { 139 | flexDirection: "row", 140 | alignItems: "center", 141 | justifyContent: "space-around", 142 | }, 143 | circle: { 144 | width: "100%", 145 | height: "100%", 146 | borderRadius: 100 / 2, 147 | backgroundColor: "transparent", 148 | alignItems: "center", 149 | justifyContent: "center", 150 | borderWidth: 0, // Add a border width (you can adjust this as needed) 151 | borderColor: "red", 152 | }, 153 | timerText: { 154 | fontSize: 20, 155 | fontWeight: "bold", 156 | color: "white", 157 | }, 158 | unitText: { 159 | marginTop: 2, 160 | color: "white", 161 | }, 162 | timerContainer: { 163 | position: "absolute", 164 | alignItems: "center", 165 | justifyContent: "center", 166 | }, 167 | circleWrapper: { 168 | marginHorizontal: 20, // Adjust this value to increase or decrease the space between circles 169 | marginTop: 10, // Adjust the marginTop to control the space between circles and header 170 | }, 171 | title: { 172 | fontSize: 36, // Adjust the font size as needed 173 | fontWeight: "bold", 174 | color: "white", 175 | }, 176 | subtitle: { 177 | fontSize: 18, // Adjust the font size as needed 178 | color: "white", 179 | }, 180 | }); 181 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/information/Bubble_Tea.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/information/Bubble_Tea.jpg -------------------------------------------------------------------------------- /HackRPIEventApp2023/information/DeFazio_pizza.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/information/DeFazio_pizza.jpg -------------------------------------------------------------------------------- /HackRPIEventApp2023/information/DiBella_Subs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/information/DiBella_Subs.jpg -------------------------------------------------------------------------------- /HackRPIEventApp2023/information/Food.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { SafeAreaView, ScrollView, StyleSheet, Text, View } from "react-native"; 3 | import FoodObject from "./FoodObject"; 4 | import ImageSlideshow from "./map/image_slideshow"; 5 | 6 | const Food = () => { 7 | return ( 8 | 9 | 10 | Maps 11 | 12 | 13 | 14 | 15 | Info 16 | 17 | 25 | 33 | 41 | 42 | 50 | 51 | 59 | 60 | 61 | 62 | ); 63 | }; 64 | 65 | const styles = StyleSheet.create({ 66 | FoodStyle: { 67 | flex: 1, 68 | }, 69 | headerContainer: { 70 | alignItems: "left", 71 | marginBottom: 20, // Adjust as needed 72 | marginTop: 10, 73 | }, 74 | header: { 75 | fontSize: 36, 76 | fontWeight: "bold", 77 | marginBottom: 10, 78 | color: "white", 79 | }, 80 | subheader: { 81 | fontSize: 18, 82 | color: "white", 83 | }, 84 | container: { 85 | flex: 1, 86 | justifyContent: "center", 87 | alignItems: "center", 88 | }, 89 | 90 | marginTop: 20, 91 | marginBottom: 20, 92 | backgroundColor: "transparent", 93 | flex: 1, 94 | justifyContent: "start", 95 | alignItems: "center", 96 | padding: 16, 97 | }); 98 | 99 | export default Food; 100 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/information/FoodObject.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import { View, StyleSheet, Image} from "react-native"; 3 | import InnerObject from "./InnerObject"; // Import the InnerObject component 4 | 5 | //reusable component that ties an event object to it's notification bell 6 | const FoodObject = ({ 7 | food_Title, 8 | Store, 9 | Time, 10 | Location, 11 | Description, 12 | imageSource, 13 | }) => { 14 | return ( 15 | 16 | 24 | {/* 28 | */} 29 | 30 | 31 | ); 32 | }; 33 | 34 | const styles = StyleSheet.create({ 35 | container: { 36 | flexDirection: "row", // Arrange children horizontally 37 | alignItems: "center", // Center children vertically 38 | backgroundColor: "transparent", // Replace with your desired background color 39 | padding: 10, 40 | borderRadius: 10, 41 | marginBottom: 0, 42 | }, 43 | 44 | notifBox: { 45 | width: 60, 46 | height: 100, 47 | borderWidth: 3, 48 | borderRadius: 20, 49 | padding: 10, 50 | marginLeft: 20, 51 | justifyContent: "center", 52 | alignItems: "center", 53 | marginBottom: 0, 54 | zIndex: 1, 55 | }, 56 | 57 | 58 | }); 59 | 60 | export default FoodObject; 61 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/information/InnerObject.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import { View, Text, TouchableOpacity, StyleSheet, Image } from "react-native"; 3 | 4 | 5 | // Reusable component that that creates the main content box 6 | const InnerObject = ({ 7 | food_title, 8 | store, 9 | time, 10 | location, 11 | description, 12 | imageSource, 13 | }) => { 14 | 15 | return ( 16 | 17 | 22 | 23 | {food_title} 24 | {store} 25 | {description} 26 | {time} 27 | {/* {location} */} 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | ); 40 | }; 41 | 42 | const styles = StyleSheet.create({ 43 | rectangle: { 44 | width: 300, 45 | height: 150, 46 | borderWidth: 1, 47 | borderColor: "#000", 48 | borderRadius: 20, 49 | padding: 10, 50 | left: 10, 51 | justifyContent: "center", 52 | alignItems: "left", 53 | marginBottom: 10, 54 | backgroundColor: "white", 55 | flexDirection: 'row', 56 | }, 57 | iconContainer: { 58 | left: 100, 59 | top: 10, 60 | }, 61 | expanded: { 62 | height: 150, // Adjust the height as needed 63 | }, 64 | 65 | textContainer: { 66 | top: 10, 67 | flex: 1, 68 | left: 12, 69 | }, 70 | 71 | food_title: { 72 | fontSize: 19, 73 | fontWeight: "bold", 74 | }, 75 | store:{ 76 | marginTop: 14, 77 | fontSize: 15, 78 | 79 | }, 80 | time: { 81 | marginTop: 12, 82 | fontSize: 14, 83 | // marginBottom: 14, 84 | }, 85 | location: { 86 | fontSize: 14, 87 | }, 88 | description: { 89 | //marginTop: 10, 90 | 91 | }, 92 | image: { 93 | width: 120, // Adjust as needed 94 | height: 120, // Adjust as needed 95 | alignSelf: "center", // Center the image within the view 96 | borderRadius: 20, 97 | marginTop: 6, 98 | }, 99 | imageContainer: { 100 | marginLeft: 10, // Add some space between text and image 101 | marginRight: 10, 102 | }, 103 | }); 104 | 105 | export default InnerObject; 106 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/information/bagels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/information/bagels.png -------------------------------------------------------------------------------- /HackRPIEventApp2023/information/big_apple.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/information/big_apple.jpg -------------------------------------------------------------------------------- /HackRPIEventApp2023/information/map/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/information/map/1.jpg -------------------------------------------------------------------------------- /HackRPIEventApp2023/information/map/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/information/map/2.jpg -------------------------------------------------------------------------------- /HackRPIEventApp2023/information/map/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hack-rpi/HackRPI-Mobile/15357487bee692dccd5a308493b114b20150dca4/HackRPIEventApp2023/information/map/3.jpg -------------------------------------------------------------------------------- /HackRPIEventApp2023/information/map/image_slideshow.js: -------------------------------------------------------------------------------- 1 | import React, { useState, useRef } from 'react'; 2 | import { 3 | View, 4 | Image, 5 | StyleSheet, 6 | Dimensions, 7 | FlatList, 8 | Text, 9 | Modal, 10 | TouchableOpacity, 11 | } from 'react-native'; 12 | import ImageZoom from 'react-native-image-pan-zoom'; // Import the zoom library 13 | 14 | // Array of image references 15 | const images = [ 16 | require('./1.jpg'), 17 | require('./2.jpg'), 18 | require('./3.jpg'), 19 | ]; 20 | 21 | const ImageSlideshow = () => { 22 | // State variables for current image index and modal visibility 23 | const [currentIndex, setCurrentIndex] = useState(0); 24 | const [modalVisible, setModalVisible] = useState(false); 25 | 26 | // Ref for FlatList component 27 | const flatListRef = useRef(null); 28 | 29 | // Callback function to handle scroll end and update the current image index 30 | const handleMomentumScrollEnd = (event) => { 31 | const contentOffset = event.nativeEvent.contentOffset.x; 32 | const index = Math.floor(contentOffset / Dimensions.get('window').width); 33 | setCurrentIndex(index); 34 | }; 35 | 36 | // Get the screen width 37 | const screenWidth = Dimensions.get('window').width; 38 | 39 | // Render the component 40 | return ( 41 | 42 | {/* FlatList to display images horizontally */} 43 | index.toString()} 50 | renderItem={({ item, index }) => ( 51 | { 53 | setCurrentIndex(index); 54 | setModalVisible(true); 55 | }} 56 | > 57 | 58 | 59 | 60 | 61 | )} 62 | onMomentumScrollEnd={handleMomentumScrollEnd} 63 | /> 64 | 65 | {/* Preview indicators for images */} 66 | 67 | {images.map((image, index) => ( 68 | { 71 | flatListRef.current.scrollToIndex({ animated: true, index }); 72 | setCurrentIndex(index); 73 | }} 74 | > 75 | 82 | 83 | ))} 84 | 85 | 86 | 87 | 88 | {/* Modal for displaying enlarged image */} 89 | { 94 | setModalVisible(false); 95 | }} 96 | > 97 | { 101 | setModalVisible(false); 102 | }} 103 | > 104 | X 105 | 106 | 107 | {/* Use ImageZoom to enable zooming and rotating */} 108 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | ); 121 | }; 122 | 123 | // Styles for the components 124 | const styles = StyleSheet.create({ 125 | // Container style 126 | container: { 127 | flex: 1, 128 | justifyContent: 'center', 129 | alignItems: 'center', 130 | marginTop: 30, 131 | }, 132 | // Style for individual image container 133 | imageContainer: { 134 | width: Dimensions.get('window').width, 135 | justifyContent: 'center', 136 | alignItems: 'center', 137 | }, 138 | // Style for the images 139 | image: { 140 | width: 300, 141 | height: 300, 142 | }, 143 | // Style for the preview indicators container 144 | previewContainer: { 145 | flexDirection: 'row', 146 | marginTop: 20, 147 | bottom: 10, 148 | }, 149 | // Style for individual preview indicator 150 | preview: { 151 | width: 50, 152 | height: 50, 153 | borderRadius: 10, 154 | backgroundColor: 'gray', 155 | margin: 5, 156 | }, 157 | // Style for active preview indicator 158 | activePreview: { 159 | backgroundColor: 'red', // Change to your desired active preview color 160 | borderWidth: 4, // Border width for the active preview indicator 161 | borderColor: 'red', // Border color for the active preview indicator 162 | }, 163 | // Style for the modal container 164 | modalContainer: { 165 | flex: 1, 166 | justifyContent: 'center', 167 | alignItems: 'center', 168 | backgroundColor: 'black', 169 | }, 170 | // Style for the modal image 171 | modalImage: { 172 | width: Dimensions.get('window').width, 173 | height: Dimensions.get('window').height, 174 | resizeMode: 'contain', 175 | }, 176 | exitButton: { 177 | position: 'absolute', 178 | top: 40, 179 | right: 20, 180 | backgroundColor: 'red', 181 | borderRadius: 20, 182 | width: 40, 183 | height: 40, 184 | justifyContent: 'center', 185 | alignItems: 'center', 186 | zIndex: 1, 187 | }, 188 | exitButtonText: { 189 | color: 'white', 190 | fontSize: 20, 191 | fontWeight: 'bold', 192 | }, 193 | }); 194 | 195 | // Export the component 196 | export default ImageSlideshow; -------------------------------------------------------------------------------- /HackRPIEventApp2023/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hackrpieventapp2023", 3 | "version": "1.0.0", 4 | "main": "node_modules/expo/AppEntry.js", 5 | "scripts": { 6 | "start": "expo start", 7 | "android": "expo start --android", 8 | "ios": "expo start --ios", 9 | "web": "expo start --web" 10 | }, 11 | "dependencies": { 12 | "@expo/webpack-config": "^19.0.0", 13 | "@react-navigation/bottom-tabs": "^6.5.11", 14 | "@react-navigation/native": "^6.1.9", 15 | "@types/react": "~18.2.14", 16 | "expo": "^49.0.21", 17 | "expo-status-bar": "~1.6.0", 18 | "react": "18.2.0", 19 | "react-dom": "18.2.0", 20 | "react-native": "^0.72.6", 21 | "react-native-image-pan-zoom": "^2.1.12", 22 | "react-native-linear-gradient": "^2.8.3", 23 | "react-native-safe-area-context": "4.6.3", 24 | "react-native-screens": "~3.22.0", 25 | "react-native-svg": "13.9.0", 26 | "react-native-swipe-button": "^0.0.4", 27 | "react-native-web": "~0.19.6", 28 | "rn-swipe-button": "^1.3.8", 29 | "typescript": "^5.1.3" 30 | }, 31 | "devDependencies": { 32 | "@babel/core": "^7.23.2" 33 | }, 34 | "private": true 35 | } 36 | -------------------------------------------------------------------------------- /HackRPIEventApp2023/styles.js: -------------------------------------------------------------------------------- 1 | export const globalStyles = { 2 | //COLORS 3 | primary: "#191919", //backgroundBlack 4 | accent: "#910307", //mainRed 5 | secondary: "#9E9E9E", //mainGray 6 | icons: "#FFFFFF", //white 7 | text: "#000000", //black 8 | 9 | //primary, secondary, accent, accent2, text 10 | fontSize: 20, 11 | fontWeight: "bold", 12 | }; 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 HackRPI 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HackRPI-Mobile 2 | 3 | Welcome to the official GitHub repository for the HackRPI X Event App! Over the past decade, HackRPI has grown into one of the most prestigious hackathons, providing a platform for innovation, collaboration, and creativity. As we celebrate this milestone, we invite you to be a part of this journey. 4 | 5 | ## 🎉 Join the Celebration! 6 | 7 | We're thrilled to see the HackRPI community grow each year and are always on the lookout for fresh ideas and perspectives. Whether you're a seasoned developer, a design enthusiast, or someone who's just passionate about hackathons, there's a place for you here! 8 | 9 | ## 🖐 How Can You Contribute? 10 | 11 | 1. **Bug Fixes:** Spot an issue? Feel free to submit a pull request. 12 | 2. **Feature Suggestions:** Got an innovative idea for the app? Raise an issue, and let's discuss it! 13 | 3. **Design Improvements:** If you're a design enthusiast, your insights can give the app a fresh and innovative look. 14 | 4. **Documentation:** Help make our documentation clearer and more comprehensive for future contributors. 15 | 5. **Outreach:** Share the app design and gather feedback, helping us reach a broader audience. 16 | 6. **Connect with Us:** Reach out to our organizing team on [Discord](https://discord.gg/q4tdARPazB) and ask the technology team for tasks or any assistance. 17 | 18 | ## 🛠 Getting Started 19 | 20 | **Recommended Tools:** 21 | - **Editor:** [Visual Studio Code](https://code.visualstudio.com/download) 22 | - **GitHub Desktop:** [Download here](https://desktop.github.com/) 23 | - **React Native Expo:** [Documentation](https://docs.expo.dev/) 24 | 25 | **Steps:** 26 | 27 | 1. **Clone the Repository:** 28 | - Using GitHub Desktop, choose `File` > `Clone repository` and select the HackRPI repository. This will create a local copy on your machine. 29 | 30 | 2. **Create a New Branch:** 31 | - Once the repository is cloned, create a new branch in GitHub Desktop. 32 | - For features, use the naming convention: `feature/your-feature-description`. 33 | - For bugs, use the naming convention: `bug/your-bug-description`. 34 | 35 | 3. **Implement and Commit Changes:** 36 | - Make the necessary changes in your branch. Use Visual Studio Code or your preferred editor. 37 | - Add comments!! 38 | - Once done, commit your changes using GitHub Desktop. 39 | 40 | 4. **Update with Main:** 41 | - Before pushing your changes, ensure you have the latest version of `main`. In GitHub Desktop, pull the latest changes from the `main` branch and merge them into your branch. 42 | 43 | 5. **Test Your Changes:** 44 | - Ensure your design is responsive. Test on multiple screen sizes, including mobile. Employ best practices for responsive design. 45 | 46 | 6. **Push and Create a Pull Request:** 47 | - Push your branch to GitHub using GitHub Desktop. 48 | - Then, visit the repository on GitHub's website and create a pull request. Write a description of the changes in the comment, and paste any relevant images showcasing updates. Our team will review, provide feedback, or merge your changes. 49 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "HackRPI-Mobile2023", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": {} 6 | } 7 | --------------------------------------------------------------------------------