Youtube Demo: https://youtu.be/NbfG26QO_wQ
https://blog.codepath.org/made-by-our-students-donateit/
https://blog.codepath.org/2020-codepath-org-fall-semester-demo-day-ios-winners-announced/
“This is such a thoughtful product in the time that we are in right now. During COVID-19 we’re accumulating so many things. From a technical perspective, what a beautiful design. The craft of the app really showed through, and the integration is super top notch. Loved the donation center integration and how it felt like it was part of the core app. Loved the integration with maps and loved the non-profit angle. Congratulations. Really great work.”
Alan McConnell – Head of Live Engineering at Instagram
Donate goods to people and donation centers in your neighborhood or pick up other people's excess goods in order to help minimize waste and be sustainable.
- Category: Shopping (free items though)
- Mobile: uses camera, uses Apple maps, uses Messages, mobile first experience.
- Story: Allows users to donate unwanted goods to people and donation centers in your neighborhood or pick up other people's excess goods in order to help minimize waste and be sustainable.
- Market: Anyone that has something to donate or something in excess or anyone seeking free goods.
- Habit: Users can find FREE items on the app daily and clean out their houses by donating their unused items. Could find someone's unwanted treasure.
- Scope: DonateIt starts out with a narrow scope of sharing free items within a small community. Possible expansions for a larger scope include growing to be a nationwide application.
Required Must-have Stories
- User can register a new account
- User can login to their account
- User can post pictures and details of their free item
- User can find free items by scrolling through a feed
- User can select item to see additional details
- User can see their own posted items
Optional Nice-to-have Stories
- Find donation centers on a map
- Receive the address and mapping to the item
- Filter catagories and radius for items
- Messaging to contact donaters
Here's a walkthrough of implemented user stories:
Here's a walkthrough of implemented user stories:
Here's a walkthrough of implemented user stories:
Here's another more recently developed walkthrough:
Here's a walkthrough of implemented user stories:
- Login
- User can login to their account
- User can register a new account
- Stream
- User can find free items by scrolling through a feed
- User can filter for different mile radius
- User can filter by category
- Detail (Item)
- User can select item to see additional details
- User can get directions to the item's location
- User can contact the item's owner
- Detail (My Item)
- User can select item to see additional of their details
- Creation
- User can post pictures and details of their free item
- Profile
- User can see their own posted items
- User can change the status of their item to Donated or Available
- Maps
- User can find donation centers on a map
- Detail (Center)
- User can select pin on map to see additional details
- User can get directions to the center's location
Tab Navigation (Tab to Screen)
- Stream
- Maps
- Profile
Flow Navigation (Screen to Screen)
- Login
- Stream
- Stream
- Detail (Item)
- Profile
- Detail (My Item)
- Creation
- Login
- Maps
- Detail (Center)
Property | Type | Description |
---|---|---|
objectId | String | unique id for the user post (default field) |
author | Pointer to User | registered user |
image | File | image that user posts |
itemName | String | name of item |
itemCategory | String | category of item |
description | String | description of item |
pickupTimes | String | when the item is available for pickup |
location | GeoCoord | location for pickup of item |
phoneNumber | String | user's phone number |
createdAt | DateTime | date when post is created (default field) |
itemStatus | Boolean | whether the item has been donated |
- Profile Screen
- (Read/GET) Query all posts where user is author
let query = PFQuery(className:"Item") query.limit = 20 query.order(byDescending: "createdAt") query.whereKey("author", equalTo: PFUser.current()?.username!) query.findObjectsInBackground { (posts, error) in if posts != nil { self.posts = posts! self.tableView.reloadData() } }
- (Read/GET) Query all posts where user is author
- Create Post Screen
- (Create/POST) Create a new post object
let post = PFObject(className: "Item") post["location"] = geolocation post["itemName"] = itemName.text! post["description"] = itemDescription.text! post["itemCategory"] = pickerData[itemCategory.selectedRow(inComponent: 0)] post["itemStatus"] = false post["phoneNumber"] = phoneNumber.text! let imageData = itemImage.image!.pngData() let file = PFFileObject(data: imageData!) post["image"] = file post["author"] = PFUser.current()?.username! post["pickupTime"] = itemPickupTime.text! post.saveInBackground { (success, error) in if success { print("saved") self.navigationController?.popToRootViewController(animated: true) } else { print("error") } }
- (Create/POST) Create a new post object
- Stream Screen
- (Read/GET) Query all posts within the community
let query = PFQuery(className:"Item") query.limit = 60 query.whereKey("location", nearGeoPoint: geolocation, withinMiles: radius) query.order(byDescending: "createdAt") query.findObjectsInBackground { (posts, error) in if posts != nil { self.posts = posts! let myindex = self.segmentedControl.selectedSegmentIndex if myindex == 0{ self.filteredposts = self.posts } else{ self.filteredposts = [] let mydata = ["All","Clothes","Electronics","Food", "Furniture","Sports","Toys", "Other"] for post in self.posts{ if post["itemCategory"] as! String == mydata[myindex]{ self.filteredposts.append(post) } } } self.collectionView.reloadData() self.collectionView.layoutIfNeeded() } } ```