parent
98983ac8e6
commit
549342c702
|
@ -33,6 +33,7 @@ class ConversationSearchViewController: UITableViewController {
|
|||
tableView.rowHeight = UITableViewAutomaticDimension
|
||||
tableView.estimatedRowHeight = 60
|
||||
|
||||
tableView.register(EmptySearchResultCell.self, forCellReuseIdentifier: EmptySearchResultCell.reuseIdentifier)
|
||||
tableView.register(ConversationSearchResultCell.self, forCellReuseIdentifier: ConversationSearchResultCell.reuseIdentifier)
|
||||
tableView.register(MessageSearchResultCell.self, forCellReuseIdentifier: MessageSearchResultCell.reuseIdentifier)
|
||||
tableView.register(ContactSearchResultCell.self, forCellReuseIdentifier: ContactSearchResultCell.reuseIdentifier)
|
||||
|
@ -92,8 +93,7 @@ class ConversationSearchViewController: UITableViewController {
|
|||
|
||||
switch searchSection {
|
||||
case .noResults:
|
||||
// We don't display a "no results" cell, we simply display no results.
|
||||
return 0
|
||||
return searchResultSet.isEmpty ? 1 : 0
|
||||
case .conversations:
|
||||
return searchResultSet.conversations.count
|
||||
case .contacts:
|
||||
|
@ -111,23 +111,39 @@ class ConversationSearchViewController: UITableViewController {
|
|||
|
||||
switch searchSection {
|
||||
case .noResults:
|
||||
return UITableViewCell()
|
||||
guard let cell = tableView.dequeueReusableCell(withIdentifier: EmptySearchResultCell.reuseIdentifier) as? EmptySearchResultCell else {
|
||||
owsFail("cell was unexpectedly nil")
|
||||
return UITableViewCell()
|
||||
}
|
||||
|
||||
guard indexPath.row == 0 else {
|
||||
owsFail("searchResult was unexpected index")
|
||||
return UITableViewCell()
|
||||
}
|
||||
|
||||
let searchText = self.searchResultSet.searchText
|
||||
cell.configure(searchText: searchText)
|
||||
return cell
|
||||
case .conversations:
|
||||
guard let cell = tableView.dequeueReusableCell(withIdentifier: ConversationSearchResultCell.reuseIdentifier) as? ConversationSearchResultCell else {
|
||||
owsFail("cell was unexpectedly nil")
|
||||
return UITableViewCell()
|
||||
}
|
||||
|
||||
guard let searchResult = self.searchResultSet.conversations[safe: indexPath.row] else {
|
||||
owsFail("searchResult was unexpectedly nil")
|
||||
return UITableViewCell()
|
||||
}
|
||||
cell.configure(searchResult: searchResult)
|
||||
return cell
|
||||
case .contacts:
|
||||
guard let cell = tableView.dequeueReusableCell(withIdentifier: ContactSearchResultCell.reuseIdentifier) as? ContactSearchResultCell else {
|
||||
owsFail("cell was unexpectedly nil")
|
||||
return UITableViewCell()
|
||||
}
|
||||
|
||||
guard let searchResult = self.searchResultSet.contacts[safe: indexPath.row] else {
|
||||
owsFail("searchResult was unexpectedly nil")
|
||||
return UITableViewCell()
|
||||
}
|
||||
|
||||
|
@ -135,10 +151,12 @@ class ConversationSearchViewController: UITableViewController {
|
|||
return cell
|
||||
case .messages:
|
||||
guard let cell = tableView.dequeueReusableCell(withIdentifier: MessageSearchResultCell.reuseIdentifier) as? MessageSearchResultCell else {
|
||||
owsFail("cell was unexpectedly nil")
|
||||
return UITableViewCell()
|
||||
}
|
||||
|
||||
guard let searchResult = self.searchResultSet.messages[safe: indexPath.row] else {
|
||||
owsFail("searchResult was unexpectedly nil")
|
||||
return UITableViewCell()
|
||||
}
|
||||
|
||||
|
@ -148,7 +166,7 @@ class ConversationSearchViewController: UITableViewController {
|
|||
}
|
||||
|
||||
override func numberOfSections(in tableView: UITableView) -> Int {
|
||||
return 3
|
||||
return 4
|
||||
}
|
||||
|
||||
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
|
||||
|
@ -349,3 +367,42 @@ class ContactSearchResultCell: UITableViewCell {
|
|||
self.snippetLabel.text = searchResult.recipientId
|
||||
}
|
||||
}
|
||||
|
||||
class EmptySearchResultCell: UITableViewCell {
|
||||
static let reuseIdentifier = "EmptySearchResultCell"
|
||||
|
||||
let messageLabel: UILabel
|
||||
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
|
||||
self.messageLabel = UILabel()
|
||||
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
||||
|
||||
messageLabel.font = UIFont.ows_dynamicTypeBody
|
||||
messageLabel.textAlignment = .center
|
||||
messageLabel.numberOfLines = 3
|
||||
|
||||
contentView.addSubview(messageLabel)
|
||||
|
||||
messageLabel.autoSetDimension(.height, toSize: 150)
|
||||
|
||||
messageLabel.autoPinEdge(toSuperviewMargin: .top, relation: .greaterThanOrEqual)
|
||||
messageLabel.autoPinEdge(toSuperviewMargin: .leading, relation: .greaterThanOrEqual)
|
||||
messageLabel.autoPinEdge(toSuperviewMargin: .bottom, relation: .greaterThanOrEqual)
|
||||
messageLabel.autoPinEdge(toSuperviewMargin: .trailing, relation: .greaterThanOrEqual)
|
||||
|
||||
messageLabel.autoVCenterInSuperview()
|
||||
messageLabel.autoHCenterInSuperview()
|
||||
|
||||
messageLabel.setContentHuggingHigh()
|
||||
messageLabel.setCompressionResistanceHigh()
|
||||
}
|
||||
|
||||
required init?(coder aDecoder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
public func configure(searchText: String) {
|
||||
let format = NSLocalizedString("HOME_VIEW_SEARCH_NO_RESULTS_FORMAT", comment: "Format string when search returns no results. Embeds {{search term}}")
|
||||
let messageText: String = NSString(format: format as NSString, searchText) as String
|
||||
self.messageLabel.text = messageText
|
||||
}
|
||||
}
|
||||
|
|
|
@ -989,6 +989,9 @@
|
|||
/* Placeholder text for search bar which filters conversations. */
|
||||
"HOME_VIEW_CONVERSATION_SEARCHBAR_PLACEHOLDER" = "Search";
|
||||
|
||||
/* Format string when search returns no results. Embeds {{search term}} */
|
||||
"HOME_VIEW_SEARCH_NO_RESULTS_FORMAT" = "No results found for '%@'";
|
||||
|
||||
/* Title for the home view's 'archive' mode. */
|
||||
"HOME_VIEW_TITLE_ARCHIVE" = "Archive";
|
||||
|
||||
|
|
|
@ -27,18 +27,20 @@ public class ContactSearchResult {
|
|||
}
|
||||
|
||||
public class SearchResultSet {
|
||||
public let searchText: String
|
||||
public let conversations: [ConversationSearchResult]
|
||||
public let contacts: [ContactSearchResult]
|
||||
public let messages: [ConversationSearchResult]
|
||||
|
||||
public init(conversations: [ConversationSearchResult], contacts: [ContactSearchResult], messages: [ConversationSearchResult]) {
|
||||
public init(searchText: String, conversations: [ConversationSearchResult], contacts: [ContactSearchResult], messages: [ConversationSearchResult]) {
|
||||
self.searchText = searchText
|
||||
self.conversations = conversations
|
||||
self.contacts = contacts
|
||||
self.messages = messages
|
||||
}
|
||||
|
||||
public class var empty: SearchResultSet {
|
||||
return SearchResultSet(conversations: [], contacts: [], messages: [])
|
||||
return SearchResultSet(searchText: "", conversations: [], contacts: [], messages: [])
|
||||
}
|
||||
|
||||
public var isEmpty: Bool {
|
||||
|
@ -94,7 +96,7 @@ public class ConversationSearcher: NSObject {
|
|||
// Only show contacts which were not included in an existing 1:1 conversation.
|
||||
let otherContacts: [ContactSearchResult] = contacts.filter { !existingConversationRecipientIds.contains($0.recipientId) }
|
||||
|
||||
return SearchResultSet(conversations: conversations, contacts: otherContacts, messages: messages)
|
||||
return SearchResultSet(searchText: searchText, conversations: conversations, contacts: otherContacts, messages: messages)
|
||||
}
|
||||
|
||||
@objc(filterThreads:withSearchText:)
|
||||
|
|
Loading…
Reference in New Issue