diff --git a/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift b/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift index 780cc932c..411377019 100644 --- a/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift +++ b/Mastodon/Scene/Onboarding/Login/MastodonLoginViewController.swift @@ -63,11 +63,11 @@ class MastodonLoginViewController: UIViewController { let dataSource = UITableViewDiffableDataSource(tableView: contentView.tableView) { [weak self] tableView, indexPath, itemIdentifier in guard let cell = tableView.dequeueReusableCell(withIdentifier: MastodonLoginServerTableViewCell.reuseIdentifier, for: indexPath) as? MastodonLoginServerTableViewCell, - let self = self else { + let self = self else { fatalError("Wrong cell") } - let server = self.viewModel.serverList[indexPath.row] + let server = self.viewModel.filteredServers[indexPath.row] var configuration = cell.defaultContentConfiguration() configuration.text = server.domain @@ -83,7 +83,7 @@ class MastodonLoginViewController: UIViewController { cell.backgroundColor = .systemBackground } - if self.viewModel.serverList.last == server { + if self.viewModel.filteredServers.last == server { cell.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner] cell.layer.cornerRadius = 10 cell.layer.masksToBounds = true @@ -166,9 +166,7 @@ class MastodonLoginViewController: UIViewController { } @objc func textfieldDidChange(_ textField: UITextField) { - print(textField.text ?? "---") - //TODO: @zeitschlag filter server-list, update tableview - + viewModel.filterServers(withText: textField.text) contentView.navigationActionView.nextButton.isEnabled = false } } @@ -179,7 +177,7 @@ extension MastodonLoginViewController: OnboardingViewControllerAppearance { } //MARK: - UITableViewDelegate extension MastodonLoginViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - let server = viewModel.serverList[indexPath.row] + let server = viewModel.filteredServers[indexPath.row] viewModel.selectedServer = server contentView.searchTextField.text = server.domain @@ -195,12 +193,12 @@ extension MastodonLoginViewController: MastodonLoginViewModelDelegate { var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([MastodonLoginViewSection.servers]) - snapshot.appendItems(viewModel.serverList) + snapshot.appendItems(viewModel.filteredServers) dataSource?.applySnapshot(snapshot, animated: false) OperationQueue.main.addOperation { - let numberOfResults = viewModel.serverList.count + let numberOfResults = viewModel.filteredServers.count self.contentView.updateCorners(numberOfResults: numberOfResults) } } diff --git a/Mastodon/Scene/Onboarding/Login/MastodonLoginViewModel.swift b/Mastodon/Scene/Onboarding/Login/MastodonLoginViewModel.swift index 68810dded..061e26c6b 100644 --- a/Mastodon/Scene/Onboarding/Login/MastodonLoginViewModel.swift +++ b/Mastodon/Scene/Onboarding/Login/MastodonLoginViewModel.swift @@ -16,8 +16,9 @@ protocol MastodonLoginViewModelDelegate: AnyObject { class MastodonLoginViewModel { - var serverList: [Mastodon.Entity.Server] = [] + private var serverList: [Mastodon.Entity.Server] = [] var selectedServer: Mastodon.Entity.Server? + var filteredServers: [Mastodon.Entity.Server] = [] weak var appContext: AppContext? weak var delegate: MastodonLoginViewModelDelegate? @@ -42,4 +43,17 @@ class MastodonLoginViewModel { self.serverList = servers }).store(in: &disposeBag) } + + func filterServers(withText query: String?) { + guard let query else { + filteredServers = serverList + delegate?.serversUpdated(self) + return + } + + filteredServers = serverList.filter { $0.domain.contains(query) }.sorted {$0.totalUsers > $1.totalUsers } + delegate?.serversUpdated(self) + +// AuthenticationViewModel.parseDomain(from: query) + } }