Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updating members after an ignore/unignore action has been performed. #1327

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -540,7 +540,10 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
}

private func presentRoomMemberDetails(member: RoomMemberProxyProtocol) {
let params = RoomMemberDetailsScreenCoordinatorParameters(roomMemberProxy: member, mediaProvider: userSession.mediaProvider)
guard let roomProxy else {
fatalError()
}
let params = RoomMemberDetailsScreenCoordinatorParameters(roomProxy: roomProxy, roomMemberProxy: member, mediaProvider: userSession.mediaProvider)
let coordinator = RoomMemberDetailsScreenCoordinator(parameters: params)

navigationStackCoordinator.push(coordinator) { [weak self] in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import SwiftUI

struct RoomMemberDetailsScreenCoordinatorParameters {
let roomProxy: RoomProxyProtocol
let roomMemberProxy: RoomMemberProxyProtocol
let mediaProvider: MediaProviderProtocol
}
Expand All @@ -32,7 +33,9 @@ final class RoomMemberDetailsScreenCoordinator: CoordinatorProtocol {
init(parameters: RoomMemberDetailsScreenCoordinatorParameters) {
self.parameters = parameters

viewModel = RoomMemberDetailsScreenViewModel(roomMemberProxy: parameters.roomMemberProxy, mediaProvider: parameters.mediaProvider)
viewModel = RoomMemberDetailsScreenViewModel(roomProxy: parameters.roomProxy,
roomMemberProxy: parameters.roomMemberProxy,
mediaProvider: parameters.mediaProvider)
}

func start() { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@ import SwiftUI
typealias RoomMemberDetailsScreenViewModelType = StateStoreViewModel<RoomMemberDetailsScreenViewState, RoomMemberDetailsScreenViewAction>

class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, RoomMemberDetailsScreenViewModelProtocol {
let roomMemberProxy: RoomMemberProxyProtocol
private let roomProxy: RoomProxyProtocol
private let roomMemberProxy: RoomMemberProxyProtocol

var callback: ((RoomMemberDetailsScreenViewModelAction) -> Void)?

init(roomMemberProxy: RoomMemberProxyProtocol, mediaProvider: MediaProviderProtocol) {
init(roomProxy: RoomProxyProtocol, roomMemberProxy: RoomMemberProxyProtocol, mediaProvider: MediaProviderProtocol) {
self.roomProxy = roomProxy
self.roomMemberProxy = roomMemberProxy
let initialViewState = RoomMemberDetailsScreenViewState(details: RoomMemberDetails(withProxy: roomMemberProxy),
bindings: .init())
Expand Down Expand Up @@ -55,6 +57,7 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro
switch result {
case .success:
state.details.isIgnored = true
updateMembers()
case .failure:
state.bindings.alertInfo = .init(id: .unknown)
}
Expand All @@ -68,8 +71,15 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro
switch result {
case .success:
state.details.isIgnored = false
updateMembers()
case .failure:
state.bindings.alertInfo = .init(id: .unknown)
}
}

private func updateMembers() {
Task.detached {
await self.roomProxy.updateMembers()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -98,19 +98,20 @@ struct RoomMemberDetailsScreen: View {
// MARK: - Previews

struct RoomMemberDetailsScreen_Previews: PreviewProvider {
static let roomProxyMock = RoomProxyMock(with: .init(displayName: ""))
static let otherUserViewModel = {
let member = RoomMemberProxyMock.mockDan
return RoomMemberDetailsScreenViewModel(roomMemberProxy: member, mediaProvider: MockMediaProvider())
return RoomMemberDetailsScreenViewModel(roomProxy: roomProxyMock, roomMemberProxy: member, mediaProvider: MockMediaProvider())
}()

static let accountOwnerViewModel = {
let member = RoomMemberProxyMock.mockMe
return RoomMemberDetailsScreenViewModel(roomMemberProxy: member, mediaProvider: MockMediaProvider())
return RoomMemberDetailsScreenViewModel(roomProxy: roomProxyMock, roomMemberProxy: member, mediaProvider: MockMediaProvider())
}()

static let ignoredUserViewModel = {
let member = RoomMemberProxyMock.mockIgnored
return RoomMemberDetailsScreenViewModel(roomMemberProxy: member, mediaProvider: MockMediaProvider())
return RoomMemberDetailsScreenViewModel(roomProxy: roomProxyMock, roomMemberProxy: member, mediaProvider: MockMediaProvider())
}()

static var previews: some View {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ final class RoomMembersListScreenCoordinator: CoordinatorProtocol {
// MARK: - Private

private func selectMember(_ member: RoomMemberProxyProtocol) {
let parameters = RoomMemberDetailsScreenCoordinatorParameters(roomMemberProxy: member, mediaProvider: parameters.mediaProvider)
let parameters = RoomMemberDetailsScreenCoordinatorParameters(roomProxy: parameters.roomProxy, roomMemberProxy: member, mediaProvider: parameters.mediaProvider)
let coordinator = RoomMemberDetailsScreenCoordinator(parameters: parameters)

navigationStackCoordinator?.push(coordinator)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe

roomProxy.membersPublisher
.filter { !$0.isEmpty }
.first()
.sink { [weak self] members in
self?.updateState(members: members)
}
Expand Down
6 changes: 3 additions & 3 deletions ElementX/Sources/UITests/UITestsAppCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -508,17 +508,17 @@ class MockScreen: Identifiable {
return navigationStackCoordinator
case .roomMemberDetailsAccountOwner:
let navigationStackCoordinator = NavigationStackCoordinator()
let coordinator = RoomMemberDetailsScreenCoordinator(parameters: .init(roomMemberProxy: RoomMemberProxyMock.mockMe, mediaProvider: MockMediaProvider()))
let coordinator = RoomMemberDetailsScreenCoordinator(parameters: .init(roomProxy: RoomProxyMock(with: .init(displayName: "")), roomMemberProxy: RoomMemberProxyMock.mockMe, mediaProvider: MockMediaProvider()))
navigationStackCoordinator.setRootCoordinator(coordinator)
return navigationStackCoordinator
case .roomMemberDetails:
let navigationStackCoordinator = NavigationStackCoordinator()
let coordinator = RoomMemberDetailsScreenCoordinator(parameters: .init(roomMemberProxy: RoomMemberProxyMock.mockAlice, mediaProvider: MockMediaProvider()))
let coordinator = RoomMemberDetailsScreenCoordinator(parameters: .init(roomProxy: RoomProxyMock(with: .init(displayName: "")), roomMemberProxy: RoomMemberProxyMock.mockAlice, mediaProvider: MockMediaProvider()))
navigationStackCoordinator.setRootCoordinator(coordinator)
return navigationStackCoordinator
case .roomMemberDetailsIgnoredUser:
let navigationStackCoordinator = NavigationStackCoordinator()
let coordinator = RoomMemberDetailsScreenCoordinator(parameters: .init(roomMemberProxy: RoomMemberProxyMock.mockIgnored, mediaProvider: MockMediaProvider()))
let coordinator = RoomMemberDetailsScreenCoordinator(parameters: .init(roomProxy: RoomProxyMock(with: .init(displayName: "")), roomMemberProxy: RoomMemberProxyMock.mockIgnored, mediaProvider: MockMediaProvider()))
navigationStackCoordinator.setRootCoordinator(coordinator)
return navigationStackCoordinator
case .invitesWithBadges:
Expand Down
42 changes: 35 additions & 7 deletions UnitTests/Sources/RoomMemberDetailsViewModelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,19 @@ import XCTest
@MainActor
class RoomMemberDetailsViewModelTests: XCTestCase {
var viewModel: RoomMemberDetailsScreenViewModelProtocol!
var roomProxyMock: RoomProxyMock!
var roomMemberProxyMock: RoomMemberProxyMock!
var context: RoomMemberDetailsScreenViewModelType.Context { viewModel.context }

override func setUp() async throws {
roomProxyMock = RoomProxyMock(with: .init(displayName: ""))
}

func testInitialState() async {
roomMemberProxyMock = RoomMemberProxyMock.mockAlice
viewModel = RoomMemberDetailsScreenViewModel(roomMemberProxy: roomMemberProxyMock, mediaProvider: MockMediaProvider())
viewModel = RoomMemberDetailsScreenViewModel(roomProxy: roomProxyMock,
roomMemberProxy: roomMemberProxyMock,
mediaProvider: MockMediaProvider())

XCTAssertEqual(context.viewState.details, RoomMemberDetails(withProxy: roomMemberProxyMock))
XCTAssertNil(context.ignoreUserAlert)
Expand All @@ -39,7 +46,9 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
try? await Task.sleep(for: .milliseconds(100))
return .success(())
}
viewModel = RoomMemberDetailsScreenViewModel(roomMemberProxy: roomMemberProxyMock, mediaProvider: MockMediaProvider())
viewModel = RoomMemberDetailsScreenViewModel(roomProxy: roomProxyMock,
roomMemberProxy: roomMemberProxyMock,
mediaProvider: MockMediaProvider())

context.send(viewAction: .showIgnoreAlert)
XCTAssertEqual(context.ignoreUserAlert, .init(action: .ignore))
Expand All @@ -53,6 +62,8 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
XCTAssertEqual(states, [false, true, false])
XCTAssertFalse(context.viewState.isProcessingIgnoreRequest)
XCTAssertTrue(context.viewState.details.isIgnored)
try await Task.sleep(for: .microseconds(100))
XCTAssertTrue(roomProxyMock.updateMembersCalled)
}

func testIgnoreFailure() async throws {
Expand All @@ -61,7 +72,9 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
try? await Task.sleep(for: .milliseconds(100))
return .failure(.ignoreUserFailed)
}
viewModel = RoomMemberDetailsScreenViewModel(roomMemberProxy: roomMemberProxyMock, mediaProvider: MockMediaProvider())
viewModel = RoomMemberDetailsScreenViewModel(roomProxy: roomProxyMock,
roomMemberProxy: roomMemberProxyMock,
mediaProvider: MockMediaProvider())
context.send(viewAction: .showIgnoreAlert)
XCTAssertEqual(context.ignoreUserAlert, .init(action: .ignore))

Expand All @@ -74,6 +87,8 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
XCTAssertEqual(states, [false, true, false])
XCTAssertNotNil(context.alertInfo)
XCTAssertFalse(context.viewState.details.isIgnored)
try await Task.sleep(for: .microseconds(100))
XCTAssertFalse(roomProxyMock.updateMembersCalled)
}

func testUnignoreSuccess() async throws {
Expand All @@ -82,7 +97,9 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
try? await Task.sleep(for: .milliseconds(100))
return .success(())
}
viewModel = RoomMemberDetailsScreenViewModel(roomMemberProxy: roomMemberProxyMock, mediaProvider: MockMediaProvider())
viewModel = RoomMemberDetailsScreenViewModel(roomProxy: roomProxyMock,
roomMemberProxy: roomMemberProxyMock,
mediaProvider: MockMediaProvider())

context.send(viewAction: .showUnignoreAlert)
XCTAssertEqual(context.ignoreUserAlert, .init(action: .unignore))
Expand All @@ -95,15 +112,20 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
let states = try await deferred.fulfill()
XCTAssertEqual(states, [false, true, false])
XCTAssertFalse(context.viewState.details.isIgnored)
try await Task.sleep(for: .microseconds(100))
XCTAssertTrue(roomProxyMock.updateMembersCalled)
}

func testUnignoreFailure() async throws {
roomProxyMock = RoomProxyMock(with: .init(displayName: ""))
roomMemberProxyMock = RoomMemberProxyMock.mockIgnored
roomMemberProxyMock.unignoreUserClosure = {
try? await Task.sleep(for: .milliseconds(100))
return .failure(.unignoreUserFailed)
}
viewModel = RoomMemberDetailsScreenViewModel(roomMemberProxy: roomMemberProxyMock, mediaProvider: MockMediaProvider())
viewModel = RoomMemberDetailsScreenViewModel(roomProxy: roomProxyMock,
roomMemberProxy: roomMemberProxyMock,
mediaProvider: MockMediaProvider())

context.send(viewAction: .showUnignoreAlert)
XCTAssertEqual(context.ignoreUserAlert, .init(action: .unignore))
Expand All @@ -117,11 +139,15 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
XCTAssertEqual(states, [false, true, false])
XCTAssertTrue(context.viewState.details.isIgnored)
XCTAssertNotNil(context.alertInfo)
try await Task.sleep(for: .microseconds(100))
XCTAssertFalse(roomProxyMock.updateMembersCalled)
}

func testInitialStateAccountOwner() async {
roomMemberProxyMock = RoomMemberProxyMock.mockMe
viewModel = RoomMemberDetailsScreenViewModel(roomMemberProxy: roomMemberProxyMock, mediaProvider: MockMediaProvider())
viewModel = RoomMemberDetailsScreenViewModel(roomProxy: roomProxyMock,
roomMemberProxy: roomMemberProxyMock,
mediaProvider: MockMediaProvider())

XCTAssertEqual(context.viewState.details, RoomMemberDetails(withProxy: roomMemberProxyMock))
XCTAssertNil(context.ignoreUserAlert)
Expand All @@ -130,7 +156,9 @@ class RoomMemberDetailsViewModelTests: XCTestCase {

func testInitialStateIgnoredUser() async {
roomMemberProxyMock = RoomMemberProxyMock.mockIgnored
viewModel = RoomMemberDetailsScreenViewModel(roomMemberProxy: roomMemberProxyMock, mediaProvider: MockMediaProvider())
viewModel = RoomMemberDetailsScreenViewModel(roomProxy: roomProxyMock,
roomMemberProxy: roomMemberProxyMock,
mediaProvider: MockMediaProvider())

XCTAssertEqual(context.viewState.details, RoomMemberDetails(withProxy: roomMemberProxyMock))
XCTAssertNil(context.ignoreUserAlert)
Expand Down
1 change: 1 addition & 0 deletions changelog.d/910.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix for UI not retaining blocked/unlocked user state after dismissing and re-entering the details from the room member list.