Fix Poll appearance / layout / issues (IOS-201)

This commit is contained in:
Marcus Kida 2023-12-05 11:52:47 +01:00
parent 86d30887b6
commit a4db8a2b90
No known key found for this signature in database
GPG Key ID: 19FF64E08013CA40
1 changed files with 58 additions and 58 deletions

View File

@ -361,69 +361,69 @@ extension StatusView {
} }
private func configurePoll(status: MastodonStatus) { private func configurePoll(status: MastodonStatus) {
Task { let status = status.reblog ?? status
let status = status.reblog ?? status
guard let predicate = Poll.predicate(domain: viewModel.authContext?.mastodonAuthenticationBox.domain ?? "", id: status.entity.poll?.id ?? "")
let context = viewModel.context?.managedObjectContext,
let poll = await status.getPoll(in: context, domain: viewModel.authContext?.mastodonAuthenticationBox.domain ?? "")
else { return }
viewModel.managedObjects.insert(poll)
// pollItems guard
let options = poll.options.sorted(by: { $0.index < $1.index }) let context = viewModel.context?.managedObjectContext,
let items: [PollItem] = options.map { .option(record: .init(objectID: $0.objectID)) } let poll = Poll.findOrFetch(in: context, matching: predicate)
self.viewModel.pollItems = items else { return }
// isVoteButtonEnabled
poll.publisher(for: \.updatedAt) viewModel.managedObjects.insert(poll)
.sink { [weak self] _ in
guard let self = self else { return } // pollItems
let options = poll.options let options = poll.options.sorted(by: { $0.index < $1.index })
let hasSelectedOption = options.contains(where: { $0.isSelected }) let items: [PollItem] = options.map { .option(record: .init(objectID: $0.objectID)) }
self.viewModel.isVoteButtonEnabled = hasSelectedOption self.viewModel.pollItems = items
}
.store(in: &disposeBag) // isVoteButtonEnabled
// isVotable poll.publisher(for: \.updatedAt)
Publishers.CombineLatest( .sink { [weak self] _ in
poll.publisher(for: \.votedBy), guard let self = self else { return }
poll.publisher(for: \.expired) let options = poll.options
) let hasSelectedOption = options.contains(where: { $0.isSelected })
.map { [weak viewModel] votedBy, expired in self.viewModel.isVoteButtonEnabled = hasSelectedOption
guard let viewModel = viewModel else { return false }
guard let authContext = viewModel.authContext else { return false }
let domain = authContext.mastodonAuthenticationBox.domain
let userID = authContext.mastodonAuthenticationBox.userID
let isVoted = votedBy?.contains(where: { $0.domain == domain && $0.id == userID }) ?? false
return !isVoted && !expired
} }
.assign(to: &viewModel.$isVotable) .store(in: &disposeBag)
// isVotable
// votesCount Publishers.CombineLatest(
poll.publisher(for: \.votesCount) poll.publisher(for: \.votedBy),
.map { Int($0) }
.assign(to: \.voteCount, on: viewModel)
.store(in: &disposeBag)
// voterCount
poll.publisher(for: \.votersCount)
.map { Int($0) }
.assign(to: \.voterCount, on: viewModel)
.store(in: &disposeBag)
// expireAt
poll.publisher(for: \.expiresAt)
.assign(to: \.expireAt, on: viewModel)
.store(in: &disposeBag)
// expired
poll.publisher(for: \.expired) poll.publisher(for: \.expired)
.assign(to: \.expired, on: viewModel) )
.store(in: &disposeBag) .map { [weak viewModel] votedBy, expired in
// isVoting guard let viewModel = viewModel else { return false }
poll.publisher(for: \.isVoting) guard let authContext = viewModel.authContext else { return false }
.assign(to: \.isVoting, on: viewModel) let domain = authContext.mastodonAuthenticationBox.domain
.store(in: &disposeBag) let userID = authContext.mastodonAuthenticationBox.userID
let isVoted = votedBy?.contains(where: { $0.domain == domain && $0.id == userID }) ?? false
return !isVoted && !expired
} }
.assign(to: &viewModel.$isVotable)
// votesCount
poll.publisher(for: \.votesCount)
.map { Int($0) }
.assign(to: \.voteCount, on: viewModel)
.store(in: &disposeBag)
// voterCount
poll.publisher(for: \.votersCount)
.map { Int($0) }
.assign(to: \.voterCount, on: viewModel)
.store(in: &disposeBag)
// expireAt
poll.publisher(for: \.expiresAt)
.assign(to: \.expireAt, on: viewModel)
.store(in: &disposeBag)
// expired
poll.publisher(for: \.expired)
.assign(to: \.expired, on: viewModel)
.store(in: &disposeBag)
// isVoting
poll.publisher(for: \.isVoting)
.assign(to: \.isVoting, on: viewModel)
.store(in: &disposeBag)
} }
private func configureCard(status: MastodonStatus) { private func configureCard(status: MastodonStatus) {