├── .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 |
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 |
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 |
--------------------------------------------------------------------------------