diff --git a/Classes/New Issue/GitHubClient+NewIssue.swift b/Classes/New Issue/GitHubClient+NewIssue.swift new file mode 100644 index 00000000..d1b4f6e5 --- /dev/null +++ b/Classes/New Issue/GitHubClient+NewIssue.swift @@ -0,0 +1,38 @@ +// +// GitHubClient+NewIssue.swift +// Freetime +// +// Created by Sherlock, James on 15/09/2017. +// Copyright © 2017 Ryan Nystrom. All rights reserved. +// + +import Alamofire + +extension GithubClient { + + func createIssue(owner: String, repo: String, title: String, body: String?, completion: @escaping (IssueDetailsModel?) -> Void) { + + let params = [ + "title": title, + "body": body ?? "" + ] + + let networkCompletion: ((DataResponse, GithubClient.Page?) -> Void) = { (response, _) in + guard let dict = response.value as? [String: Any], let number = dict["number"] as? Int else { + completion(nil) + return + } + + let model = IssueDetailsModel(owner: owner, repo: repo, number: number) + completion(model) + } + + request(Request(path: "repos/\(owner)/\(repo)/issues", + method: .post, + parameters: params, + headers: nil, + logoutOnAuthFailure: false, + completion: networkCompletion)) + } + +} diff --git a/Classes/New Issue/NewIssue.storyboard b/Classes/New Issue/NewIssue.storyboard new file mode 100644 index 00000000..6904aa9c --- /dev/null +++ b/Classes/New Issue/NewIssue.storyboard @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Classes/New Issue/NewIssueTableViewController.swift b/Classes/New Issue/NewIssueTableViewController.swift new file mode 100644 index 00000000..b3d191b8 --- /dev/null +++ b/Classes/New Issue/NewIssueTableViewController.swift @@ -0,0 +1,198 @@ +// +// NewIssueTableViewController.swift +// Freetime +// +// Created by Sherlock, James on 22/09/2017. +// Copyright © 2017 Ryan Nystrom. All rights reserved. +// + +import UIKit + +enum IssueSignatureType { + case bugReport + case sentWithGitHawk + + var addition: String { + switch self { + case .bugReport: + #if TESTFLIGHT + let testFlight = "true" + #else + let testFlight = "false" + #endif + + return [ + "\n", + "
", + "Bug Report Dump (Auto-generated)", + "
",
+                Bundle.main.prettyVersionString,
+                "Device: \(UIDevice.current.modelName) (iOS \(UIDevice.current.systemVersion))",
+                "TestFlight: \(testFlight)",
+                "
", + "
" + ].joined(separator: "\n") + case .sentWithGitHawk: + return Signature.signed(text: "") + } + } +} + +class NewIssueTableViewController: UITableViewController, UITextFieldDelegate, IssueTextActionsViewDelegate { + + @IBOutlet var titleField: UITextField! + @IBOutlet var bodyField: UITextView! + + var client: GithubClient! + var owner: String! + var repo: String! + var signature: IssueSignatureType? + + private var titleText: String? { + guard let raw = titleField.text?.trimmingCharacters(in: .whitespacesAndNewlines) else { return nil } + if raw.isEmpty { return nil } + return raw + } + + private var bodyText: String? { + let raw = bodyField.text.trimmingCharacters(in: .whitespacesAndNewlines) + if raw.isEmpty { return nil } + return raw + } + + static func create(client: GithubClient, + owner: String, + repo: String, + signature: IssueSignatureType? = nil) -> NewIssueTableViewController? { + let storyboard = UIStoryboard(name: "NewIssue", bundle: nil) + + let viewController = storyboard.instantiateInitialViewController() as? NewIssueTableViewController + viewController?.hidesBottomBarWhenPushed = true + viewController?.client = client + viewController?.owner = owner + viewController?.repo = repo + viewController?.signature = signature + + return viewController + } + + override func viewDidLoad() { + super.viewDidLoad() + + // Add send button + navigationItem.rightBarButtonItem = UIBarButtonItem( + title: NSLocalizedString("Send", comment: ""), + style: .done, + target: self, + action: #selector(send) + ) + + // Add cancel button + navigationItem.leftBarButtonItem = UIBarButtonItem( + title: NSLocalizedString("Cancel", comment: ""), + style: .plain, + target: self, + action: #selector(cancel) + ) + + // Make the return button move on to description field + titleField.delegate = self + + // Setup markdown input view + setupInputView() + + // Update title to use localization + title = NSLocalizedString("New Issue", comment: "") + } + + // MARK: - Buttons + + /// Attempts to sends the current forms information to GitHub, on success will redirect the user to the new issue + func send() { + guard let titleText = titleText else { + StatusBar.showError(message: NSLocalizedString("You must provide a title!", comment: "Invalid title when sending new issue")) + return + } + + let signature = self.signature?.addition ?? "" + + client.createIssue(owner: owner, repo: repo, title: titleText, body: (bodyText ?? "") + signature) { [weak self] model in + guard let weakSelf = self, let navController = weakSelf.navigationController else { return } + + guard let model = model else { + StatusBar.showGenericError() + return + } + + let issuesViewController = IssuesViewController(client: weakSelf.client, model: model) + issuesViewController.hidesBottomBarWhenPushed = true + + navController.replaceTopMostViewController(issuesViewController, animated: true) + } + } + + /// Ensures there are no unsaved changes before dismissing the view controller. Will prompt user if unsaved changes. + func cancel() { + if titleText == nil && bodyText == nil { + _ = navigationController?.popViewController(animated: true) + return + } + + let title = NSLocalizedString("Unsaved Changes", comment: "New Issue - Cancel w/ Unsaved Changes Title") + let message = NSLocalizedString("Are you sure you want to cancel this new issue? Your message will be lost.", comment: "New Issue - Cancel w/ Unsaved Changes Message") + + let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) + alert.addAction(UIAlertAction(title: NSLocalizedString("No", comment: ""), style: .cancel, handler: nil)) + alert.addAction(UIAlertAction(title: NSLocalizedString("Yes", comment: ""), style: .destructive, handler: { [weak self] _ in + _ = self?.navigationController?.popViewController(animated: true) + })) + + present(alert, animated: true, completion: nil) + } + + // MARK: - Markdown + + func setupInputView() { + let operations: [IssueTextActionOperation] = [ + IssueTextActionOperation(icon: UIImage(named: "bar-eye"), operation: .execute({ [weak self] in + guard let strongSelf = self else { return } + let controller = IssuePreviewViewController(markdown: strongSelf.bodyField.text, owner: strongSelf.owner, repo: strongSelf.repo) + strongSelf.showDetailViewController(controller, sender: nil) + })), + IssueTextActionOperation(icon: UIImage(named: "bar-bold"), operation: .wrap("**", "**")), + IssueTextActionOperation(icon: UIImage(named: "bar-italic"), operation: .wrap("_", "_")), + IssueTextActionOperation(icon: UIImage(named: "bar-code"), operation: .wrap("`", "`")), + IssueTextActionOperation(icon: UIImage(named: "bar-code-block"), operation: .wrap("```\n", "\n```")), + IssueTextActionOperation(icon: UIImage(named: "bar-strikethrough"), operation: .wrap("~~", "~~")), + IssueTextActionOperation(icon: UIImage(named: "bar-header"), operation: .line("#")), + IssueTextActionOperation(icon: UIImage(named: "bar-ul"), operation: .line("- ")), + IssueTextActionOperation(icon: UIImage(named: "bar-indent"), operation: .line(" ")), + IssueTextActionOperation(icon: UIImage(named: "bar-link"), operation: .wrap("[", "](\(UITextView.cursorToken))")), + ] + + let actions = IssueTextActionsView(operations: operations) + actions.delegate = self + actions.frame = CGRect(x: 0, y: 0, width: 10, height: 50) + actions.backgroundColor = .white + bodyField.inputAccessoryView = actions + } + + // MARK: - UITextFieldDelegate + + /// Called when the user taps return on the title field, moves their cursor to the body + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + bodyField.becomeFirstResponder() + return false + } + + // MARK: - IssueTextActionsViewDelegate + + /// Called when a user taps on one of the control buttons (preview, bold, etc) + func didSelect(actionsView: IssueTextActionsView, operation: IssueTextActionOperation) { + switch operation.operation { + case .execute(let block): block() + case .wrap(let left, let right): bodyField.replace(left: left, right: right, atLineStart: false) + case .line(let left): bodyField.replace(left: left, right: nil, atLineStart: true) + } + } +} diff --git a/Classes/Notifications/NotificationCell.swift b/Classes/Notifications/NotificationCell.swift index 79ca0522..e34f37ea 100644 --- a/Classes/Notifications/NotificationCell.swift +++ b/Classes/Notifications/NotificationCell.swift @@ -103,7 +103,7 @@ final class NotificationCell: SwipeSelectableCell { reasonImageView.image = viewModel.type.icon?.withRenderingMode(.alwaysTemplate) accessibilityLabel = contentView.subviews .flatMap { $0.accessibilityLabel } - .reduce("", { "\($0 ?? "").\n\($1)" }) + .reduce("", { "\($0).\n\($1)" }) .appending(".\n\(viewModel.type.localizedString)") } diff --git a/Classes/Repository/RepositoryViewController.swift b/Classes/Repository/RepositoryViewController.swift index 13b59e84..d2f34c2e 100644 --- a/Classes/Repository/RepositoryViewController.swift +++ b/Classes/Repository/RepositoryViewController.swift @@ -91,9 +91,33 @@ class RepositoryViewController: TabmanViewController, PageboyViewControllerDataS strongSelf.presentSafari(url: url) } } + + func newIssueAction() -> UIAlertAction { + return UIAlertAction(title: NSLocalizedString("Create Issue", comment: ""), style: .default) { [weak self] _ in + guard let strongSelf = self else { return } + + guard let newIssueViewController = NewIssueTableViewController.create( + client: strongSelf.client, + owner: strongSelf.repo.owner, + repo: strongSelf.repo.name, + signature: .sentWithGitHawk) + else { + StatusBar.showGenericError() + return + } + + let navController = UINavigationController(rootViewController: newIssueViewController) + strongSelf.showDetailViewController(navController, sender: nil) + } + } func onMore(sender: UIBarButtonItem) { let alert = UIAlertController.configured(preferredStyle: .actionSheet) + + if repo.hasIssuesEnabled { + alert.addAction(newIssueAction()) + } + alert.addAction(shareAction(sender: sender)) alert.addAction(safariAction()) alert.addAction(viewOwnerAction()) diff --git a/Classes/Settings/SettingsViewController.swift b/Classes/Settings/SettingsViewController.swift index 521f4558..6d829f25 100644 --- a/Classes/Settings/SettingsViewController.swift +++ b/Classes/Settings/SettingsViewController.swift @@ -15,7 +15,7 @@ final class SettingsViewController: UITableViewController { var sessionManager: GithubSessionManager! weak var rootNavigationManager: RootNavigationManager? = nil - private var client: GithubClient? + var client: GithubClient! @IBOutlet weak var versionLabel: UILabel! @IBOutlet weak var reviewAccessCell: StyledTableCell! @@ -34,8 +34,6 @@ final class SettingsViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() - client = newGithubClient(sessionManager: sessionManager) - versionLabel.text = Bundle.main.prettyVersionString markReadSwitch.isOn = NotificationClient.readOnOpen() apiStatusView.layer.cornerRadius = 7 @@ -95,12 +93,17 @@ final class SettingsViewController: UITableViewController { } func onReportBug() { - let template = "\(Bundle.main.prettyVersionString)\nDevice: \(UIDevice.current.modelName) (iOS \(UIDevice.current.systemVersion)) \n" - .addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" - - guard let url = URL(string: "https://github.com/rnystrom/GitHawk/issues/new?body=\(template)") - else { fatalError("Should always create GitHub issue URL") } - presentSafari(url: url) + guard let client = client, + let viewController = NewIssueTableViewController.create(client: client, + owner: "rnystrom", + repo: "GitHawk", + signature: .bugReport) else { + StatusBar.showGenericError() + return + } + + let navController = UINavigationController(rootViewController: viewController) + showDetailViewController(navController, sender: nil) } func onViewSource() { diff --git a/Classes/Systems/RootNavigationManager.swift b/Classes/Systems/RootNavigationManager.swift index 62b27c24..5a05ae34 100644 --- a/Classes/Systems/RootNavigationManager.swift +++ b/Classes/Systems/RootNavigationManager.swift @@ -64,6 +64,7 @@ final class RootNavigationManager: GithubSessionListener { // rebuild the settings VC if it doesn't exist settingsRootViewController = settingsRootViewController ?? newSettingsRootViewController( sessionManager: sessionManager, + client: client, rootNavigationManager: self ) diff --git a/Classes/Systems/StatusBar.swift b/Classes/Systems/StatusBar.swift index 72dbbc8e..ca6b0f83 100644 --- a/Classes/Systems/StatusBar.swift +++ b/Classes/Systems/StatusBar.swift @@ -50,5 +50,14 @@ enum StatusBar { ) provideHapticFeedback() } + + static func showError(message: String) { + JDStatusBarNotification.show( + withStatus: message, + dismissAfter: 3, + styleName: JDStatusBarStyleError + ) + provideHapticFeedback() + } } diff --git a/Classes/Utility/UINavigationController+Replace.swift b/Classes/Utility/UINavigationController+Replace.swift new file mode 100644 index 00000000..45f8c8b1 --- /dev/null +++ b/Classes/Utility/UINavigationController+Replace.swift @@ -0,0 +1,19 @@ +// +// UINavigationController+Replace.swift +// Freetime +// +// Created by Sherlock, James on 16/09/2017. +// Copyright © 2017 Ryan Nystrom. All rights reserved. +// + +import UIKit + +extension UINavigationController { + + func replaceTopMostViewController(_ newViewController: UIViewController, animated: Bool) { + var currentViewControllers = viewControllers + currentViewControllers[viewControllers.count - 1] = newViewController + setViewControllers(currentViewControllers, animated: animated) + } + +} diff --git a/Classes/View Controllers/RootViewControllers.swift b/Classes/View Controllers/RootViewControllers.swift index 7f2ef8b4..fe87d415 100644 --- a/Classes/View Controllers/RootViewControllers.swift +++ b/Classes/View Controllers/RootViewControllers.swift @@ -10,6 +10,7 @@ import UIKit func newSettingsRootViewController( sessionManager: GithubSessionManager, + client: GithubClient, rootNavigationManager: RootNavigationManager ) -> UIViewController { guard let controller = UIStoryboard(name: "Settings", bundle: nil).instantiateInitialViewController() @@ -17,6 +18,7 @@ func newSettingsRootViewController( if let nav = controller as? UINavigationController, let first = nav.viewControllers.first as? SettingsViewController { + first.client = client first.sessionManager = sessionManager first.rootNavigationManager = rootNavigationManager nav.tabBarItem.title = NSLocalizedString("Settings", comment: "") diff --git a/Freetime.xcodeproj/project.pbxproj b/Freetime.xcodeproj/project.pbxproj index 30752b89..082ae19d 100644 --- a/Freetime.xcodeproj/project.pbxproj +++ b/Freetime.xcodeproj/project.pbxproj @@ -319,6 +319,7 @@ 54AD5E8E1F24D953004A4BD6 /* FeedSelectionProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54AD5E8D1F24D953004A4BD6 /* FeedSelectionProviding.swift */; }; 6224B05BDD260B22C7D6684F /* Pods_FreetimeTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB06D68438D845EC6D23788D /* Pods_FreetimeTests.framework */; }; 984D9CA91F212ADF00ECEA7F /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 984D9CA81F212ADF00ECEA7F /* Settings.bundle */; }; + 98647DF31F758CCF00A4DE7A /* NewIssueTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98647DF21F758CCF00A4DE7A /* NewIssueTableViewController.swift */; }; 986B87191F2B875800AAB55C /* GithubClient+Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986B87181F2B875800AAB55C /* GithubClient+Search.swift */; }; 986B871B1F2B87DD00AAB55C /* SearchRepoResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986B871A1F2B87DD00AAB55C /* SearchRepoResult.swift */; }; 986B871D1F2B8FCD00AAB55C /* SearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986B871C1F2B8FCD00AAB55C /* SearchViewController.swift */; }; @@ -334,6 +335,9 @@ 98835BCE1F1965E2005BA24F /* UIDevice+Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98835BCD1F1965E2005BA24F /* UIDevice+Model.swift */; }; 98835BD21F1A158D005BA24F /* LabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98835BD11F1A158D005BA24F /* LabelCell.swift */; }; 98835BD41F1A17EE005BA24F /* Bundle+Version.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98835BD31F1A17EE005BA24F /* Bundle+Version.swift */; }; + 98B5A0821F6C73D6000617D6 /* NewIssue.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 98B5A0811F6C73D6000617D6 /* NewIssue.storyboard */; }; + 98B5A0841F6C87A7000617D6 /* GitHubClient+NewIssue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B5A0831F6C87A7000617D6 /* GitHubClient+NewIssue.swift */; }; + 98B5A0861F6D0FFE000617D6 /* UINavigationController+Replace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B5A0851F6D0FFE000617D6 /* UINavigationController+Replace.swift */; }; 98F0A0431F27BC4B0062A2CA /* emoji.json in Resources */ = {isa = PBXBuildFile; fileRef = 98F0A0421F27BC4B0062A2CA /* emoji.json */; }; /* End PBXBuildFile section */ @@ -649,6 +653,7 @@ 7ADC39F0C328AE48CFFA207E /* Pods-FreetimeTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FreetimeTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-FreetimeTests/Pods-FreetimeTests.debug.xcconfig"; sourceTree = ""; }; 9317BF4284E8616256D3743A /* Pods-FreetimeTests.testflight.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FreetimeTests.testflight.xcconfig"; path = "Pods/Target Support Files/Pods-FreetimeTests/Pods-FreetimeTests.testflight.xcconfig"; sourceTree = ""; }; 984D9CA81F212ADF00ECEA7F /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = ""; }; + 98647DF21F758CCF00A4DE7A /* NewIssueTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewIssueTableViewController.swift; sourceTree = ""; }; 986B87181F2B875800AAB55C /* GithubClient+Search.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GithubClient+Search.swift"; sourceTree = ""; }; 986B871A1F2B87DD00AAB55C /* SearchRepoResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchRepoResult.swift; sourceTree = ""; }; 986B871C1F2B8FCD00AAB55C /* SearchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchViewController.swift; sourceTree = ""; }; @@ -664,6 +669,9 @@ 98835BCD1F1965E2005BA24F /* UIDevice+Model.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIDevice+Model.swift"; sourceTree = ""; }; 98835BD11F1A158D005BA24F /* LabelCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LabelCell.swift; sourceTree = ""; }; 98835BD31F1A17EE005BA24F /* Bundle+Version.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bundle+Version.swift"; sourceTree = ""; }; + 98B5A0811F6C73D6000617D6 /* NewIssue.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = NewIssue.storyboard; sourceTree = ""; }; + 98B5A0831F6C87A7000617D6 /* GitHubClient+NewIssue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GitHubClient+NewIssue.swift"; sourceTree = ""; }; + 98B5A0851F6D0FFE000617D6 /* UINavigationController+Replace.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UINavigationController+Replace.swift"; sourceTree = ""; }; 98F0A0421F27BC4B0062A2CA /* emoji.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = emoji.json; sourceTree = ""; }; A8F2E01CAFE2A7AA463A0FAA /* Pods-Freetime.testflight.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Freetime.testflight.xcconfig"; path = "Pods/Target Support Files/Pods-Freetime/Pods-Freetime.testflight.xcconfig"; sourceTree = ""; }; CB06D68438D845EC6D23788D /* Pods_FreetimeTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FreetimeTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1125,6 +1133,7 @@ 29EE1C131F3A2E440046A54D /* Labels */, 297AE8581EC0D5C100B44A1F /* Login */, 297AE85E1EC0D5C100B44A1F /* Models */, + 98B5A07E1F6C73A2000617D6 /* New Issue */, 29C9FDD91EC6613F00EE3A52 /* Notifications */, 297AE8611EC0D5C100B44A1F /* Other */, 986B872E1F2CA8E800AAB55C /* Repository */, @@ -1453,10 +1462,21 @@ children = ( 98835BD31F1A17EE005BA24F /* Bundle+Version.swift */, 98835BCD1F1965E2005BA24F /* UIDevice+Model.swift */, + 98B5A0851F6D0FFE000617D6 /* UINavigationController+Replace.swift */, ); path = Utility; sourceTree = ""; }; + 98B5A07E1F6C73A2000617D6 /* New Issue */ = { + isa = PBXGroup; + children = ( + 98B5A0811F6C73D6000617D6 /* NewIssue.storyboard */, + 98B5A0831F6C87A7000617D6 /* GitHubClient+NewIssue.swift */, + 98647DF21F758CCF00A4DE7A /* NewIssueTableViewController.swift */, + ); + path = "New Issue"; + sourceTree = ""; + }; CF4CC0BFE456879DD6DBC714 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -1582,6 +1602,7 @@ 984D9CA91F212ADF00ECEA7F /* Settings.bundle in Resources */, 297AE8831EC0D5C200B44A1F /* Main.storyboard in Resources */, 292FF8A81F2FC3E5009E63F7 /* authorizations.json in Resources */, + 98B5A0821F6C73D6000617D6 /* NewIssue.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1908,6 +1929,7 @@ 295840651EE89F28007723C6 /* IssueStatusEventModel.swift in Sources */, 292FCAF91EDFCC510026635E /* IssueCommentDetailCell.swift in Sources */, 292CD3BF1F0AF3C000D3D57B /* IssueDiffHunkPathCell.swift in Sources */, + 98B5A0861F6D0FFE000617D6 /* UINavigationController+Replace.swift in Sources */, 29F7F0611F2A83AA00F6075D /* IssueNeckLoadCell.swift in Sources */, 297403D71F1851C000ABA95A /* IssueAssigneeAvatarCell.swift in Sources */, 986B87361F2CB28C00AAB55C /* RepositorySummarySectionController.swift in Sources */, @@ -1978,6 +2000,7 @@ 290744BC1F268D8300FD9E48 /* UserAutocomplete.swift in Sources */, 292FCB161EDFCC510026635E /* IssueLabelSummaryCell.swift in Sources */, 298BA0971EC947F100B01946 /* SegmentedControlCell.swift in Sources */, + 98647DF31F758CCF00A4DE7A /* NewIssueTableViewController.swift in Sources */, 292CD3CA1F0DB36600D3D57B /* IssueReviewDetailsModel.swift in Sources */, 297406A11F0EE51E003A6BFB /* MMElement+Table.swift in Sources */, 29EB1EEF1F425E5100A200B4 /* ForegroundHandler.swift in Sources */, @@ -2013,6 +2036,7 @@ 292FCAFF1EDFCC510026635E /* IssueCommentSectionController.swift in Sources */, 986B871D1F2B8FCD00AAB55C /* SearchViewController.swift in Sources */, 297AE87A1EC0D5C200B44A1F /* Authorization.swift in Sources */, + 98B5A0841F6C87A7000617D6 /* GitHubClient+NewIssue.swift in Sources */, 298003401F51E93B00BE90F4 /* RatingCell.swift in Sources */, 297403D51F18515A00ABA95A /* IssueAssigneeSummaryCell.swift in Sources */, 297406981F0ED1E9003A6BFB /* SegmentedControlModel+Notifications.swift in Sources */, @@ -2256,7 +2280,7 @@ ); INFOPLIST_FILE = Resources/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" -Xfrontend -debug-time-function-bodies -Onone"; + OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" -Xfrontend -debug-time-function-bodies -Onone -Xfrontend -warn-long-function-bodies=200 -Xfrontend -warn-long-expression-type-checking=200"; PRODUCT_BUNDLE_IDENTIFIER = com.whoisryannystrom.freetime; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; diff --git a/Resources/Info.plist b/Resources/Info.plist index 6c467eb6..7f4378b5 100644 --- a/Resources/Info.plist +++ b/Resources/Info.plist @@ -32,7 +32,7 @@ CFBundleVersion - 1934 + 1935 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes