Skip to content

Commit

Permalink
A bunch of random tweaks. (#3317)
Browse files Browse the repository at this point in the history
- Fix warning on single case enum.
- Remove unused subjects.
- Fix a lint warning.
- Remove unused success value.
- Fix warning about position of try await.
- Add a note about the common tracing configuration.
- Show an indicator when resolving a send failure fails.
- Make sure the whole row is clickable in the GlobalSearchScreen.
  • Loading branch information
pixlwave committed Sep 23, 2024
1 parent d48214a commit e4736b1
Show file tree
Hide file tree
Showing 13 changed files with 48 additions and 35 deletions.
3 changes: 2 additions & 1 deletion ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1366,7 +1366,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
private func presentResolveSendFailure(failure: TimelineItemSendFailure.VerifiedUser, itemID: TimelineItemIdentifier) {
let coordinator = ResolveVerifiedUserSendFailureScreenCoordinator(parameters: .init(failure: failure,
itemID: itemID,
roomProxy: roomProxy))
roomProxy: roomProxy,
userIndicatorController: userIndicatorController))
coordinator.actionsPublisher.sink { [weak self] action in
guard let self else { return }

Expand Down
4 changes: 2 additions & 2 deletions ElementX/Sources/Other/Logging/TracingConfiguration.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ struct TracingConfiguration {
}

static let targets: OrderedDictionary<Target, LogLevel> = [
.common: .info,
.common: .info, // Never set this lower than info - 3rd-party crates may start logging user data.
.elementx: .info,
.hyper: .warn,
.matrix_sdk_ffi: .info,
Expand Down Expand Up @@ -106,7 +106,7 @@ struct TracingConfiguration {

let overrides = Self.targets.keys.reduce(into: [Target: LogLevel]()) { partialResult, target in
// Keep the defaults here
let ignoredTargets: [Target] = [.common,
let ignoredTargets: [Target] = [.common, // Never remove common from the ignored targets (see above for more info).
.hyper,
.matrix_sdk_ffi,
.matrix_sdk_oidc,
Expand Down
2 changes: 1 addition & 1 deletion ElementX/Sources/Screens/CallScreen/CallScreenModels.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ struct CallScreenViewState: BindableState {
struct Bindings {
var javaScriptMessageHandler: ((Any) -> Void)?
var javaScriptEvaluator: ((String) async throws -> Any)?
var requestPictureInPictureHandler: (() async -> Result<AVPictureInPictureController, CallScreenError>)?
var requestPictureInPictureHandler: (() async -> Result<Void, CallScreenError>)?

var alertInfo: AlertInfo<UUID>?
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ class CallScreenViewModel: CallScreenViewModelType, CallScreenViewModelProtocol
}

switch await requestPictureInPictureHandler() {
case .success(let controller):
case .success:
actionsSubject.send(.pictureInPictureStarted)
case .failure:
actionsSubject.send(.dismiss)
Expand Down
4 changes: 2 additions & 2 deletions ElementX/Sources/Screens/CallScreen/View/CallScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -200,15 +200,15 @@ private struct CallView: UIViewRepresentable {

// MARK: - Picture in Picture

func requestPictureInPicture() async -> Result<AVPictureInPictureController, CallScreenError> {
func requestPictureInPicture() async -> Result<Void, CallScreenError> {
guard let pictureInPictureController,
pictureInPictureController.isPictureInPicturePossible,
case .success(true) = await webViewCanEnterPictureInPicture() else {
return .failure(.pictureInPictureNotAvailable)
}

pictureInPictureController.startPictureInPicture()
return .success(pictureInPictureController)
return .success(())
}

func stopPictureInPicture() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ struct GlobalSearchScreen: View {
GlobalSearchScreenListRow(room: room, context: context)
.listRowBackground(backgroundColor(for: room))
.listRowInsets(.init())
.contentShape(.rect)
.onTapGesture {
context.send(viewAction: .select(roomID: room.id))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ struct ResolveVerifiedUserSendFailureScreenCoordinatorParameters {
let failure: TimelineItemSendFailure.VerifiedUser
let itemID: TimelineItemIdentifier
let roomProxy: JoinedRoomProxyProtocol
let userIndicatorController: UserIndicatorControllerProtocol
}

enum ResolveVerifiedUserSendFailureScreenCoordinatorAction {
Expand All @@ -43,7 +44,8 @@ final class ResolveVerifiedUserSendFailureScreenCoordinator: CoordinatorProtocol

viewModel = ResolveVerifiedUserSendFailureScreenViewModel(failure: parameters.failure,
itemID: parameters.itemID,
roomProxy: parameters.roomProxy)
roomProxy: parameters.roomProxy,
userIndicatorController: parameters.userIndicatorController)
}

func start() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,17 @@ class ResolveVerifiedUserSendFailureScreenViewModel: ResolveVerifiedUserSendFail
private let roomProxy: JoinedRoomProxyProtocol
private var members: [String: RoomMemberProxyProtocol]

private let userIndicatorController: UserIndicatorControllerProtocol

private let actionsSubject: PassthroughSubject<ResolveVerifiedUserSendFailureScreenViewModelAction, Never> = .init()
var actionsPublisher: AnyPublisher<ResolveVerifiedUserSendFailureScreenViewModelAction, Never> {
actionsSubject.eraseToAnyPublisher()
}

init(failure: TimelineItemSendFailure.VerifiedUser, itemID: TimelineItemIdentifier, roomProxy: JoinedRoomProxyProtocol) {
init(failure: TimelineItemSendFailure.VerifiedUser,
itemID: TimelineItemIdentifier,
roomProxy: JoinedRoomProxyProtocol,
userIndicatorController: UserIndicatorControllerProtocol) {
iterator = switch failure {
case .hasUnsignedDevice(let devices): UnsignedDeviceFailureIterator(devices: devices)
case .changedIdentity(let users): ChangedIdentityFailureIterator(users: users)
Expand All @@ -40,6 +45,7 @@ class ResolveVerifiedUserSendFailureScreenViewModel: ResolveVerifiedUserSendFail
self.failure = failure
self.itemID = itemID
self.roomProxy = roomProxy
self.userIndicatorController = userIndicatorController

members = Dictionary(uniqueKeysWithValues: roomProxy.membersPublisher.value.map { ($0.userID, $0) })

Expand Down Expand Up @@ -77,7 +83,8 @@ class ResolveVerifiedUserSendFailureScreenViewModel: ResolveVerifiedUserSendFail
}

if case let .failure(error) = result {
#warning("Show the error?")
MXLog.error("Failed to resolve send failure: \(error)")
showFailureIndicator()
return
}

Expand All @@ -94,10 +101,20 @@ class ResolveVerifiedUserSendFailureScreenViewModel: ResolveVerifiedUserSendFail
switch await roomProxy.resend(itemID: itemID) {
case .success:
actionsSubject.send(.dismiss)
case .failure(let failure):
#warning("Show the error?")
case .failure(let error):
MXLog.error("Failed to resend message: \(error)")
showFailureIndicator()
}
}

private static let failureIndicatorIdentifier = "\(ResolveVerifiedUserSendFailureScreenViewModel.self)-Failure"

private func showFailureIndicator() {
ServiceLocator.shared.userIndicatorController.submitIndicator(UserIndicator(id: Self.failureIndicatorIdentifier,
type: .toast,
title: L10n.errorUnknown,
iconName: "xmark"))
}
}

// MARK: - Iterators
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,14 +95,16 @@ struct ResolveVerifiedUserSendFailureScreen_Previews: PreviewProvider, TestableP
static func makeViewModel(failure: TimelineItemSendFailure.VerifiedUser) -> ResolveVerifiedUserSendFailureScreenViewModel {
ResolveVerifiedUserSendFailureScreenViewModel(failure: failure,
itemID: .random,
roomProxy: JoinedRoomProxyMock(.init()))
roomProxy: JoinedRoomProxyMock(.init()),
userIndicatorController: UserIndicatorControllerMock())
}
}

struct ResolveVerifiedUserSendFailureScreenSheet_Previews: PreviewProvider {
static let viewModel = ResolveVerifiedUserSendFailureScreenViewModel(failure: .changedIdentity(users: ["@alice:matrix.org"]),
itemID: .random,
roomProxy: JoinedRoomProxyMock(.init()))
roomProxy: JoinedRoomProxyMock(.init()),
userIndicatorController: UserIndicatorControllerMock())

static var previews: some View {
Text("Hello")
Expand Down
6 changes: 2 additions & 4 deletions ElementX/Sources/Screens/Timeline/TimelineViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -565,10 +565,8 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
}

private func slashCommand(message: String) -> SlashCommand? {
for command in SlashCommand.allCases {
if message.starts(with: command.rawValue) {
return command
}
for command in SlashCommand.allCases where message.starts(with: command.rawValue) {
return command
}
return nil
}
Expand Down
6 changes: 3 additions & 3 deletions ElementX/Sources/Services/Timeline/TimelineProxy.swift
Original file line number Diff line number Diff line change
Expand Up @@ -130,9 +130,9 @@ final class TimelineProxy: TimelineProxyProtocol {
subject.send(.paginating)

do {
let timelineEndReached = try await switch direction {
case .backwards: timeline.paginateBackwards(numEvents: requestSize)
case .forwards: timeline.focusedPaginateForwards(numEvents: requestSize)
let timelineEndReached = switch direction {
case .backwards: try await timeline.paginateBackwards(numEvents: requestSize)
case .forwards: try await timeline.focusedPaginateForwards(numEvents: requestSize)
}
MXLog.info("Finished paginating \(direction.rawValue)")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,10 @@ class ResolveVerifiedUserSendFailureScreenViewModelTests: XCTestCase {
// MARK: Helpers

private func makeViewModel(with failure: TimelineItemSendFailure.VerifiedUser) -> ResolveVerifiedUserSendFailureScreenViewModel {
ResolveVerifiedUserSendFailureScreenViewModel(failure: failure, itemID: .random, roomProxy: roomProxy)
ResolveVerifiedUserSendFailureScreenViewModel(failure: failure,
itemID: .random,
roomProxy: roomProxy,
userIndicatorController: UserIndicatorControllerMock())
}

private func verifyResolving(userIDs: [String], assertStrings: Bool = true) async throws {
Expand All @@ -73,7 +76,7 @@ class ResolveVerifiedUserSendFailureScreenViewModelTests: XCTestCase {
}

// When resolving the first failure.
let deferredFailure = deferFailure(viewModel.actionsPublisher, timeout: 1) { $0.isDismiss }
let deferredFailure = deferFailure(viewModel.actionsPublisher, timeout: 1) { $0 == .dismiss }
context.send(viewAction: .resolveAndResend)

// Then the sheet should remain open for the next failure.
Expand All @@ -88,7 +91,7 @@ class ResolveVerifiedUserSendFailureScreenViewModelTests: XCTestCase {
}

// When resolving the final failure.
let deferred = deferFulfillment(viewModel.actionsPublisher) { $0.isDismiss }
let deferred = deferFulfillment(viewModel.actionsPublisher) { $0 == .dismiss }
context.send(viewAction: .resolveAndResend)

// Then the sheet should be dismissed.
Expand All @@ -110,12 +113,3 @@ class ResolveVerifiedUserSendFailureScreenViewModelTests: XCTestCase {
XCTAssertTrue(context.viewState.subtitle.contains(displayName))
}
}

private extension ResolveVerifiedUserSendFailureScreenViewModelAction {
var isDismiss: Bool {
switch self {
case .dismiss: true
default: false
}
}
}
2 changes: 0 additions & 2 deletions UnitTests/Sources/RoomScreenViewModelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,6 @@ class RoomScreenViewModelTests: XCTestCase {

func testPinnedEventsBannerSelection() async throws {
ServiceLocator.shared.settings.pinningEnabled = true
let timelineSubject = PassthroughSubject<TimelineProxyProtocol, Never>()
let updateSubject = PassthroughSubject<JoinedRoomProxyAction, Never>()
let roomProxyMock = JoinedRoomProxyMock(.init())
// setup a way to inject the mock of the pinned events timeline
let pinnedTimelineMock = TimelineProxyMock()
Expand Down

0 comments on commit e4736b1

Please sign in to comment.