notification VMs use filter method

This commit is contained in:
Ryan Nystrom
2017-10-14 12:06:36 -04:00
parent a58c26836d
commit 40dfd85e7b
6 changed files with 37 additions and 63 deletions

View File

@@ -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
}

View File

@@ -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 []

View File

@@ -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<T>(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
}
})
}

View File

@@ -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
}

View File

@@ -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 = "<group>"; };
29A5AF3E1F9266370065D529 /* NotificationViewModel+Filterable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationViewModel+Filterable.swift"; sourceTree = "<group>"; };
29A5AF401F92677D0065D529 /* RepositoryIssueSummaryModel+Filterable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RepositoryIssueSummaryModel+Filterable.swift"; sourceTree = "<group>"; };
29A5AF421F926C600065D529 /* Filterable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Filterable.swift; sourceTree = "<group>"; };
29AC90E41F00A7C8000B80E4 /* SplitViewControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitViewControllerDelegate.swift; sourceTree = "<group>"; };
29AF1E811F8AAB2B0008A0EF /* EditCommentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditCommentViewController.swift; sourceTree = "<group>"; };
29AF1E831F8AAB4A0008A0EF /* UITextView+GitHawk.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextView+GitHawk.swift"; sourceTree = "<group>"; };
@@ -683,7 +684,6 @@
7B7BBA3D1F8B752A00D6AEDA /* SearchQueryTokenizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchQueryTokenizer.swift; sourceTree = "<group>"; };
7BBFEE561F8A8A0400C68E47 /* SearchBarCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchBarCell.swift; sourceTree = "<group>"; };
7BBFEE581F8A8A0400C68E47 /* SearchBarSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchBarSectionController.swift; sourceTree = "<group>"; };
7BF8412F1F8A919E004B9CDC /* NotificationViewModel+Filter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationViewModel+Filter.swift"; sourceTree = "<group>"; };
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 = "<group>"; };
98647DF21F758CCF00A4DE7A /* NewIssueTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewIssueTableViewController.swift; sourceTree = "<group>"; };
986B87181F2B875800AAB55C /* GithubClient+Search.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GithubClient+Search.swift"; sourceTree = "<group>"; };
@@ -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 = "<group>";
@@ -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 */,

View File

@@ -32,7 +32,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>2023</string>
<string>2024</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSApplicationQueriesSchemes</key>