Files
bundesmessenger-ios/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/SpaceSelectorModels.swift
Gil Eluard 1a2e6fdb89 Implement new space selector bottom sheet (#6518)
* Delight: Edit layout experiment #6079
2022-08-05 13:39:45 +02:00

111 lines
4.1 KiB
Swift

//
// Copyright 2021 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import Foundation
// MARK: - Coordinator
enum SpaceSelectorCoordinatorResult {
/// Cancel button has been presed
case cancel
/// Home Space (aka "All Chats") has been selected -> the app should switch to the home space
case homeSelected
/// A space has been selected -> the app should switch to this space
case spaceSelected(_ item: SpaceSelectorListItemData)
/// The disclosure button of a space has been pressed -> the parent coordinator should navigate to its sub-spaces
case spaceDisclosure(_ item: SpaceSelectorListItemData)
/// The create space button has been pressed
case createSpace(_ parentSpaceId: String?)
}
// MARK: View model
enum SpaceSelectorConstants {
/// Arbitrary ID for the home space (aka "All Chats")
static let homeSpaceId = "SpaceSelectorListItemDataHomeSpaceId"
}
/// This structure contains all the data to display the information about a space
struct SpaceSelectorListItemData {
/// Id of the space (`SpaceSelectorConstants.homeSpaceId` for the home space)
let id: String
/// avatar data of the space: set this property to `nil` if you want to display a space with a hardcoded icon
let avatar: AvatarInput?
/// hardcoded icon: only used if the avatar is not set
let icon: UIImage?
/// Displayname of the space
let displayName: String?
/// total number of notifications for this space
let notificationCount: UInt
/// total number of highlights for this space
let highlightedNotificationCount: UInt
/// Indicates if the space has sub spaces (condition the display of the disclosure button)
let hasSubItems: Bool
init(id: String,
avatar: AvatarInput? = nil,
icon: UIImage? = nil,
displayName: String?,
notificationCount: UInt = 0,
highlightedNotificationCount: UInt = 0,
hasSubItems: Bool = false) {
self.id = id
self.avatar = avatar
self.icon = icon
self.displayName = displayName
self.notificationCount = notificationCount
self.highlightedNotificationCount = highlightedNotificationCount
self.hasSubItems = hasSubItems
}
}
extension SpaceSelectorListItemData: Identifiable, Equatable {}
enum SpaceSelectorViewModelResult {
/// Cancel button has been presed
case cancel
/// Home Space (aka "All Chats") has been selected -> the app should switch to the home space
case homeSelected
/// A space has been selected -> the app should switch to this space
case spaceSelected(_ item: SpaceSelectorListItemData)
/// The disclosure button of a space has been pressed -> the parent coordinator should navigate to its sub-spaces
case spaceDisclosure(_ item: SpaceSelectorListItemData)
/// The create space button has been pressed
case createSpace
}
// MARK: View
struct SpaceSelectorViewState: BindableState {
/// List of items that represents the list of sub space of the current space
var items: [SpaceSelectorListItemData]
/// Id of the currently selected space if there is a current space in the app
var selectedSpaceId: String?
/// String to be displayed as title for the navigation bar
var navigationTitle: String
}
enum SpaceSelectorViewAction {
/// Cancel button has been presed
case cancel
/// A space has been selected
case spaceSelected(_ item: SpaceSelectorListItemData)
/// The disclosure button of a space has been pressed
case spaceDisclosure(_ item: SpaceSelectorListItemData)
/// The create space button has been pressed
case createSpace
}