mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 01:20:12 +00:00
Knock Requests navigation flows (#3555)
* implemented navigations * better naming for the enum * removed list to banned users navigation * polished the code * avatarURL
This commit is contained in:
+1
-6
@@ -32,12 +32,7 @@ final class KnockRequestsListScreenCoordinator: CoordinatorProtocol {
|
||||
mediaProvider: parameters.mediaProvider)
|
||||
}
|
||||
|
||||
func start() {
|
||||
viewModel.actionsPublisher.sink { [weak self] action in
|
||||
MXLog.info("Coordinator: received view model action: \(action)")
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
}
|
||||
func start() { }
|
||||
|
||||
func toPresentable() -> AnyView {
|
||||
AnyView(KnockRequestsListScreen(context: viewModel.context))
|
||||
|
||||
+14
-1
@@ -10,7 +10,8 @@ import Foundation
|
||||
enum KnockRequestsListScreenViewModelAction { }
|
||||
|
||||
struct KnockRequestsListScreenViewState: BindableState {
|
||||
var requests: [KnockRequestCellInfo] = []
|
||||
// TODO: Not sure yet how we will fetch this, this is just for testing purposes
|
||||
var requests: [KnockRequestCellInfo] = [.init(id: "@alice:matrix.org", displayName: "Alice", avatarURL: nil, timestamp: "Now", reason: "Hello")]
|
||||
// If you are in this view one of these must have been true so by default we assume all of them to be true
|
||||
var canAccept = true
|
||||
var canDecline = true
|
||||
@@ -22,6 +23,18 @@ struct KnockRequestsListScreenViewState: BindableState {
|
||||
var shouldDisplayRequests: Bool {
|
||||
!requests.isEmpty && isKnockableRoom && (canAccept || canDecline || canBan)
|
||||
}
|
||||
|
||||
var bindings = KnockRequestsListStateBindings()
|
||||
}
|
||||
|
||||
struct KnockRequestsListStateBindings {
|
||||
var alertInfo: AlertInfo<KnockRequestsListAlertType>?
|
||||
}
|
||||
|
||||
enum KnockRequestsListAlertType {
|
||||
case acceptAllRequests
|
||||
case declineRequest
|
||||
case declineAndBan
|
||||
}
|
||||
|
||||
enum KnockRequestsListScreenViewAction {
|
||||
|
||||
+24
-3
@@ -35,13 +35,34 @@ class KnockRequestsListScreenViewModel: KnockRequestsListScreenViewModelType, Kn
|
||||
override func process(viewAction: KnockRequestsListScreenViewAction) {
|
||||
switch viewAction {
|
||||
case .acceptAllRequests:
|
||||
break
|
||||
state.bindings.alertInfo = .init(id: .acceptAllRequests,
|
||||
title: L10n.screenKnockRequestsListAcceptAllAlertTitle,
|
||||
message: L10n.screenKnockRequestsListAcceptAllAlertDescription,
|
||||
primaryButton: .init(title: L10n.screenKnockRequestsListAcceptAllAlertConfirmButtonTitle,
|
||||
// TODO: Implement action
|
||||
action: nil),
|
||||
secondaryButton: .init(title: L10n.actionCancel, role: .cancel, action: nil))
|
||||
case .acceptRequest(let userID):
|
||||
// TODO: Implement
|
||||
break
|
||||
case .declineRequest(let userID):
|
||||
break
|
||||
state.bindings.alertInfo = .init(id: .declineRequest,
|
||||
title: L10n.screenKnockRequestsListDeclineAlertTitle,
|
||||
message: L10n.screenKnockRequestsListDeclineAlertDescription(userID),
|
||||
primaryButton: .init(title: L10n.screenKnockRequestsListDeclineAlertConfirmButtonTitle,
|
||||
role: .destructive,
|
||||
// TODO: Implement action
|
||||
action: nil),
|
||||
secondaryButton: .init(title: L10n.actionCancel, role: .cancel, action: nil))
|
||||
case .ban(let userID):
|
||||
break
|
||||
state.bindings.alertInfo = .init(id: .declineAndBan,
|
||||
title: L10n.screenKnockRequestsListBanAlertTitle,
|
||||
message: L10n.screenKnockRequestsListBanAlertDescription(userID),
|
||||
// TODO: Implement action
|
||||
primaryButton: .init(title: L10n.screenKnockRequestsListBanAlertConfirmButtonTitle,
|
||||
role: .destructive,
|
||||
action: nil),
|
||||
secondaryButton: .init(title: L10n.actionCancel, role: .cancel, action: nil))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ struct KnockRequestCellInfo: Identifiable {
|
||||
/// user identifier of the usee that sent the request
|
||||
let id: String
|
||||
let displayName: String?
|
||||
let avatarUrl: URL?
|
||||
let avatarURL: URL?
|
||||
let timestamp: String?
|
||||
let reason: String?
|
||||
}
|
||||
@@ -33,7 +33,7 @@ struct KnockRequestCell: View {
|
||||
|
||||
var body: some View {
|
||||
HStack(alignment: .top, spacing: 16) {
|
||||
LoadableAvatarImage(url: cellInfo.avatarUrl,
|
||||
LoadableAvatarImage(url: cellInfo.avatarURL,
|
||||
name: cellInfo.displayName,
|
||||
contentID: cellInfo.id,
|
||||
avatarSize: .user(on: .knockingUserList),
|
||||
@@ -168,13 +168,13 @@ private struct DisclosableText: View {
|
||||
|
||||
struct KnockRequestCell_Previews: PreviewProvider, TestablePreview {
|
||||
// swiftlint:disable:next line_length
|
||||
static let aliceWithLongReason = KnockRequestCellInfo(id: "@alice:matrix.org", displayName: "Alice", avatarUrl: nil, timestamp: "20 Nov 2024", reason: "Hello would like to join this room, also this is a very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long reason")
|
||||
static let aliceWithLongReason = KnockRequestCellInfo(id: "@alice:matrix.org", displayName: "Alice", avatarURL: nil, timestamp: "20 Nov 2024", reason: "Hello would like to join this room, also this is a very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long reason")
|
||||
|
||||
static let aliceWithShortReason = KnockRequestCellInfo(id: "@alice:matrix.org", displayName: "Alice", avatarUrl: nil, timestamp: "20 Nov 2024", reason: "Hello, I am Alice and would like to join this room, please")
|
||||
static let aliceWithShortReason = KnockRequestCellInfo(id: "@alice:matrix.org", displayName: "Alice", avatarURL: nil, timestamp: "20 Nov 2024", reason: "Hello, I am Alice and would like to join this room, please")
|
||||
|
||||
static let aliceWithNoReason = KnockRequestCellInfo(id: "@alice:matrix.org", displayName: "Alice", avatarUrl: nil, timestamp: "20 Nov 2024", reason: nil)
|
||||
static let aliceWithNoReason = KnockRequestCellInfo(id: "@alice:matrix.org", displayName: "Alice", avatarURL: nil, timestamp: "20 Nov 2024", reason: nil)
|
||||
|
||||
static let aliceWithNoName = KnockRequestCellInfo(id: "@alice:matrix.org", displayName: nil, avatarUrl: nil, timestamp: "20 Nov 2024", reason: nil)
|
||||
static let aliceWithNoName = KnockRequestCellInfo(id: "@alice:matrix.org", displayName: nil, avatarURL: nil, timestamp: "20 Nov 2024", reason: nil)
|
||||
|
||||
static var previews: some View {
|
||||
KnockRequestCell(cellInfo: aliceWithLongReason, onAccept: { _ in }, onDecline: { _ in }, onDeclineAndBan: { _ in })
|
||||
|
||||
@@ -26,6 +26,7 @@ struct KnockRequestsListScreen: View {
|
||||
acceptAllButton
|
||||
}
|
||||
}
|
||||
.alert(item: $context.alertInfo)
|
||||
}
|
||||
|
||||
@ViewBuilder
|
||||
@@ -75,13 +76,13 @@ struct KnockRequestsListScreen: View {
|
||||
// MARK: - Previews
|
||||
|
||||
struct KnockRequestsListScreen_Previews: PreviewProvider, TestablePreview {
|
||||
static let emptyViewModel = KnockRequestsListScreenViewModel.mockWithInitialState(.init())
|
||||
static let emptyViewModel = KnockRequestsListScreenViewModel.mockWithInitialState(.init(requests: []))
|
||||
|
||||
static let viewModel = KnockRequestsListScreenViewModel.mockWithInitialState(.init(requests: [.init(id: "@alice:matrix.org", displayName: "Alice", avatarUrl: nil, timestamp: "Now", reason: "Hello"),
|
||||
static let viewModel = KnockRequestsListScreenViewModel.mockWithInitialState(.init(requests: [.init(id: "@alice:matrix.org", displayName: "Alice", avatarURL: nil, timestamp: "Now", reason: "Hello"),
|
||||
// swiftlint:disable:next line_length
|
||||
.init(id: "@bob:matrix.org", displayName: "Bob", avatarUrl: nil, timestamp: "Now", reason: "Hello this one is a very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long reason"),
|
||||
.init(id: "@charlie:matrix.org", displayName: "Charlie", avatarUrl: nil, timestamp: "Now", reason: nil),
|
||||
.init(id: "@dan:matrix.org", displayName: "Dan", avatarUrl: nil, timestamp: "Now", reason: "Hello! It's a me! Dan!")]))
|
||||
.init(id: "@bob:matrix.org", displayName: "Bob", avatarURL: nil, timestamp: "Now", reason: "Hello this one is a very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long reason"),
|
||||
.init(id: "@charlie:matrix.org", displayName: "Charlie", avatarURL: nil, timestamp: "Now", reason: nil),
|
||||
.init(id: "@dan:matrix.org", displayName: "Dan", avatarURL: nil, timestamp: "Now", reason: "Hello! It's a me! Dan!")]))
|
||||
|
||||
static var previews: some View {
|
||||
NavigationStack {
|
||||
|
||||
Reference in New Issue
Block a user