diff --git a/elpha-ios.xcodeproj/project.pbxproj b/elpha-ios.xcodeproj/project.pbxproj index 0d47920..3e67cdc 100644 --- a/elpha-ios.xcodeproj/project.pbxproj +++ b/elpha-ios.xcodeproj/project.pbxproj @@ -41,6 +41,8 @@ 15960E84213774FC00C38CE9 /* InstancesTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15960E83213774FC00C38CE9 /* InstancesTableViewController.swift */; }; 15A79B2E215C63B6007A326E /* AlamofireImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1517EA842159D72200DE80D6 /* AlamofireImage.framework */; }; 15A79B43215EB959007A326E /* CoreDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15A79B42215EB959007A326E /* CoreDataManager.swift */; }; + 15BB72A92171A6BE002F1FA4 /* TimelinesTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15BB72A82171A6BE002F1FA4 /* TimelinesTableViewController.swift */; }; + 15BB72AB2171A8D4002F1FA4 /* TimelinesTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15BB72AA2171A8D4002F1FA4 /* TimelinesTableViewCell.swift */; }; 15C91A02216AB2D600D97DC3 /* NewStatusesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 15C91A01216AB2D600D97DC3 /* NewStatusesView.xib */; }; 15C91A04216AB32500D97DC3 /* NewStatusesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15C91A03216AB32500D97DC3 /* NewStatusesView.swift */; }; 15F9981721629965009E58DA /* TimelineTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F9981621629965009E58DA /* TimelineTableViewController.swift */; }; @@ -310,6 +312,8 @@ 15A79AE7215B3CC5007A326E /* MastodonKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = MastodonKit.xcodeproj; path = Frameworks/MastodonKit/MastodonKit.xcodeproj; sourceTree = ""; }; 15A79B08215B438C007A326E /* OAuthSwift.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = OAuthSwift.xcodeproj; path = Frameworks/OAuthSwift/OAuthSwift.xcodeproj; sourceTree = ""; }; 15A79B42215EB959007A326E /* CoreDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataManager.swift; sourceTree = ""; }; + 15BB72A82171A6BE002F1FA4 /* TimelinesTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelinesTableViewController.swift; sourceTree = ""; }; + 15BB72AA2171A8D4002F1FA4 /* TimelinesTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelinesTableViewCell.swift; sourceTree = ""; }; 15C91A01216AB2D600D97DC3 /* NewStatusesView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NewStatusesView.xib; sourceTree = ""; }; 15C91A03216AB32500D97DC3 /* NewStatusesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewStatusesView.swift; sourceTree = ""; }; 15F9981621629965009E58DA /* TimelineTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineTableViewController.swift; sourceTree = ""; }; @@ -382,6 +386,7 @@ isa = PBXGroup; children = ( 159048AE214F5015004F4014 /* InstancesTableViewCell.swift */, + 15BB72AA2171A8D4002F1FA4 /* TimelinesTableViewCell.swift */, 159026AD2162CF5600D362DD /* TimelineTableViewCell.swift */, ); name = Views; @@ -477,6 +482,7 @@ 15960E792132387A00C38CE9 /* MainTabBarController.swift */, 15960E5E213145E100C38CE9 /* SecondViewController.swift */, 15960E812136668500C38CE9 /* TimelinesNavigationController.swift */, + 15BB72A82171A6BE002F1FA4 /* TimelinesTableViewController.swift */, 15F9981621629965009E58DA /* TimelineTableViewController.swift */, ); name = "View Controllers"; @@ -803,6 +809,7 @@ 15960E7E21329FED00C38CE9 /* AuthenticateViewController.swift in Sources */, 15960E5B213145E100C38CE9 /* AppDelegate.swift in Sources */, 15131EF2216D8D570092B252 /* StatusView.swift in Sources */, + 15BB72A92171A6BE002F1FA4 /* TimelinesTableViewController.swift in Sources */, 15960E7721322C6F00C38CE9 /* Configuration.swift in Sources */, 15C91A04216AB32500D97DC3 /* NewStatusesView.swift in Sources */, 15131EF6216DBA820092B252 /* AccountNavigationController.swift in Sources */, @@ -811,6 +818,7 @@ 15960E7321322BC700C38CE9 /* KeychainItemAccessibility.swift in Sources */, 159026D02163069600D362DD /* Date+TimeAgo.swift in Sources */, 15A79B43215EB959007A326E /* CoreDataManager.swift in Sources */, + 15BB72AB2171A8D4002F1FA4 /* TimelinesTableViewCell.swift in Sources */, 1574148D2169AD0100C841BD /* AttachmentsManager.swift in Sources */, 15960E822136668500C38CE9 /* TimelinesNavigationController.swift in Sources */, 159026AE2162CF5600D362DD /* TimelineTableViewCell.swift in Sources */, diff --git a/elpha-ios/AccountTableViewController.swift b/elpha-ios/AccountTableViewController.swift index 3d1bc91..44117b1 100644 --- a/elpha-ios/AccountTableViewController.swift +++ b/elpha-ios/AccountTableViewController.swift @@ -11,6 +11,7 @@ import MastodonKit import UIKit class AccountTableViewController: UITableViewController { + @IBOutlet var headerView: UIView! @IBOutlet var headerImageView: UIImageView! @IBOutlet var avatarImageView: UIImageView! @IBOutlet var displayNameLabel: UILabel! @@ -22,7 +23,7 @@ class AccountTableViewController: UITableViewController { public var account: AccountMO? = nil - private func setAccount(_ account: AccountMO) { + private func updateHeader(withAccount account: AccountMO) { let avatarFilter = AspectScaledToFillSizeWithRoundedCornersFilter( size: CGSize(width: 70.0, height: 70.0), radius: 20.0, @@ -63,18 +64,14 @@ class AccountTableViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() - if let navigationController = navigationController { - navigationController.view.backgroundColor = .clear - } - if self.account == nil { - if let session = AuthenticationManager.shared.selectedSession { + if let session = AuthenticationManager.shared.session { self.account = session.account } } if let account = account { - setAccount(account) + updateHeader(withAccount: account) } } @@ -82,7 +79,7 @@ class AccountTableViewController: UITableViewController { super.viewDidAppear(animated) if let account = self.account { - if let client = AuthenticationManager.shared.mkClientForSelectedSession() { + if let client = AuthenticationManager.shared.mkClient { let request = Accounts.account(id: account.id!) client.run(request) { result in @@ -92,7 +89,7 @@ class AccountTableViewController: UITableViewController { if let account = self.account { DispatchQueue.main.async { - self.setAccount(account) + self.updateHeader(withAccount: account) } } case .failure(let error): diff --git a/elpha-ios/Assets.xcassets/Globe White.imageset/Contents.json b/elpha-ios/Assets.xcassets/Globe White.imageset/Contents.json new file mode 100644 index 0000000..ba85773 --- /dev/null +++ b/elpha-ios/Assets.xcassets/Globe White.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "globe-white.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/elpha-ios/Assets.xcassets/Globe.imageset/globe-white.pdf b/elpha-ios/Assets.xcassets/Globe White.imageset/globe-white.pdf similarity index 100% rename from elpha-ios/Assets.xcassets/Globe.imageset/globe-white.pdf rename to elpha-ios/Assets.xcassets/Globe White.imageset/globe-white.pdf diff --git a/elpha-ios/Assets.xcassets/Globe.imageset/Contents.json b/elpha-ios/Assets.xcassets/Globe.imageset/Contents.json index ba85773..aa4ae54 100644 --- a/elpha-ios/Assets.xcassets/Globe.imageset/Contents.json +++ b/elpha-ios/Assets.xcassets/Globe.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "globe-white.pdf" + "filename" : "globe.pdf" } ], "info" : { diff --git a/elpha-ios/Assets.xcassets/Globe.imageset/globe.pdf b/elpha-ios/Assets.xcassets/Globe.imageset/globe.pdf new file mode 100644 index 0000000..b8a6d84 Binary files /dev/null and b/elpha-ios/Assets.xcassets/Globe.imageset/globe.pdf differ diff --git a/elpha-ios/Assets.xcassets/Home.imageset/Contents.json b/elpha-ios/Assets.xcassets/Home.imageset/Contents.json new file mode 100644 index 0000000..d675922 --- /dev/null +++ b/elpha-ios/Assets.xcassets/Home.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "home.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/elpha-ios/Assets.xcassets/Home.imageset/home.pdf b/elpha-ios/Assets.xcassets/Home.imageset/home.pdf new file mode 100644 index 0000000..d83fa97 Binary files /dev/null and b/elpha-ios/Assets.xcassets/Home.imageset/home.pdf differ diff --git a/elpha-ios/Assets.xcassets/Tag.imageset/Contents.json b/elpha-ios/Assets.xcassets/Tag.imageset/Contents.json new file mode 100644 index 0000000..26822d6 --- /dev/null +++ b/elpha-ios/Assets.xcassets/Tag.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "tag.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/elpha-ios/Assets.xcassets/Tag.imageset/tag.pdf b/elpha-ios/Assets.xcassets/Tag.imageset/tag.pdf new file mode 100644 index 0000000..a7d3c86 Binary files /dev/null and b/elpha-ios/Assets.xcassets/Tag.imageset/tag.pdf differ diff --git a/elpha-ios/Assets.xcassets/Users.imageset/Contents.json b/elpha-ios/Assets.xcassets/Users.imageset/Contents.json new file mode 100644 index 0000000..eb6f086 --- /dev/null +++ b/elpha-ios/Assets.xcassets/Users.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "users.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/elpha-ios/Assets.xcassets/Users.imageset/users.pdf b/elpha-ios/Assets.xcassets/Users.imageset/users.pdf new file mode 100644 index 0000000..fbdd48a Binary files /dev/null and b/elpha-ios/Assets.xcassets/Users.imageset/users.pdf differ diff --git a/elpha-ios/AttachmentsManager.swift b/elpha-ios/AttachmentsManager.swift index 03b157b..0a9a869 100644 --- a/elpha-ios/AttachmentsManager.swift +++ b/elpha-ios/AttachmentsManager.swift @@ -39,241 +39,126 @@ class AttachmentsManager { ) view.addSubview(imageView) - imageView.translatesAutoresizingMaskIntoConstraints = false - view.addConstraint(getLeadingConstraint(from: imageView, to: view)) - view.addConstraint(getTrailingConstraint(from: imageView, to: view)) - view.addConstraint(getTopConstraint(from: imageView, to: view)) - view.addConstraint(getBottomConstraint(from: imageView, to: view)) - imageView.addConstraint(getWidthConstraint(view: imageView, width: view.frame.width)) - imageView.addConstraint(getHeightConstraint(view: imageView, height: view.frame.width)) + NSLayoutConstraint.activate([ + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.widthAnchor.constraint(equalToConstant: view.frame.width), + imageView.heightAnchor.constraint(equalToConstant: view.frame.width), + ]) case 2: let filter = AspectScaledToFillSizeFilter(size: CGSize(width: halfWidth, height: view.frame.width)) - let firstImageView = UIImageView() - let secondImageView = UIImageView() + let imageViews = [ + UIImageView(), + UIImageView(), + ] - [firstImageView, secondImageView].forEach { imageView in + for (index, imageView) in imageViews.enumerated() { imageView.contentMode = UIImageView.ContentMode.scaleAspectFill + imageView.af_setImage( + withURL: (attachments[index] as! AttachmentMO).url!, + placeholderImage: placeholderImage, + filter: filter + ) + + view.addSubview(imageView) + imageView.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + imageView.widthAnchor.constraint(equalToConstant: halfWidth), + imageView.heightAnchor.constraint(equalToConstant: view.frame.width), + ]) } - firstImageView.af_setImage( - withURL: (attachments[0] as! AttachmentMO).url!, - placeholderImage: placeholderImage, - filter: filter - ) - - secondImageView.af_setImage( - withURL: (attachments[1] as! AttachmentMO).url!, - placeholderImage: placeholderImage, - filter: filter - ) - - view.addSubview(firstImageView) - view.addSubview(secondImageView) - - firstImageView.translatesAutoresizingMaskIntoConstraints = false - secondImageView.translatesAutoresizingMaskIntoConstraints = false - - [firstImageView, secondImageView].forEach { imageView in - view.addConstraint(getLeadingConstraint(from: imageView, to: view)) - view.addConstraint(getTrailingConstraint(from: imageView, to: view)) - view.addConstraint(getTopConstraint(from: imageView, to: view)) - view.addConstraint(getBottomConstraint(from: imageView, to: view)) - imageView.addConstraint(getHeightConstraint(view: imageView, height: view.frame.width)) - imageView.addConstraint(getWidthConstraint(view: imageView, width: halfWidth)) - } + NSLayoutConstraint.activate([ + imageViews[0].leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageViews[1].trailingAnchor.constraint(equalTo: view.trailingAnchor), + ]) case 3: let primaryFilter = AspectScaledToFillSizeFilter(size: CGSize(width: halfWidth, height: view.frame.width)) let secondaryFilter = AspectScaledToFillSizeFilter(size: CGSize(width: halfWidth, height: halfWidth)) - let firstImageView = UIImageView() - let secondImageView = UIImageView() - let thirdImageView = UIImageView() + let imageViews = [ + UIImageView(), + UIImageView(), + UIImageView(), + ] - [firstImageView, secondImageView, thirdImageView].forEach { imageView in + for (index, imageView) in imageViews.enumerated() { imageView.contentMode = UIImageView.ContentMode.scaleAspectFill + imageView.af_setImage( + withURL: (attachments[index] as! AttachmentMO).url!, + placeholderImage: placeholderImage, + filter: index == 0 ? primaryFilter : secondaryFilter + ) + + view.addSubview(imageView) + imageView.translatesAutoresizingMaskIntoConstraints = false + + if index == 0 { + NSLayoutConstraint.activate([ + imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageView.topAnchor.constraint(equalTo: view.topAnchor), + imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + imageView.widthAnchor.constraint(equalToConstant: halfWidth), + imageView.heightAnchor.constraint(equalToConstant: view.frame.width), + ]) + } else { + NSLayoutConstraint.activate([ + imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageView.widthAnchor.constraint(equalToConstant: halfWidth), + imageView.heightAnchor.constraint(equalToConstant: halfWidth), + ]) + } } - firstImageView.af_setImage( - withURL: (attachments[0] as! AttachmentMO).url!, - placeholderImage: placeholderImage, - filter: primaryFilter - ) - - secondImageView.af_setImage( - withURL: (attachments[1] as! AttachmentMO).url!, - placeholderImage: placeholderImage, - filter: secondaryFilter - ) - - thirdImageView.af_setImage( - withURL: (attachments[2] as! AttachmentMO).url!, - placeholderImage: placeholderImage, - filter: secondaryFilter - ) - - view.addSubview(firstImageView) - view.addSubview(secondImageView) - view.addSubview(thirdImageView) - - firstImageView.translatesAutoresizingMaskIntoConstraints = false - secondImageView.translatesAutoresizingMaskIntoConstraints = false - thirdImageView.translatesAutoresizingMaskIntoConstraints = false - - view.addConstraint(getLeadingConstraint(from: firstImageView, to: view)) - view.addConstraint(getTopConstraint(from: firstImageView, to: view)) - view.addConstraint(getBottomConstraint(from: firstImageView, to: view)) - firstImageView.addConstraint(getHeightConstraint(view: firstImageView, height: view.frame.width)) - firstImageView.addConstraint(getWidthConstraint(view: firstImageView, width: halfWidth)) - - view.addConstraint(getTopConstraint(from: secondImageView, to: view)) - view.addConstraint(getBottomConstraint(from: thirdImageView, to: view)) - - [secondImageView, thirdImageView].forEach { imageView in - view.addConstraint(getTrailingConstraint(from: imageView, to: view)) - imageView.addConstraint(getHeightConstraint(view: imageView, height: halfWidth)) - imageView.addConstraint(getWidthConstraint(view: imageView, width: halfWidth)) - } + NSLayoutConstraint.activate([ + imageViews[2].topAnchor.constraint(equalTo: view.topAnchor), + imageViews[3].bottomAnchor.constraint(equalTo: view.bottomAnchor), + ]) default: let filter = AspectScaledToFillSizeFilter(size: CGSize(width: halfWidth, height: halfWidth)) - let firstImageView = UIImageView() - let secondImageView = UIImageView() - let thirdImageView = UIImageView() - let fourthImageView = UIImageView() + let imageViews = [ + UIImageView(), + UIImageView(), + UIImageView(), + UIImageView(), + ] - [firstImageView, secondImageView, thirdImageView, fourthImageView].forEach { imageView in + for (index, imageView) in imageViews.enumerated() { imageView.contentMode = UIImageView.ContentMode.scaleAspectFill + imageView.af_setImage( + withURL: (attachments[index] as! AttachmentMO).url!, + placeholderImage: placeholderImage, + filter: filter + ) + + view.addSubview(imageView) + imageView.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + imageView.widthAnchor.constraint(equalToConstant: halfWidth), + imageView.heightAnchor.constraint(equalToConstant: halfWidth), + ]) } - firstImageView.af_setImage( - withURL: (attachments[0] as! AttachmentMO).url!, - placeholderImage: placeholderImage, - filter: filter - ) - - secondImageView.af_setImage( - withURL: (attachments[1] as! AttachmentMO).url!, - placeholderImage: placeholderImage, - filter: filter - ) - - thirdImageView.af_setImage( - withURL: (attachments[2] as! AttachmentMO).url!, - placeholderImage: placeholderImage, - filter: filter - ) - - fourthImageView.af_setImage( - withURL: (attachments[3] as! AttachmentMO).url!, - placeholderImage: placeholderImage, - filter: filter - ) - - view.addSubview(firstImageView) - view.addSubview(secondImageView) - view.addSubview(thirdImageView) - view.addSubview(fourthImageView) - - firstImageView.translatesAutoresizingMaskIntoConstraints = false - secondImageView.translatesAutoresizingMaskIntoConstraints = false - thirdImageView.translatesAutoresizingMaskIntoConstraints = false - fourthImageView.translatesAutoresizingMaskIntoConstraints = false - - [firstImageView, secondImageView, thirdImageView, fourthImageView].forEach { imageView in - imageView.addConstraint(getHeightConstraint(view: imageView, height: halfWidth)) - imageView.addConstraint(getWidthConstraint(view: imageView, width: halfWidth)) - } - - [firstImageView, secondImageView].forEach { imageView in - view.addConstraint(getTopConstraint(from: imageView, to: view)) - } - - [thirdImageView, fourthImageView].forEach { imageView in - view.addConstraint(getBottomConstraint(from: imageView, to: view)) - } - - [firstImageView, thirdImageView].forEach { imageView in - view.addConstraint(getLeadingConstraint(from: imageView, to: view)) - } - - [secondImageView, fourthImageView].forEach { imageView in - view.addConstraint(getTrailingConstraint(from: imageView, to: view)) - } + NSLayoutConstraint.activate([ + imageViews[0].topAnchor.constraint(equalTo: view.topAnchor), + imageViews[0].leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageViews[1].topAnchor.constraint(equalTo: view.topAnchor), + imageViews[1].trailingAnchor.constraint(equalTo: view.trailingAnchor), + imageViews[3].leadingAnchor.constraint(equalTo: view.leadingAnchor), + imageViews[3].bottomAnchor.constraint(equalTo: view.bottomAnchor), + imageViews[4].bottomAnchor.constraint(equalTo: view.bottomAnchor), + imageViews[4].trailingAnchor.constraint(equalTo: view.trailingAnchor), + ]) } } - - static func getTopConstraint(from: UIView, to: UIView) -> NSLayoutConstraint { - return NSLayoutConstraint( - item: from, - attribute: NSLayoutConstraint.Attribute.top, - relatedBy: NSLayoutConstraint.Relation.equal, - toItem: to, - attribute: NSLayoutConstraint.Attribute.top, - multiplier: 1, - constant: 0 - ) - } - - static func getBottomConstraint(from: UIView, to: UIView) -> NSLayoutConstraint { - return NSLayoutConstraint( - item: from, - attribute: NSLayoutConstraint.Attribute.bottom, - relatedBy: NSLayoutConstraint.Relation.equal, - toItem: to, - attribute: NSLayoutConstraint.Attribute.bottom, - multiplier: 1, - constant: 0 - ) - } - - static func getLeadingConstraint(from: UIView, to: UIView) -> NSLayoutConstraint { - return NSLayoutConstraint( - item: from, - attribute: NSLayoutConstraint.Attribute.leading, - relatedBy: NSLayoutConstraint.Relation.equal, - toItem: to, - attribute: NSLayoutConstraint.Attribute.leading, - multiplier: 1, - constant: 0 - ) - } - - static func getTrailingConstraint(from: UIView, to: UIView) -> NSLayoutConstraint { - return NSLayoutConstraint( - item: from, - attribute: NSLayoutConstraint.Attribute.trailing, - relatedBy: NSLayoutConstraint.Relation.equal, - toItem: to, - attribute: NSLayoutConstraint.Attribute.trailing, - multiplier: 1, - constant: 0 - ) - } - - static func getWidthConstraint(view: UIView, width: CGFloat) -> NSLayoutConstraint { - return NSLayoutConstraint( - item: view, - attribute: NSLayoutConstraint.Attribute.width, - relatedBy: NSLayoutConstraint.Relation.equal, - toItem: nil, - attribute: NSLayoutConstraint.Attribute.notAnAttribute, - multiplier: 1, - constant: width - ) - } - - static func getHeightConstraint(view: UIView, height: CGFloat) -> NSLayoutConstraint { - return NSLayoutConstraint( - item: view, - attribute: NSLayoutConstraint.Attribute.height, - relatedBy: NSLayoutConstraint.Relation.equal, - toItem: nil, - attribute: NSLayoutConstraint.Attribute.notAnAttribute, - multiplier: 1, - constant: height - ) - } } diff --git a/elpha-ios/AuthenticateViewController.swift b/elpha-ios/AuthenticateViewController.swift index f2fb6c4..d54a1f8 100644 --- a/elpha-ios/AuthenticateViewController.swift +++ b/elpha-ios/AuthenticateViewController.swift @@ -6,6 +6,7 @@ // Copyright © 2018 Elpha. All rights reserved. // +import Alamofire import CoreData import MastodonKit import OAuthSwift @@ -16,18 +17,46 @@ class AuthenticateViewController: UIViewController { @IBOutlet var instanceTextField: UITextField! var oauthswift: OAuthSwift? + let defaultInstanceName = "mastodon.social" override func viewDidLoad() { super.viewDidLoad() signInButton.layer.cornerRadius = 10 signInButton.clipsToBounds = true + + randomInstanceName { instance in + self.instanceTextField.attributedPlaceholder = NSAttributedString(string: instance, attributes: [NSAttributedString.Key.foregroundColor: UIColor.init(red: 0.9, green: 0.9, blue: 0.9, alpha: 1)]) + } } override open var shouldAutorotate: Bool { return false } + func randomInstanceName(completion: @escaping (String) -> Void) { + let requestURL = "\(Config.instancesServiceURL)\(Config.instancesServiceRandomEndpoint)?count=1" + let headers: HTTPHeaders = ["Authorization": "Bearer \(Config.instancesServiceSecret)"] + + Alamofire.request(requestURL, headers: headers).validate().responseJSON { response in + switch response.result { + case .success(let value): + guard let result = value as? [String: Any], + let instances = result["instances"] as? [Any], + let instance = instances.first as? [String: Any], + let name = instance["name"] as? String else { + completion(self.defaultInstanceName) + return + } + + completion(name) + case .failure(let error): + print("\(error)") + completion(self.defaultInstanceName) + } + } + } + func authorize(client: ClientMO) { let oauthswift = OAuth2Swift( consumerKey: client.clientID!, @@ -95,7 +124,7 @@ class AuthenticateViewController: UIViewController { request.predicate = NSPredicate(format: "url == %@", url) do { - let response = try CoreDataManager.shared.getContext().fetch(request) + let response = try CoreDataManager.shared.context.fetch(request) if let client = response.first { self.authorize(client: client) } else { diff --git a/elpha-ios/AuthenticationManager.swift b/elpha-ios/AuthenticationManager.swift index d3a8da0..b27514c 100644 --- a/elpha-ios/AuthenticationManager.swift +++ b/elpha-ios/AuthenticationManager.swift @@ -13,25 +13,25 @@ import UIKit class AuthenticationManager { static let shared = AuthenticationManager() - var sessionCount: Int { + var sessions: [SessionMO] { get { do { let request = NSFetchRequest(entityName: "Session") - return try CoreDataManager.shared.getContext().count(for: request) + return try CoreDataManager.shared.context.fetch(request) } catch { - print("Error counting Sessions \(error)") - return 0 + print("Error fetching Sessions \(error)") + return [] } } } - var selectedSession: SessionMO? { + var session: SessionMO? { get { let request = NSFetchRequest(entityName: "Session") request.predicate = NSPredicate(format: "selected = YES") do { - let results = try CoreDataManager.shared.getContext().fetch(request) + let results = try CoreDataManager.shared.context.fetch(request) return results.first } catch { print("Error fetching Session \(error)") @@ -40,9 +40,9 @@ class AuthenticationManager { } } - var selectedSessionToken: String? { + var token: String? { get { - guard let session = selectedSession, let account = session.account else { + guard let account = session?.account else { return nil } @@ -50,20 +50,22 @@ class AuthenticationManager { } } - func mkClientForSelectedSession() -> Client? { - guard let session = selectedSession, let client = session.client else { - return nil + var mkClient: Client? { + get { + guard let client = session?.client else { + return nil + } + + return Client(baseURL: "https://\(client.url!)", accessToken: token) } - - return Client(baseURL: "https://\(client.url!)", accessToken: selectedSessionToken) } func saveSession(client: ClientMO, account: AccountMO, token: String) -> SessionMO? { - if let selectedSession = selectedSession { - selectedSession.selected = false + if let session = self.session { + session.selected = false } - let session = SessionMO(context: CoreDataManager.shared.getContext()) + let session = SessionMO(context: CoreDataManager.shared.context) session.client = client session.account = account session.order = 0 diff --git a/elpha-ios/Base.lproj/Main.storyboard b/elpha-ios/Base.lproj/Main.storyboard index 547f00a..fd68fea 100644 --- a/elpha-ios/Base.lproj/Main.storyboard +++ b/elpha-ios/Base.lproj/Main.storyboard @@ -23,7 +23,7 @@ - + @@ -31,7 +31,7 @@ - +