Group Project
===
# PenPals
## Table of Contents
1. [Overview](#Overview)
1. [Product Spec](#Product-Spec)
1. [Wireframes](#Wireframes)
2. [Schema](#Schema)
## Overview
### Description
PenPals is a social networking and language learning app that connects people across the world who want to learn languages by talking to native speakers, both chatting and videochatting, and find host families to stay with abroad. Overarching goals are language acquisition and cultural exchange (Made for intermediate to advanced levels).
### App Evaluation
[Evaluation of your app across the following attributes]
- **Category:** Social, Education
- **Mobile:** Chatting and videochatting are mobile experiences, videochatting makes use of the camera and microphone of the phone.
- **Story:** Allows users to communicate with people who are native speakers of a language they are trying to learn, and are willing to offer an immersive learning experience.
- **Market:** Everyone wanting to learn a language and those willing to teach. Anyone who wants a virtual international experience
- **Habit:** Connecting with people creates habit, and there will be notifications for when you receive texts and people connect with you. You should be able to set goals like "I want to speak 2 hours in spanish each week" and an indicator tells you how far you are from reaching your goals.
- **Scope:** The idea has a pretty large scope, so we might start with implementing chatting and videochatting and if we have more time we'll move on to implementing the finding host families page.
## Product Spec
### 1. User Stories (Required and Optional)
**Required Must-have Stories**
* Log in with PenPals / Facebook accounts
* If login with Facebook is chosen, import basic bio information from Facebook profile
* Developing user profiles with additional information about languages, both those in which the user is fluent/proficient and still learning. Will also include a social aspect, such as fun facts about oneself, and country of origin/residence.
* Finding other users and matching based on stated linguistic or cultural interests. The app will make suggestions.
* Sending friend/connection requests to people the user finds or those suggested to them.
* Chatting, which could include chat suggestions to 'break the ice'
* Videochatting
* Notifications when messages, calls and friend requests are received.
* Report user for misuse of the platform or abuse of other users
* Filter for minors, which would allow for them to only speak with other minors
**Optional Nice-to-have Stories**
* Host family matching
* Security / reviews of host families
* "Scores" of how nice people are to interact with - allow for the users they've interacted with to provide ratings based on the 5-star system
* Learning goals that will also provide notifications based on the goals set by the user.
* Learning achievements based on time spent in a language
* Feedback can be given by users on the progress of those they've been communicating with.
* Specification of language of videochats and the time on the call can count towards learning goals / achievements
* Wish users happy birthday in their target language!
* Speech recognition to store words you say and count towards progress
### 2. Screen Archetypes
* Login / Sign up
* Log in / Account creation
* Sign Up / Account Customization
* Developing user profiles
* 'Connect' page based on interests
* Finding other users and matching
* Profile Page
* Developing user profiles
* Active Chats page
* Chatting
* Chat dialogue page with details and calling capability
* Chatting
* Videochatting
* Video chat screen
* Alerts Page with received friend requests (which can be accepted from this page) and missed calls
### 3. Navigation
**Tab Navigation** (Tab to Screen)
* Connect Page --> (On clicking Message tab) --> Chat center --> Chat dialogue --> Videocall
* Connect Page --> (On clicking Personal tab) --> Bio page --> Edit/Privacy/Logout, etc.
* Notification Center
**Flow Navigation** (Screen to Screen)
* Login Page -> (Successful login) --> Connect page
* Login Page -> (Not a user) --> Sign up page --> Preferences Page --> Connect page
* Connect Page --> (On clicking suggested match) --> Bio page for that user with the ability to send 'friend/connect requests'
## Wireframes
[Add picture of your hand sketched wireframes in this section]
<img src="YOUR_WIREFRAME_IMAGE_URL" width=600>
### [BONUS] Digital Wireframes & Mockups

### [BONUS] Interactive Prototype
## Schema
[This section will be completed in Unit 9]
### Models
**User**
| Property | Type | Description |
| -------- | -------- | -------- |
| userId | String | Unique identifier for each user |
| name | String | Name of user |
| password | String | Password |
| currentLanguages| Array | Languages they speak |
| targetLanguages | Array | Languages they are trying to learn|
|dob | Date | Date of birth |
|originCountry | String | Country of origin |
|targetCountries | Array | Countries they want to learn about |
| hoursSpoken | HashMap | Dictionary mapping language with hours spoken|
| email | String | Email address |
| score | Number | Score from friend feedback |
| bio | String | Personal bio entered by user |
| friends | Relation to User | Friends |
| achievements | Array | Progress awards received |
| online | Boolean | Whether or not the user is currently logged in |
**Text**
| Property | Type | Description |
| -------- | -------- | -------- |
| textId | String | Unique identifier for each text |
| body | String | Body of text |
| sender | Pointer to User | Sender |
| receiver | Pointer to User | Receiver |
| timestamp | DateTime | Timestamp |
**Country**
| Property | Type | Description |
| -------- | -------- | -------- |
| countryId | String | Unique identifier for each country |
| languages | Array of Strings | Languages |
| name | String | Name of country |
| flag | ParseFile | Flag |
| users | Relation to User | Users from that country |
**Friend Request**
| Property | Type | Description |
| -------- | -------- | -------- |
| id | String | Unique identifier for each friend request |
| sender | Pointer to User | user who sent request |
| receiver | Pointer to User | user receiving request |
| body | String | body of friend request message |
**Chat**
| Property | Type | Description |
| -------- | -------- | -------- |
| id | String | Unique identifier for each chat |
| sender | Pointer to User | user who sent request |
| receiver | Pointer to User | user receiving request |
| body | String | body of friend request message |
| lastMessageAt | DateTime | timestamp of most recent message in chat |
### Networking
- [Add list of network requests by screen ]
* Login / Sign up: log in / sign up through parse, log in with facebook
* Sign Up / Account Customization: update profile fields and save on parse, use parse find to display
* 'Connect' page based on interests: parse users, query by country / target language
* Profile Page: use parse find to display
* Active Chats page: parse query chats by logged in user
* Chat dialogue page with details and calling capability: query texts from parse by sender and receiver, save new texts on parse, update time spoken in language after calling
* Video chat screen
* Alerts Page with received friend requests (which can be accepted from this page) and missed calls: query friend requests from parse, update friend requests when accepted/rejected
- [Create basic snippets for each Parse network request]
- [OPTIONAL: List endpoints if using existing API such as Yelp]
Possible videocall APIs: agora.io, twilio, pubnub, cometchat, sinch, tokbox