Giter VIP home page Giter VIP logo

juno's Introduction

JUNO

Narrated Walkthrough

Table of Contents

  1. Overview
  2. Product Spec
  3. Wireframes
  4. Schema
  5. Development Gifs

Overview

Description

Juno is an online dating app that displays user compatibility based on their sun sign(astrology). Users are then able to swipe and like/dislike the suggested profiles based on their photos and a small bio. Users are able to exchange messages after they match.

App Evaluation

  • Category: Lifestyle/Social
  • Mobile: Maps, camera, location, push, real-time
  • Story: In this digital age of dating, we take back control and focus on those prefrences that suit us when looking for partners, by adding additonals filters like race as to find partner that we have more in common with, or learn a new culture from or Birth month so as to find that match made in heavean we ar able to find the person right for you.
  • Market: Anyone 18 and over that is interested in online dating and astrology.
  • Habit: Endless swiping through profiles, talking to new people, and the simplicity of the app makes it very addictive.
  • Scope: Will be focused on implementing the in-app messaging and compatbility matching features. These will be relatively easy to complete and can be done within the expected time frame.

Product Spec

1. User Stories (Required and Optional)

Required Must-have Stories

  • User can log in.
  • User stays logged in across app restarts.
  • User can create an account.
  • User can view a feed of profiles.
  • User can tap yes/no to a profile.
  • User can view their compatibility score with other users.
  • User can send messages to matched profiles.
  • User can view their profile with their age and number of matches.
  • User can update their profile.
  • User can modify their settings.
  • User can logout.

Optional Nice-to-have Stories

  • User can receive notifications.
  • User can upload more than one photo.
  • User can view their compatibility with other users based on their birth chart.
  • User can swipe to say yes/no to a profile.
  • User can filter the results.

2. Screen Archetypes

  • Login
    • User can log in.
    • User stays logged in across app restarts.
  • Registration
    • User can create an account.
  • Stream
    • User can view a feed of profiles.
    • User can tap yes/no to a profile.
    • User can view their compatibility score with other users.
  • Messaging
    • User can send messages to matched profiles.
  • Profile
    • User can view their profile with their age and number of matches.
    • User can update their profile.
  • Settings
    • User can update their email, location, time of birth etc.
    • User can logout.
    • User can receive notifications.

3. Navigation

Tab Navigation (Tab to Screen)

  • Home Feed
  • Profile
  • Chat

Flow Navigation (Screen to Screen)

  • Login Screen
    • Home Feed
  • Registraton Screen
    • Home Feed
  • Stream Screen
    • Profile
    • Chat
  • Messaging Screen
    • Profile
    • Stream
  • Profile Screen
    • Stream
    • Chat
  • Settings Screen
    • Profile

Wireframes

  • Login Screen

  • Registraton Screen

  • Stream Screen

  • Profile Screen

  • Settings Screen

  • Messaging Screen

Schema

Models

User

Property Type Description
userId String unique id for users
fname String the user's first name
lname String the user's last name
username String the unique name the user logs in with
password String the string the user will use to verify their identity
location String where the user is located
dob DateTime the user's date of birth
birthLocation String where the user was born
profilePhoto File the image that the user chooses for their profile
likes Array an array of user profiles that the user has liked
matches Array an array of user profiles that the user has matched with
jobTitle String the user's occupation
companySchool String the user's company/school
sign String the user's star sign

Compatibility

Property Type Description
sign Array map used to store the compatibility value between each sign

Networking

Networking

List of network requests by screen

  • Login Screen
    • (Read/GET) Query logged in user object
      let username = usernameField.text!
      let password = passwordField.text!
      
      PFUser.logInWithUsername(inBackground: username, password: password) { (user, error) in
          if user != nil {
              self.performSegue(withIdentifier: "loginSegue", sender: nil)
          } else {
              print("Error: \(error?.localizedDescription)")
          }
      }
  • Registration Screen
    • (Create/POST) Create a new user
      let user = PFUser()
      user.username = usernameField.text
      user.password = passwordField.text
      
      user.signUpInBackground { (success, error) in
          if success {
              self.performSegue(withIdentifier: "loginSegue", sender: nil)
          } else {
              print("Error: \(error?.localizedDescription)")
          }
      }
    • (Create/POST) Create profile photo and additional user info
      let currentProfile = PFObject(className: "Profile")
      profile["userId"] = PFUser.current()!
      let imageData = imageView.image!.pngData()
      let file = PFFileObject(name: "image.png", data: imageData!)
      currentProfile["profilePhoto"] = file
      currentProfile["name"] = nameField.text
      
      currentProfile.saveInBackground { (success, error) in
          if success {
              self.dismiss(animated: true, completion: nil)
              print("saved!")
          } else {
              print("error!")
          }
      }
  • Stream Screen
    • (Read/GET) Query profiles that the user has not liked
      let query = PFQuery(className:"Profile")
      query.whereKey("userId", notContainedIn: currentProfile["likes"])
      query.findObjectsInBackground { (profiles: [PFObject]?, error: Error?) in
         if let error = error { 
            print(error.localizedDescription)
         } else if let profiles = profiles {
            print("Successfully retrieved \(profiles.count) profiles.")
        // TODO: Do something with profiles...
         }
      }
    • (Create/POST) Create a new like on a profile
      user = PFUser.current()!
      currentProfile.add(user, forKey: "likes")
      currentProfile.saveInBackground { (success, error) in
          if success {
              print("Like added")
          } else {
              print("Error adding like")
          }
      }
  • Profile Screen
    • (Update/PUT) Update user profile image and additional user info
      let imageData = imageView.image!.pngData()
      let file = PFFileObject(name: "image.png", data: imageData!)
      
      currentProfile["profilePhoto"] = file
      currentProfile["about"] = aboutMeField.text
      
      currentProfile.saveInBackground { (success, error) in
          if success {
              self.dismiss(animated: true, completion: nil)
              print("saved!")
          } else {
              print("error!")
          }
      }
  • Settings Screen
    • (Update/PUT) Update user info
      let location = locationField.text
      currentProfile["location"] = location
      
      currentUser.saveInBackground { (success, error) in
          if success {
              print("Changes saved")
          } else {
              print("Error saving changes")
          }
      }
  • Messaging Screen
    • (Read/GET) Query matched profiles
       let query = PFQuery(className:"User")
       query.whereKey("userId", containedIn: matches)
       query.findObjectsInBackground { (profiles: [PFObject]?, error: Error?) in
          if let error = error { 
             print(error.localizedDescription)
          } else if let profiles = profiles {
             print("Successfully retrieved \(profiles.count) profiles.")
         // TODO: Do something with profiles...
          }
       }
    • (Read/GET) Query messages
      let predicate = NSPredicate(format: "conversation_id == %@", conversationId)
      self.conversation_query = Message.query(with: predicate)?.order(byAscending: "createdAt")
      self.conversation_query.findObjectsInBackground { (objects, err) in
          if err==nil {
              if let messages = objects as? [Message] {
                  self.messages = messages
                  self.collectionView.reloadData()
              }
          }
      }
    • (Create/POST) Create new message
      message.body_text = text
      message.saveInBackground { (saved, err) in
          if saved {
              print("Message sent")
          }else {
              if let error = err {
                  print(error.localizedDescription)
              }
          }
      }
      finishSendingMessage()

Development

Milestone 1

Video WalkthroughVideo WalkthroughVideo Walkthrough

Milestone 2

Video WalkthroughVideo Walkthrough

Milestone 3

Video WalkthroughVideo WalkthroughVideo Walkthrough

Milestone 4

Video WalkthroughVideo Walkthrough

juno's People

Contributors

cicelybeckford avatar sean-hu avatar

Watchers

 avatar

juno's Issues

User can update their profile

  • Create Edit Screen
  • Layout screen
    • Input fields for about me, job title, school/company and living in
    • Image view with tap feature to change profile image
    • Button to save changes
    • Back button to cancel
  • Save data to parse and navigate to profile on save button
  • Navigate to profile on back button

User can view their profile with their age and number of matches

  • Create Profile Screen
  • Layout screen
    • Text fields for about me, job title, school/company and living in
    • Image view for profile image
    • Buttons to edit and go to settings
    • Tab bar to navigate to profile and messages
  • Navigate to settings when gear is tapped
  • Navigate to home when home button is tapped
  • Navigate to messages when messages button is tapped

Configure Parse Server

  • Deploy to Heroku
  • Test deployment
  • Setup local Parse Dashboard
  • Add Parse Client to Project

User can log in

  • Create Login Screen
  • Layout screen
    • Input field for username and password
    • Button to log in
  • Direct to home feed on login button
  • Trigger home feed to load profiles

User can create an account.

  • Create Registration Screen
  • Layout screen 1
    • Input field for username, password and password confirmation
    • Button to create account
  • Create account and direct to screen 1 on create account button
  • Layout screen 2
    • Input field for full name, date of birth and location
    • Image view with tap feature to set profile image
    • Next button
  • Save data to Parse and direct to home feed on next button
  • Trigger home feed to load profiles

User can view a feed of profiles

  • Create Home Screen
  • Layout screen
    • Text fields for name, location and compatibility percentage
    • Image view for profile image
    • Buttons to capture or upload image
    • Buttons to like or dislike
    • Tab bar to navigate to profile and messages
  • Navigate to profile when profile button is tapped
  • Navigate to messages when messages button is tapped

User can send messages to matched profiles

  • Create Messages Screen
  • Layout screen "Matches"
    • Text fields for names
    • Image view for profile images
    • Tab bar to navigate to profile and home
  • Layout screen "Chat"
    • Text field for name at top
    • Image view for profile image at top
    • Back button to go back to list of matched
  • Implement real-time messaging functionality
  • Navigate to profile when profile button is tapped
  • Navigate to home when home button is tapped

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.