mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-18 15:38:28 +02:00
111 lines
4.1 KiB
Swift
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
|
|
}
|