diff --git a/Classes/Notifications/NotificationViewModel+Filter.swift b/Classes/Notifications/NotificationViewModel+Filter.swift deleted file mode 100644 index f265bbb2..00000000 --- a/Classes/Notifications/NotificationViewModel+Filter.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// NotificationViewModel+Filter.swift -// Freetime -// -// Created by Weyert de Boer on 08/10/2017. -// Copyright © 2017 Ryan Nystrom. All rights reserved. -// - -import IGListKit - -func filterNotifications(_ items: [NotificationViewModel], _ query: String) -> [ListDiffable] { - guard !query.isEmpty else { return items as [ListDiffable] } - - let searchText = query.lowercased() - - let filteredItems: [NotificationViewModel] = items.filter { item in - - if query.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil { - switch item.identifier { - case .number(let id): - let ticketId = String(id) - return ticketId.contains(searchText) - default: break - } - } - - let title = item.title.attributedText.string.lowercased() - if title.contains(searchText) { return true } - - let owner = item.owner.lowercased() - if owner.contains(searchText) { return true } - - let repo = item.repo.lowercased() - if repo.contains(searchText) { return true } - return false - } - - return filteredItems -} diff --git a/Classes/Notifications/NotificationsViewController.swift b/Classes/Notifications/NotificationsViewController.swift index 50f8ffc0..0069062c 100644 --- a/Classes/Notifications/NotificationsViewController.swift +++ b/Classes/Notifications/NotificationsViewController.swift @@ -183,7 +183,7 @@ TabNavRootViewControllerType { func objects(for listAdapter: ListAdapter) -> [ListDiffable] { let relevantModels = selection.unreadSelected ? dataSource.unreadNotifications : dataSource.allNotifications - let viewModels = filterNotifications(relevantModels, self.searchQuery) + let viewModels = filtered(array: relevantModels, query: searchQuery) if hasError && viewModels.count == 0 { return [] diff --git a/Classes/Utility/Filterable.swift b/Classes/Utility/Filterable.swift new file mode 100644 index 00000000..97415b74 --- /dev/null +++ b/Classes/Utility/Filterable.swift @@ -0,0 +1,25 @@ +// +// Filterable.swift +// Freetime +// +// Created by Ryan Nystrom on 10/14/17. +// Copyright © 2017 Ryan Nystrom. All rights reserved. +// + +import Foundation + +// Add to models to filter them with search query strings +protocol Filterable { + func match(query: String) -> Bool +} + +func filtered(array: [T], query: String) -> [T] { + return array.filter({ (o) -> Bool in + if let o = o as? Filterable { + return o.match(query: query) + } else { + // if object isn't Filterable, always include it + return true + } + }) +} diff --git a/Classes/View Controllers/BaseListViewController.swift b/Classes/View Controllers/BaseListViewController.swift index 68bbd7f5..ff7e6e55 100644 --- a/Classes/View Controllers/BaseListViewController.swift +++ b/Classes/View Controllers/BaseListViewController.swift @@ -19,11 +19,6 @@ protocol BaseListViewControllerDataSource: class { func emptySectionController(listAdapter: ListAdapter) -> ListSectionController } -// Add to models to filter them with search query strings -protocol Filterable { - func match(query: String) -> Bool -} - /** Subclassable view controller with basic list features: - Composed list data with head and body contents @@ -146,15 +141,8 @@ LoadMoreSectionControllerDelegate { } // if a query string exists, return matching Filterable objects - if let query = filterQuery, !query.isEmpty { - return allObjects.filter({ (object) -> Bool in - if let object = object as? Filterable { - return object.match(query: query) - } else { - // if object isn't Filterable, always include it - return true - } - }) + if let query = filterQuery { + return filtered(array: allObjects, query: query) } else { return allObjects } diff --git a/Freetime.xcodeproj/project.pbxproj b/Freetime.xcodeproj/project.pbxproj index 08aa3c07..fe6b84ca 100644 --- a/Freetime.xcodeproj/project.pbxproj +++ b/Freetime.xcodeproj/project.pbxproj @@ -264,6 +264,7 @@ 29A476A01ED0E6C6005D0953 /* UIColor+Overlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A4769F1ED0E6C6005D0953 /* UIColor+Overlay.swift */; }; 29A5AF3F1F9266370065D529 /* NotificationViewModel+Filterable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A5AF3E1F9266370065D529 /* NotificationViewModel+Filterable.swift */; }; 29A5AF411F92677D0065D529 /* RepositoryIssueSummaryModel+Filterable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A5AF401F92677D0065D529 /* RepositoryIssueSummaryModel+Filterable.swift */; }; + 29A5AF431F926C600065D529 /* Filterable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29A5AF421F926C600065D529 /* Filterable.swift */; }; 29AC90E51F00A7C8000B80E4 /* SplitViewControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29AC90E41F00A7C8000B80E4 /* SplitViewControllerDelegate.swift */; }; 29AF1E821F8AAB2B0008A0EF /* EditCommentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29AF1E811F8AAB2B0008A0EF /* EditCommentViewController.swift */; }; 29AF1E841F8AAB4A0008A0EF /* UITextView+GitHawk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29AF1E831F8AAB4A0008A0EF /* UITextView+GitHawk.swift */; }; @@ -339,7 +340,6 @@ 7B4B31A61F92257400480CE9 /* SearchQueryTokenizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B7BBA3D1F8B752A00D6AEDA /* SearchQueryTokenizer.swift */; }; 7BBFEE591F8A8A0400C68E47 /* SearchBarCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BBFEE561F8A8A0400C68E47 /* SearchBarCell.swift */; }; 7BBFEE5B1F8A8A0400C68E47 /* SearchBarSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BBFEE581F8A8A0400C68E47 /* SearchBarSectionController.swift */; }; - 7BF841301F8A919E004B9CDC /* NotificationViewModel+Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BF8412F1F8A919E004B9CDC /* NotificationViewModel+Filter.swift */; }; 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 */; }; @@ -606,6 +606,7 @@ 29A476B11ED24D99005D0953 /* IssueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IssueTests.swift; sourceTree = ""; }; 29A5AF3E1F9266370065D529 /* NotificationViewModel+Filterable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationViewModel+Filterable.swift"; sourceTree = ""; }; 29A5AF401F92677D0065D529 /* RepositoryIssueSummaryModel+Filterable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RepositoryIssueSummaryModel+Filterable.swift"; sourceTree = ""; }; + 29A5AF421F926C600065D529 /* Filterable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Filterable.swift; sourceTree = ""; }; 29AC90E41F00A7C8000B80E4 /* SplitViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitViewControllerDelegate.swift; sourceTree = ""; }; 29AF1E811F8AAB2B0008A0EF /* EditCommentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditCommentViewController.swift; sourceTree = ""; }; 29AF1E831F8AAB4A0008A0EF /* UITextView+GitHawk.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextView+GitHawk.swift"; sourceTree = ""; }; @@ -683,7 +684,6 @@ 7B7BBA3D1F8B752A00D6AEDA /* SearchQueryTokenizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchQueryTokenizer.swift; sourceTree = ""; }; 7BBFEE561F8A8A0400C68E47 /* SearchBarCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchBarCell.swift; sourceTree = ""; }; 7BBFEE581F8A8A0400C68E47 /* SearchBarSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchBarSectionController.swift; sourceTree = ""; }; - 7BF8412F1F8A919E004B9CDC /* NotificationViewModel+Filter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationViewModel+Filter.swift"; sourceTree = ""; }; 94840B8CCA6EA8A3EA37FA91 /* Pods-Freetime.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Freetime.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Freetime/Pods-Freetime.debug.xcconfig"; 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 = ""; }; @@ -1412,7 +1412,6 @@ 29A1950B1EC7901400C3E289 /* NotificationType.swift */, 29A195091EC78B4800C3E289 /* NotificationType+Icon.swift */, 29C9FDDC1EC6628200EE3A52 /* NotificationViewModel.swift */, - 7BF8412F1F8A919E004B9CDC /* NotificationViewModel+Filter.swift */, 29A5AF3E1F9266370065D529 /* NotificationViewModel+Filterable.swift */, 297406971F0ED1E9003A6BFB /* SegmentedControlModel+Notifications.swift */, ); @@ -1514,13 +1513,14 @@ 98835BCC1F1965C5005BA24F /* Utility */ = { isa = PBXGroup; children = ( + 75A0ACF41F79A82D0062D99A /* AlertAction.swift */, + 75468F791F7AFBC800F2BC19 /* AlertActionBuilder.swift */, 98835BD31F1A17EE005BA24F /* Bundle+Version.swift */, + 29A5AF421F926C600065D529 /* Filterable.swift */, + 7B7BBA3D1F8B752A00D6AEDA /* SearchQueryTokenizer.swift */, + 754488B01F7ADF8D0032D08C /* UIAlertController+Action.swift */, 98835BCD1F1965E2005BA24F /* UIDevice+Model.swift */, 98B5A0851F6D0FFE000617D6 /* UINavigationController+Replace.swift */, - 754488B01F7ADF8D0032D08C /* UIAlertController+Action.swift */, - 75468F791F7AFBC800F2BC19 /* AlertActionBuilder.swift */, - 75A0ACF41F79A82D0062D99A /* AlertAction.swift */, - 7B7BBA3D1F8B752A00D6AEDA /* SearchQueryTokenizer.swift */, ); path = Utility; sourceTree = ""; @@ -1899,7 +1899,6 @@ 297AE87E1EC0D5C200B44A1F /* AppDelegate.swift in Sources */, 299E86431EFD8D8200E5FE70 /* AttributedStringView.swift in Sources */, 297AE87A1EC0D5C200B44A1F /* Authorization.swift in Sources */, - 7BF841301F8A919E004B9CDC /* NotificationViewModel+Filter.swift in Sources */, 290744B41F250A6800FD9E48 /* AutocompleteCell.swift in Sources */, 290744B81F250A7200FD9E48 /* AutocompleteType.swift in Sources */, 291929671F3FF9C50012067B /* BadgeNotifications.swift in Sources */, @@ -1975,6 +1974,7 @@ 2974069F1F0EDED3003A6BFB /* IssueCommentTableCollectionCell.swift in Sources */, 2974069B1F0EDC7C003A6BFB /* IssueCommentTableModel.swift in Sources */, 292FCB0A1EDFCC510026635E /* IssueCommentTextCell.swift in Sources */, + 29A5AF431F926C600065D529 /* Filterable.swift in Sources */, 293B58551EF80908001D067D /* IssueCommentUnsupportedCell.swift in Sources */, 293B58531EF808DA001D067D /* IssueCommentUnsupportedModel.swift in Sources */, 293A45A41F2995CE00DD1006 /* IssueCommitCell.swift in Sources */, diff --git a/Resources/Info.plist b/Resources/Info.plist index ff0faff1..ffec4cf0 100644 --- a/Resources/Info.plist +++ b/Resources/Info.plist @@ -32,7 +32,7 @@ CFBundleVersion - 2023 + 2024 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes