diff --git a/Mastodon/Scene/Account/AccountListViewModel.swift b/Mastodon/Scene/Account/AccountListViewModel.swift index 09d3d53d..a70209ee 100644 --- a/Mastodon/Scene/Account/AccountListViewModel.swift +++ b/Mastodon/Scene/Account/AccountListViewModel.swift @@ -21,7 +21,8 @@ final class AccountListViewModel { // output let authentications = CurrentValueSubject<[Item], Never>([]) - let activeUserID = CurrentValueSubject(nil) + let activeMastodonUserObjectID = CurrentValueSubject(nil) + let dataSourceDidUpdate = PassthroughSubject() var diffableDataSource: UITableViewDiffableDataSource! init(context: AppContext) { @@ -34,16 +35,16 @@ final class AccountListViewModel { .sink { [weak self] authentications, activeAuthentication in guard let self = self else { return } var items: [Item] = [] - var activeUserID: Mastodon.Entity.Account.ID? + var activeMastodonUserObjectID: NSManagedObjectID? for authentication in authentications { let item = Item.authentication(objectID: authentication.objectID) items.append(item) if authentication === activeAuthentication { - activeUserID = authentication.userID + activeMastodonUserObjectID = authentication.user.objectID } } self.authentications.value = items - self.activeUserID.value = activeUserID + self.activeMastodonUserObjectID.value = activeMastodonUserObjectID } .store(in: &disposeBag) @@ -58,7 +59,9 @@ final class AccountListViewModel { snapshot.appendItems(authentications, toSection: .main) snapshot.appendItems([.addAccount], toSection: .main) - diffableDataSource.apply(snapshot) + diffableDataSource.apply(snapshot) { + self.dataSourceDidUpdate.send() + } } .store(in: &disposeBag) } @@ -88,7 +91,7 @@ extension AccountListViewModel { AccountListViewModel.configure( cell: cell, user: user, - activeUserID: self.activeUserID.eraseToAnyPublisher() + activeMastodonUserObjectID: self.activeMastodonUserObjectID.eraseToAnyPublisher() ) return cell case .addAccount: @@ -105,7 +108,7 @@ extension AccountListViewModel { static func configure( cell: AccountListTableViewCell, user: MastodonUser, - activeUserID: AnyPublisher + activeMastodonUserObjectID: AnyPublisher ) { // avatar cell.configure(with: AvatarConfigurableViewConfiguration(avatarImageURL: user.avatarImageURL())) @@ -125,10 +128,10 @@ extension AccountListViewModel { cell.usernameLabel.configure(content: usernameMetaContent) // checkmark - activeUserID + activeMastodonUserObjectID .receive(on: DispatchQueue.main) - .sink { userID in - let isCurrentUser = user.id == userID + .sink { objectID in + let isCurrentUser = user.objectID == objectID cell.tintColor = .label cell.accessoryType = isCurrentUser ? .checkmark : .none } diff --git a/Mastodon/Scene/Account/AccountViewController.swift b/Mastodon/Scene/Account/AccountViewController.swift index 3e913da4..a7a0992e 100644 --- a/Mastodon/Scene/Account/AccountViewController.swift +++ b/Mastodon/Scene/Account/AccountViewController.swift @@ -38,8 +38,8 @@ final class AccountListViewController: UIViewController, NeedsDependency { tableView.register(AccountListTableViewCell.self, forCellReuseIdentifier: String(describing: AccountListTableViewCell.self)) tableView.register(AddAccountTableViewCell.self, forCellReuseIdentifier: String(describing: AddAccountTableViewCell.self)) tableView.backgroundColor = .clear - tableView.tableFooterView = UIView() tableView.separatorStyle = .none + tableView.tableFooterView = UIView() return tableView }() @@ -97,6 +97,14 @@ extension AccountListViewController { managedObjectContext: context.managedObjectContext ) + viewModel.dataSourceDidUpdate + .receive(on: DispatchQueue.main) + .sink { [weak self] in + guard let self = self else { return } + self.panModalSetNeedsLayoutUpdate() + } + .store(in: &disposeBag) + if UIAccessibility.isVoiceOverRunning { let dragIndicatorTapGestureRecognizer = UITapGestureRecognizer.singleTapGestureRecognizer dragIndicatorView.addGestureRecognizer(dragIndicatorTapGestureRecognizer)