Fix Poll appearance / layout / issues (IOS-201)
This commit is contained in:
parent
86d30887b6
commit
a4db8a2b90
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue