"This project comes from my personal experience traveling the US to visit national parks. I was looking on the google play store for an app to track which national parks we have seen vs. not seen. I assumed there would be an app that could track this for us and maybe even present a map or visualization of our progress that I could share on Facebook. This app doesn’t exist at the moment (some similar sites exist like travbuddy.com, but this isn’t exactly easy to use or very powerful). So, we should create it but why limit it to national parks?
I would like to develop an app/web platform where users can create a list of places to visit or things to do. Then other users can sign up for these lists and track their progress. We could build in national parks, national monuments, even restaurants in Lewisburg. But the best feature would be users could create new lists. This would allow very diverse and interesting lists to be created everything from Civil War battlefields to national ballparks. The site would have allow searching for nearby sites (geotagged) and leaderboards with statistics about who is in each challenge along with nice visualizations and social media connections." Prof. Alan Marchiori
This diagram shows the navigation among different screens of our app. The navigators (orange) connects pages in that level through either stack or tab navigator. The pages (blue) represents different screens of our app, which utilize reusable components (green).
This diagram shows the system level design of our app. Right now users can access our app through downloading Expo Client on their iOS/Android devices. Our front-end is written using React Native, a JavaScript framework that allows us to build cross-platform apps. Our back-end mostly relies on Firebase services, including Realtime Database (most of our data such as locations, trips, and users), Cloud Storage (user profile images), and Cloud Functions (serverless backend code). ElasticSearch is deployed on Heroku (Bonsai addon) and is used to implement full text search functionalities that Firebase is lack of. We also utilized a variety of Google APIs for maps, places search, distance calculation, and directions.
Users can create a new account for our app, or login through their Google or Facebook accounts.
Users can add locations that exist in the Google Places API, filter results by category, and add it to our database.
Users can create trips through trips screen or a location’s detail page, add tags and permissions, and add locations through search or from the map page.
Users can search for locations (full-text), users (by handle), and trips (by tag) using the search bar accessible from everywhere.
Users can request to join a trip by permission of the trip creator, or simply follow a trip.
Thank you Professor Alan Marchiori for being both our client and advisor during this senior design project.
File | Description |
---|---|
xplor/LoginScreens | |
button.js | Contains the button class and style sheet used in this section |
logo.js | Contains the logo class and style sheet |
xplor/LoginScreens/Login | |
ForgotPwd.js | Contains function to send a password reset email, leading to the reset password page |
ResetPwd.js | Contains the page and functionality for the user to reset their password |
loginForm.js | Contains the default login page layout and function, including redirects to other pages |
loginLogo.js | Contains the login logo and relevant style sheet |
loginOther.js | Contains the redirect for Facebook and Gmail sign in |
xplor/LoginScreens/Signup | |
signupConfirm.js | Contains the page to redirect users to their email for sign up confirmation |
signupDone.js | Contains the sign up completion page |
signupEmail.js | Contains functions to check email validity and uniqueness |
signupHandle.je | Contains functions to check handles validity and uniqueness |
signupName.js | Contains the page to input your name |
signupPwd.js | Contains the page to input your password as well as password strength verification |
xplor/components | |
CategoryFilter.js | Component to allow a user to select filters that limit the types of POIs shown on the map |
ContentGrid.js | Component to format a grid, used in displaying user's favorited locations |
CustomPinSearch.js | Component to allow users to add their own POIs to the Firebase database, and functions to verify that the POIs exist in Google Places API to ensure validity |
MapMarkerCallout.js | Component to display a preview of the POI's information and image upon pin selection |
NewTagModal.js | Component for users to add new tags to a trip |
SavedLocations.js | Component utilizing the content grid for saved locations |
SearchFilterContainer.js | Component to house search filtered search results |
SearchFilterOption.js | A component representing a possible category filter and how many locations under this category exist in a query |
SearchPlaces.js | Component to handle searching |
SearchTags.js | Component to handle the tag search feature |
SearchUsers.js | Component to handle the user search feature |
Tag.js | Component for tags |
Tags.js | Functions to add and remove tags |
TagsArea.js | Component for the tags display |
TripContainer.js | Component used to house trips and associated information |
TripsList.js | Component to display a trips list |
UserTrips.js | Contains functions to load trips, add location to trips, and for rendering the prior trip components into one feature |
xplor/components/Notifications | |
FollowApproval.js | Component to display an approval for a follow user request |
FollowRequest.js | Component to display a follow user requests, and functions to approve or deny request and send approval notification |
JoinTripApproval.js | Component to display an approval for a join trip request |
JoinTripRequest.js | Component to display a join trip requests, and functions to approve or deny request and send approval notification |
push_listener.js | Used to handle notifications received while the app is open or is opened after closing |
xplor/functions | |
FirebaseTripCode.js | Contains the first iteration of functions used to construct trips in Firebase. No longer implemented |
index.js | Initialize the Firebase configuration. |
location_to_geo.js | Contains functions to grab points from the Firebase database and convert them into geofire points |
nps_poi.js | Contains the functions to grab information from the national park service and push them to Firebase |
push_code.js | Contains the function to implement registration for push notifications |
xplor/navigators | |
LoginNav.js | Contains all constants necessary to operator the navigator leaving the login page and going to all singup options, logins, forgot/reset password, and the central page |
MainNav.js | Contains all constants necessary to operator the central navigator, including the redirects to all main pages, including map, search, profile, trips, following, create trip, location page, tag page, and settings |
MapNav.js | Contains all constants necessary for naviagtion out of the map page |
xplor/network | |
notifications.js | Contains all functions for interaction with the Firebase database for sending and deleting notifications |
pois.js | Contains all functions for interaction with the Firebase database for creating, searching, and getting details about pois |
trips.js | Contains all functions for interaction with the Firebase database for creating, editing, adding to, and managing trips; also includes the route optimization and route distance calculator |
users.js | Contains all functions for interaction with the Firebase database for user authetication, profile info editing, and getting users data |
xplor/pages | |
Contains all pages in the app | This folder contains all javascript files to implement every page in the app. The names of the files are labeled to clearly indicate which page they correlate to. These pages implement all components and functions relevant to operate their individual pages, and also implement their own unique functions for navigation, and unique database calls. |
xplor/utils | |
colors.js | Contains a standardized list of all colors used in the app |
poiTypes.js | Contains a standardized stylesheet for all poi types used on the map |
xplor | |
App.js | Entry point of the app, contains all information required for Expo to build and launch the app |
Tables/Entries | Description |
---|---|
xplor/pois | |
Location codes | Contains all of the locations and their unique information. The IDs are unique location IDs pulled from Google. |
xplor/pois/Unique-IDs | |
description | A short description for each location |
id | Identical to the unique identifier at the top level for POIs |
image | A url linking to an image for the destination |
lat | The locations latitude |
long | The locations longitude |
name | The destinations name |
type | This is used for sorting all POIs into specific categories for sorting on the map. These are: National Park, National Monument, Park, Museum, Amusement Park, Aquarium, Gallery, Bar, Campground, Library, Restaurant, Theater, Stadium, Zoo, Others |
xplor/tags | |
User entered tags | Each of these entries contain the count of how many trips include this tag, and the ID for each of these trips |
xplor/trips | |
Trip codes | Contains all of the trips and their uniquely generated ID, along with all of their relevent information |
xplor/trips/Unique-IDs | |
creator | The uniquely generated user ID from the original trip creator |
followers | The unique user ID for all of the trips followers |
locations | Contains all of the location IDs, and each location contains it's index, name, and whether or not it has been visited |
name | The trips name |
numLocs | How many locations the trip has |
participants | The unique user ID for all of the trips participants |
permission | Who is allowed to see the trip: everyone, only you, and followers |
tags | All tags for this trip |
xplor/users | |
handles | Contains all of the users handles paired with their unique IDs |
xplor/users/main | |
firstname | The firstname provided at signup |
handle | The user's chosen handle |
lastname | The lastname provided at signup |
numFollowers | How many people are following this user |
numFollowing | How many people this user is following |
saved | All saved/favorited locations identified by their unique ID. Contains that locations image, and name |
xplor/users/notifications/player-IDs/unique-notification-ID | |
data | The sender's ID |
time | The time the notification was sent |
type | A descriptor for which type of notification was sent |