Add invites badges (#819)

This commit is contained in:
Alfonso Grillo
2023-04-21 13:14:27 +02:00
committed by GitHub
parent 4db6e68d79
commit 078799c1e2
25 changed files with 124 additions and 48 deletions
@@ -22,6 +22,7 @@ typealias InvitesViewModelType = StateStoreViewModel<InvitesViewState, InvitesVi
class InvitesViewModel: InvitesViewModelType, InvitesViewModelProtocol {
private var actionsSubject: PassthroughSubject<InvitesViewModelAction, Never> = .init()
private let userSession: UserSessionProtocol
private let previouslySeenInvites: Set<String>
var actions: AnyPublisher<InvitesViewModelAction, Never> {
actionsSubject.eraseToAnyPublisher()
@@ -29,6 +30,7 @@ class InvitesViewModel: InvitesViewModelType, InvitesViewModelProtocol {
init(userSession: UserSessionProtocol) {
self.userSession = userSession
previouslySeenInvites = ServiceLocator.shared.settings.seenInvites
super.init(initialViewState: InvitesViewState(), imageProvider: userSession.mediaProvider)
setupSubscriptions()
}
@@ -65,7 +67,8 @@ class InvitesViewModel: InvitesViewModelType, InvitesViewModelProtocol {
.sink { [weak self] roomSummaries in
guard let self else { return }
let invites = roomSummaries.invites
let invites = self.buildInvites(from: roomSummaries)
ServiceLocator.shared.settings.seenInvites = Set(invites.map(\.roomDetails.id))
self.state.invites = invites
for invite in invites {
@@ -75,6 +78,15 @@ class InvitesViewModel: InvitesViewModelType, InvitesViewModelProtocol {
.store(in: &cancellables)
}
private func buildInvites(from summaries: [RoomSummary]) -> [InvitesRoomDetails] {
summaries.compactMap { summary in
guard case .filled(let details) = summary else {
return nil
}
return InvitesRoomDetails(roomDetails: details, isUnread: !previouslySeenInvites.contains(details.id))
}
}
private func fetchInviter(for roomID: String) {
Task {
guard let room: RoomProxyProtocol = await self.clientProxy.roomForIdentifier(roomID) else {
@@ -154,14 +166,3 @@ class InvitesViewModel: InvitesViewModelType, InvitesViewModelProtocol {
message: L10n.errorUnknown)
}
}
private extension Array where Element == RoomSummary {
var invites: [InvitesRoomDetails] {
compactMap { summary in
guard case .filled(let details) = summary else {
return nil
}
return .init(roomDetails: details)
}
}
}