feat(album): add pull-to-refresh to album entry
This commit is contained in:
@@ -36,6 +36,7 @@ final class TravelAlbumEntryViewController: BaseViewController {
|
||||
private let heroCard = TravelAlbumHeroCard()
|
||||
private let titleLabel = UILabel()
|
||||
private let tableView = UITableView(frame: .zero, style: .plain)
|
||||
private let refreshControl = UIRefreshControl()
|
||||
private let emptyView = TravelAlbumEmptyView()
|
||||
private var dataSource: UITableViewDiffableDataSource<Int, TravelAlbum>!
|
||||
private var refreshState = TravelAlbumReturnRefreshState()
|
||||
@@ -65,6 +66,8 @@ final class TravelAlbumEntryViewController: BaseViewController {
|
||||
tableView.separatorStyle = .none
|
||||
tableView.rowHeight = UITableView.automaticDimension
|
||||
tableView.estimatedRowHeight = 148
|
||||
tableView.alwaysBounceVertical = true
|
||||
tableView.refreshControl = refreshControl
|
||||
tableView.delegate = self
|
||||
tableView.register(TravelAlbumTaskCell.self, forCellReuseIdentifier: TravelAlbumTaskCell.reuseIdentifier)
|
||||
|
||||
@@ -84,6 +87,7 @@ final class TravelAlbumEntryViewController: BaseViewController {
|
||||
view.addSubview(titleLabel)
|
||||
view.addSubview(tableView)
|
||||
view.addSubview(emptyView)
|
||||
emptyView.isUserInteractionEnabled = false
|
||||
}
|
||||
|
||||
override func setupConstraints() {
|
||||
@@ -108,6 +112,7 @@ final class TravelAlbumEntryViewController: BaseViewController {
|
||||
|
||||
override func bindActions() {
|
||||
heroCard.addTarget(self, action: #selector(createTapped), for: .touchUpInside)
|
||||
refreshControl.addTarget(self, action: #selector(refreshPulled), for: .valueChanged)
|
||||
viewModel.onStateChange = { [weak self] in
|
||||
Task { @MainActor in self?.applyViewModel() }
|
||||
}
|
||||
@@ -138,8 +143,8 @@ final class TravelAlbumEntryViewController: BaseViewController {
|
||||
heroCard.isLoading = viewModel.isCreating
|
||||
titleLabel.text = "我的任务(\(viewModel.albumTotal))"
|
||||
titleLabel.isHidden = viewModel.albums.isEmpty
|
||||
tableView.isHidden = viewModel.albums.isEmpty
|
||||
emptyView.isHidden = !viewModel.albums.isEmpty || viewModel.isLoading
|
||||
emptyView.isHidden = !viewModel.albums.isEmpty
|
||||
|| (viewModel.isLoading && !refreshControl.isRefreshing)
|
||||
var snapshot = NSDiffableDataSourceSnapshot<Int, TravelAlbum>()
|
||||
snapshot.appendSections([0])
|
||||
snapshot.appendItems(viewModel.albums)
|
||||
@@ -147,13 +152,23 @@ final class TravelAlbumEntryViewController: BaseViewController {
|
||||
snapshot,
|
||||
animatingDifferences: !refreshState.suppressesSnapshotAnimations
|
||||
)
|
||||
if viewModel.isLoading && viewModel.albums.isEmpty {
|
||||
if viewModel.isLoading && viewModel.albums.isEmpty && !refreshControl.isRefreshing {
|
||||
showLoading()
|
||||
} else {
|
||||
hideLoading()
|
||||
}
|
||||
}
|
||||
|
||||
@objc private func refreshPulled() {
|
||||
Task {
|
||||
await viewModel.refreshAlbums(api: api)
|
||||
await MainActor.run {
|
||||
self.refreshControl.endRefreshing()
|
||||
self.applyViewModel()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@objc private func createTapped() {
|
||||
Task {
|
||||
await viewModel.openCreateSheet(api: api)
|
||||
|
||||
Reference in New Issue
Block a user