Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 25 additions & 128 deletions LambdaTimeline.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

38 changes: 38 additions & 0 deletions LambdaTimeline/Helpers/UIImage+Scaling.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//
// UIImage+Scaling.swift
// LambdaTimeline
//
// Created by Elizabeth Thomas on 9/9/20.
// Copyright © 2020 Lambda School. All rights reserved.
//

import UIKit

extension UIImage {

/// Resize the image to a max dimension from size parameter
func imageByScaling(toSize size: CGSize) -> UIImage? {
guard size.width > 0 && size.height > 0 else { return nil }

let originalAspectRatio = self.size.width/self.size.height
var correctedSize = size

if correctedSize.width > correctedSize.width*originalAspectRatio {
correctedSize.width = correctedSize.width*originalAspectRatio
} else {
correctedSize.height = correctedSize.height/originalAspectRatio
}

return UIGraphicsImageRenderer(size: correctedSize, format: imageRendererFormat).image { context in
draw(in: CGRect(origin: .zero, size: correctedSize))
}
}

/// Renders the image if the pixel data was rotated due to orientation of camera
var flattened: UIImage {
if imageOrientation == .up { return self }
return UIGraphicsImageRenderer(size: size, format: imageRendererFormat).image { context in
draw(at: .zero)
}
}
}
123 changes: 20 additions & 103 deletions LambdaTimeline/Model Controllers/PostController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,122 +6,39 @@
// Copyright © 2018 Lambda School. All rights reserved.
//

import Foundation
import FirebaseAuth
import FirebaseDatabase
import FirebaseStorage
import UIKit

class PostController {

static let shared = PostController()

var posts: [Post] = []

func createPost(with title: String, ofType mediaType: MediaType, mediaData: Data, ratio: CGFloat? = nil, completion: @escaping (Bool) -> Void = { _ in }) {
var currentUser: String? {
UserDefaults.standard.string(forKey: "username")
}

func createImagePost(with title: String, image: UIImage, ratio: CGFloat?, audioURL: URL?) {

guard let currentUser = Auth.auth().currentUser,
let author = Author(user: currentUser) else { return }
guard let currentUser = currentUser else { return }

store(mediaData: mediaData, mediaType: mediaType) { (mediaURL) in

guard let mediaURL = mediaURL else { completion(false); return }

let imagePost = Post(title: title, mediaURL: mediaURL, ratio: ratio, author: author)

self.postsRef.childByAutoId().setValue(imagePost.dictionaryRepresentation) { (error, ref) in
if let error = error {
NSLog("Error posting image post: \(error)")
completion(false)
}
let post = Post(title: title, mediaType: .image(image), ratio: ratio, author: currentUser, audioURL: audioURL)

completion(true)
}
}
posts.append(post)
}

func addComment(with text: String, to post: inout Post) {
guard let currentUser = currentUser else { return }

guard let currentUser = Auth.auth().currentUser,
let author = Author(user: currentUser) else { return }

let comment = Comment(text: text, author: author)
let comment = Comment(text: text, author: currentUser, audioURL: nil)
post.comments.append(comment)

savePostToFirebase(post)
}

func observePosts(completion: @escaping (Error?) -> Void) {

postsRef.observe(.value, with: { (snapshot) in

guard let postDictionaries = snapshot.value as? [String: [String: Any]] else { return }

var posts: [Post] = []

for (key, value) in postDictionaries {

guard let post = Post(dictionary: value, id: key) else { continue }

posts.append(post)
}

self.posts = posts.sorted(by: { $0.timestamp > $1.timestamp })

completion(nil)

}) { (error) in
NSLog("Error fetching posts: \(error)")
}
}

func savePostToFirebase(_ post: Post, completion: (Error?) -> Void = { _ in }) {

guard let postID = post.id else { return }

let ref = postsRef.child(postID)

ref.setValue(post.dictionaryRepresentation)
}

private func store(mediaData: Data, mediaType: MediaType, completion: @escaping (URL?) -> Void) {

let mediaID = UUID().uuidString

let mediaRef = storageRef.child(mediaType.rawValue).child(mediaID)

let uploadTask = mediaRef.putData(mediaData, metadata: nil) { (metadata, error) in
if let error = error {
NSLog("Error storing media data: \(error)")
completion(nil)
return
}

if metadata == nil {
NSLog("No metadata returned from upload task.")
completion(nil)
return
}

mediaRef.downloadURL(completion: { (url, error) in

if let error = error {
NSLog("Error getting download url of media: \(error)")
}

guard let url = url else {
NSLog("Download url is nil. Unable to create a Media object")

completion(nil)
return
}
completion(url)
})
}

uploadTask.resume()
func addAudioComment(with url: URL, to post: inout Post) {
guard let currentUser = currentUser else { return }

let comment = Comment(author: currentUser, audioURL: url)
post.comments.append(comment)
}

var posts: [Post] = []
let currentUser = Auth.auth().currentUser
let postsRef = Database.database().reference().child("posts")

let storageRef = Storage.storage().reference()


}
Loading