explr-bucknell / explr

0 stars 2 forks source link

Original Problem Statement

"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

Design Revisions

Background & Motivation

Design

User Interface Design Diagram

User Interface Design Diagram 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).

System Level Design Diagram

System Level Design Diagram 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.

Implementation

Demo & Results

Major Tasks Completed

Feature Demos

signnin

Users can create a new account for our app, or login through their Google or Facebook accounts.


addpoi

Users can add locations that exist in the Google Places API, filter results by category, and add it to our database.


createtrip

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.


search

Users can search for locations (full-text), users (by handle), and trips (by tag) using the search bar accessible from everywhere.


jointrip

Users can request to join a trip by permission of the trip creator, or simply follow a trip.


Development Process & Challenges

Timeline

Timeline

Challenges

Conclusion & Reflection

What we enjoyed?

What we'd do differently?

What we'd add if we have more time?

Acknowledgements

Thank you Professor Alan Marchiori for being both our client and advisor during this senior design project.

Dev Build Instructions

Javascript Files

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

Firebase Structure

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