From eded98efd71374437527f0749d6b04355ce134d1 Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Fri, 29 Nov 2024 18:53:43 +0100 Subject: [PATCH] mark all knocks as seen implemented --- .../RoomFlowCoordinator.swift | 11 ---------- .../Sources/Other/Extensions/Result.swift | 17 ++++++++++++++ .../RoomScreen/RoomScreenViewModel.swift | 22 +++++++++++++++++-- 3 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 ElementX/Sources/Other/Extensions/Result.swift diff --git a/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift index fddb7fea16..cdaaaff415 100644 --- a/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift @@ -1651,14 +1651,3 @@ private extension RoomFlowCoordinator { case dismissKnockRequestsListScreen } } - -private extension Result { - var isFailure: Bool { - switch self { - case .success: - return false - case .failure: - return true - } - } -} diff --git a/ElementX/Sources/Other/Extensions/Result.swift b/ElementX/Sources/Other/Extensions/Result.swift new file mode 100644 index 0000000000..2c1b9eecff --- /dev/null +++ b/ElementX/Sources/Other/Extensions/Result.swift @@ -0,0 +1,17 @@ +// +// Copyright 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only +// Please see LICENSE in the repository root for full details. +// + +extension Result { + var isFailure: Bool { + switch self { + case .success: + return false + case .failure: + return true + } + } +} diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift index 3b88ad4c94..fca5b407c1 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift @@ -106,8 +106,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol case .acceptKnock(let eventID): Task { await acceptKnock(eventID: eventID) } case .dismissKnockRequests: - // TODO: API to mark knocks as seen required - break + Task { await markAllKnocksAsSeen() } case .viewKnockRequests: actionsSubject.send(.displayKnockRequests) } @@ -304,6 +303,25 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol } } + private func markAllKnocksAsSeen() async { + let requests = roomProxy.requestsToJoinPublisher.value + state.handledEventIDs.formUnion(Set(requests.map(\.eventID))) + let failedIDs = await withTaskGroup(of: (String, Result).self) { group in + for request in requests { + group.addTask { + await (request.eventID, request.markAsSeen()) + } + } + + var failedIDs = [String]() + for await result in group where result.1.isFailure { + failedIDs.append(result.0) + } + return failedIDs + } + state.handledEventIDs.subtract(failedIDs) + } + // MARK: Loading indicators private static let loadingIndicatorIdentifier = "\(RoomScreenViewModel.self)-Loading"