Files
letro-ios/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift
Stefan Ceriu b474c9efe3 Refactor the JoinRoom screen to take advantage of newer APIs and support more joinRule/membership combinations (i.e. invite required, restricted, banned) (#3685)
- expose the full RoomPreview and RoomMembershipDetails through their own proxies
- implement standard mocks for all the different combinations
- converge on a single room info provider
- rebuild all the previews
- prioritise the preview data over the room one.
2025-01-20 19:07:11 +02:00

84 lines
1.7 KiB
Swift

//
// Copyright 2022-2024 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
// Please see LICENSE files in the repository root for full details.
//
import Foundation
enum JoinRoomScreenViewModelAction {
case joined
case dismiss
}
enum JoinRoomScreenMode: Equatable {
case loading
case unknown
case joinable
case restricted
case inviteRequired
case invited
case knockable
case knocked
case banned(sender: String?, reason: String?)
}
struct JoinRoomScreenRoomDetails {
let name: String?
let topic: String?
let canonicalAlias: String?
let avatar: RoomAvatar
let memberCount: UInt
let inviter: RoomInviterDetails?
}
struct JoinRoomScreenViewState: BindableState {
let roomID: String
var roomDetails: JoinRoomScreenRoomDetails?
var mode: JoinRoomScreenMode = .loading
var bindings = JoinRoomScreenViewStateBindings()
var title: String {
roomDetails?.name ?? L10n.screenJoinRoomTitleNoPreview
}
var subtitle: String? {
switch mode {
case .loading:
nil
case .unknown:
L10n.screenJoinRoomSubtitleNoPreview
case .knocked:
nil
default:
roomDetails?.canonicalAlias
}
}
var avatar: RoomAvatar {
roomDetails?.avatar ?? .room(id: roomID, name: title, avatarURL: nil)
}
}
struct JoinRoomScreenViewStateBindings {
var alertInfo: AlertInfo<JoinRoomScreenAlertType>?
var knockMessage = ""
}
enum JoinRoomScreenAlertType {
case declineInvite
case cancelKnock
}
enum JoinRoomScreenViewAction {
case cancelKnock
case knock
case join
case acceptInvite
case declineInvite
}