Basic implementation of the UI, navigation wil be implemented in the next PR
This commit is contained in:
@@ -87,6 +87,7 @@
|
||||
"action_forgot_password" = "Forgot password?";
|
||||
"action_forward" = "Forward";
|
||||
"action_go_back" = "Go back";
|
||||
"action_go_to_roles_and_permissions" = "Go to roles & permissions";
|
||||
"action_go_to_settings" = "Go to settings";
|
||||
"action_ignore" = "Ignore";
|
||||
"action_invite" = "Invite";
|
||||
@@ -174,7 +175,6 @@
|
||||
"common_advanced_settings" = "Advanced settings";
|
||||
"common_an_image" = "an image";
|
||||
"common_analytics" = "Analytics";
|
||||
"common_android_notification_sync_notifications_foreground_service_title" = "Fetching notifications...";
|
||||
"common_android_shortcuts_remove_reason_left_room" = "You left the room";
|
||||
"common_android_shortcuts_remove_reason_session_logged_out" = "You were logged out of the session";
|
||||
"common_appearance" = "Appearance";
|
||||
@@ -667,6 +667,7 @@
|
||||
"screen_space_list_details" = "%1$@ • %2$@";
|
||||
"screen_space_list_parent_space" = "%1$@ space";
|
||||
"screen_space_list_title" = "Spaces";
|
||||
"screen_space_settings_roles_and_permissions" = "Roles & permissions";
|
||||
"screen_start_chat_join_room_by_address_action" = "Join room by address";
|
||||
"screen_start_chat_join_room_by_address_invalid_address" = "Not a valid address";
|
||||
"screen_start_chat_join_room_by_address_placeholder" = "Enter...";
|
||||
@@ -1053,7 +1054,7 @@
|
||||
"screen_room_member_details_unblock_user" = "Unblock user";
|
||||
"screen_room_member_details_verify_button_subtitle" = "Use the web app to verify this user.";
|
||||
"screen_room_member_details_verify_button_title" = "Verify %1$@";
|
||||
"screen_room_member_list_banned_empty" = "There are no banned users in this room.";
|
||||
"screen_room_member_list_banned_empty" = "There are no banned users.";
|
||||
"screen_room_member_list_manage_member_remove_confirmation_kick" = "Only remove member";
|
||||
"screen_room_member_list_manage_member_unban_action" = "Unban";
|
||||
"screen_room_member_list_manage_member_unban_message" = "They will be able to join this room again if invited.";
|
||||
@@ -1359,6 +1360,8 @@
|
||||
"screen_security_and_privacy_room_address_section_header" = "Room address";
|
||||
"screen_security_and_privacy_room_history_anyone_option_title" = "Anyone";
|
||||
"screen_security_and_privacy_room_visibility_section_header" = "Room visibility";
|
||||
"screen_space_settings_leave_space" = "Leave space";
|
||||
"screen_space_settings_security_and_privacy" = "Security & privacy";
|
||||
"screen_account_provider_change" = "Change account provider";
|
||||
"screen_account_provider_signin_subtitle" = "This is where your conversations will live — just like you would use an email provider to keep your emails.";
|
||||
"screen_account_provider_signup_subtitle" = "This is where your conversations will live — just like you would use an email provider to keep your emails.";
|
||||
|
||||
@@ -87,7 +87,8 @@ final class SpaceSettingsFlowCoordinator: FlowCoordinatorProtocol {
|
||||
}
|
||||
|
||||
private func presentSpaceSettings(animated: Bool) {
|
||||
let coordinator = SpaceSettingsScreenCoordinator(parameters: .init())
|
||||
let coordinator = SpaceSettingsScreenCoordinator(parameters: .init(roomProxy: roomProxy,
|
||||
userSession: flowParameters.userSession))
|
||||
|
||||
coordinator.actionsPublisher.sink { [weak self] action in
|
||||
switch action { }
|
||||
|
||||
@@ -208,6 +208,8 @@ internal enum L10n {
|
||||
internal static var actionForward: String { return L10n.tr("Localizable", "action_forward") }
|
||||
/// Go back
|
||||
internal static var actionGoBack: String { return L10n.tr("Localizable", "action_go_back") }
|
||||
/// Go to roles & permissions
|
||||
internal static var actionGoToRolesAndPermissions: String { return L10n.tr("Localizable", "action_go_to_roles_and_permissions") }
|
||||
/// Go to settings
|
||||
internal static var actionGoToSettings: String { return L10n.tr("Localizable", "action_go_to_settings") }
|
||||
/// Ignore
|
||||
@@ -390,8 +392,6 @@ internal enum L10n {
|
||||
internal static var commonAnImage: String { return L10n.tr("Localizable", "common_an_image") }
|
||||
/// Analytics
|
||||
internal static var commonAnalytics: String { return L10n.tr("Localizable", "common_analytics") }
|
||||
/// Fetching notifications...
|
||||
internal static var commonAndroidNotificationSyncNotificationsForegroundServiceTitle: String { return L10n.tr("Localizable", "common_android_notification_sync_notifications_foreground_service_title") }
|
||||
/// You left the room
|
||||
internal static var commonAndroidShortcutsRemoveReasonLeftRoom: String { return L10n.tr("Localizable", "common_android_shortcuts_remove_reason_left_room") }
|
||||
/// You were logged out of the session
|
||||
@@ -2464,7 +2464,7 @@ internal enum L10n {
|
||||
internal static func screenRoomMemberDetailsVerifyButtonTitle(_ p1: Any) -> String {
|
||||
return L10n.tr("Localizable", "screen_room_member_details_verify_button_title", String(describing: p1))
|
||||
}
|
||||
/// There are no banned users in this room.
|
||||
/// There are no banned users.
|
||||
internal static var screenRoomMemberListBannedEmpty: String { return L10n.tr("Localizable", "screen_room_member_list_banned_empty") }
|
||||
/// Plural format key: "%#@COUNT@"
|
||||
internal static func screenRoomMemberListHeaderTitle(_ p1: Int) -> String {
|
||||
@@ -2964,6 +2964,12 @@ internal enum L10n {
|
||||
internal static var screenSpaceListTitle: String { return L10n.tr("Localizable", "screen_space_list_title") }
|
||||
/// View members
|
||||
internal static var screenSpaceMenuActionMembers: String { return L10n.tr("Localizable", "screen_space_menu_action_members") }
|
||||
/// Leave space
|
||||
internal static var screenSpaceSettingsLeaveSpace: String { return L10n.tr("Localizable", "screen_space_settings_leave_space") }
|
||||
/// Roles & permissions
|
||||
internal static var screenSpaceSettingsRolesAndPermissions: String { return L10n.tr("Localizable", "screen_space_settings_roles_and_permissions") }
|
||||
/// Security & privacy
|
||||
internal static var screenSpaceSettingsSecurityAndPrivacy: String { return L10n.tr("Localizable", "screen_space_settings_security_and_privacy") }
|
||||
/// An error occurred when trying to start a chat
|
||||
internal static var screenStartChatErrorStartingChat: String { return L10n.tr("Localizable", "screen_start_chat_error_starting_chat") }
|
||||
/// Join room by address
|
||||
|
||||
@@ -134,6 +134,7 @@ enum UserAvatarSizeOnScreen {
|
||||
enum RoomAvatarSizeOnScreen {
|
||||
case chats
|
||||
case spaces
|
||||
case spaceSettings
|
||||
case timeline
|
||||
case leaveSpace
|
||||
case messageForwarding
|
||||
@@ -148,7 +149,7 @@ enum RoomAvatarSizeOnScreen {
|
||||
|
||||
var value: CGFloat {
|
||||
switch self {
|
||||
case .chats, .spaces:
|
||||
case .chats, .spaces, .spaceSettings:
|
||||
return 52
|
||||
case .timeline, .leaveSpace:
|
||||
return 32
|
||||
|
||||
@@ -45,5 +45,6 @@ enum SpaceScreenViewAction {
|
||||
case toggleLeaveSpaceRoomDetails(id: String)
|
||||
case confirmLeaveSpace
|
||||
case spaceSettings
|
||||
case rolesAndPermissions
|
||||
case displayMembers(roomProxy: JoinedRoomProxyProtocol)
|
||||
}
|
||||
|
||||
@@ -76,19 +76,7 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
|
||||
}
|
||||
|
||||
appSettings.$spaceSettingsEnabled
|
||||
.combineLatest(roomProxy.infoPublisher)
|
||||
.sink { [weak self] isEnabled, info in
|
||||
guard let self else { return }
|
||||
guard isEnabled, let powerLevels = info.powerLevels else {
|
||||
state.isSpaceManagementEnabled = false
|
||||
return
|
||||
}
|
||||
|
||||
state.isSpaceManagementEnabled = powerLevels.canOwnUserEditRolesAndPermissions() ||
|
||||
powerLevels.canOwnUser(sendStateEvent: .roomName) ||
|
||||
powerLevels.canOwnUser(sendStateEvent: .roomTopic) ||
|
||||
powerLevels.canOwnUser(sendStateEvent: .roomAvatar)
|
||||
}
|
||||
.weakAssign(to: \.state.isSpaceManagementEnabled, on: self)
|
||||
.store(in: &cancellables)
|
||||
}
|
||||
}
|
||||
@@ -141,6 +129,8 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
|
||||
fatalError("Always available when the space settings button is tapped.")
|
||||
}
|
||||
actionsSubject.send(.displaySpaceSettings(roomProxy: roomProxy))
|
||||
case .rolesAndPermissions:
|
||||
break // Not implemented yet
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -99,9 +99,9 @@ struct LeaveSpaceView: View {
|
||||
.buttonStyle(.compound(.primary))
|
||||
} else if context.viewState.isSpaceManagementEnabled {
|
||||
Button {
|
||||
context.send(viewAction: .spaceSettings)
|
||||
context.send(viewAction: .rolesAndPermissions)
|
||||
} label: {
|
||||
Label(L10n.actionGoToSettings, icon: \.settings)
|
||||
Label(L10n.actionGoToRolesAndPermissions, icon: \.settings)
|
||||
}
|
||||
.buttonStyle(.compound(.primary))
|
||||
}
|
||||
|
||||
@@ -8,7 +8,10 @@
|
||||
import Combine
|
||||
import SwiftUI
|
||||
|
||||
struct SpaceSettingsScreenCoordinatorParameters { }
|
||||
struct SpaceSettingsScreenCoordinatorParameters {
|
||||
let roomProxy: JoinedRoomProxyProtocol
|
||||
let userSession: UserSessionProtocol
|
||||
}
|
||||
|
||||
enum SpaceSettingsScreenCoordinatorAction { }
|
||||
|
||||
@@ -26,7 +29,8 @@ final class SpaceSettingsScreenCoordinator: CoordinatorProtocol {
|
||||
init(parameters: SpaceSettingsScreenCoordinatorParameters) {
|
||||
self.parameters = parameters
|
||||
|
||||
viewModel = SpaceSettingsScreenViewModel()
|
||||
viewModel = SpaceSettingsScreenViewModel(roomProxy: parameters.roomProxy,
|
||||
userSession: parameters.userSession)
|
||||
}
|
||||
|
||||
func start() {
|
||||
|
||||
@@ -10,23 +10,18 @@ import Foundation
|
||||
enum SpaceSettingsScreenViewModelAction { }
|
||||
|
||||
struct SpaceSettingsScreenViewState: BindableState {
|
||||
var title: String
|
||||
var placeholder: String
|
||||
var counter = 0
|
||||
var details: RoomDetails
|
||||
|
||||
var bindings: SpaceSettingsScreenViewStateBindings
|
||||
}
|
||||
|
||||
struct SpaceSettingsScreenViewStateBindings {
|
||||
var composerText: String
|
||||
var joinedMembersCount: Int
|
||||
var hasMemberIdentityVerificationStateViolations = false
|
||||
|
||||
var canEditRolesOrPermissions = false
|
||||
}
|
||||
|
||||
enum SpaceSettingsScreenViewAction {
|
||||
case done
|
||||
case textChanged
|
||||
|
||||
case incrementCounter
|
||||
case decrementCounter
|
||||
|
||||
// Consider adding CustomStringConvertible conformance if the actions contain PII
|
||||
case processTapEdit
|
||||
case processTapSecurity
|
||||
case processTapPeople
|
||||
case processTapRolesAndPermissions
|
||||
case processTapLeave
|
||||
}
|
||||
|
||||
@@ -11,15 +11,25 @@ import SwiftUI
|
||||
typealias SpaceSettingsScreenViewModelType = StateStoreViewModelV2<SpaceSettingsScreenViewState, SpaceSettingsScreenViewAction>
|
||||
|
||||
class SpaceSettingsScreenViewModel: SpaceSettingsScreenViewModelType, SpaceSettingsScreenViewModelProtocol {
|
||||
private let roomProxy: JoinedRoomProxyProtocol
|
||||
private let userSession: UserSessionProtocol
|
||||
|
||||
private let actionsSubject: PassthroughSubject<SpaceSettingsScreenViewModelAction, Never> = .init()
|
||||
var actionsPublisher: AnyPublisher<SpaceSettingsScreenViewModelAction, Never> {
|
||||
actionsSubject.eraseToAnyPublisher()
|
||||
}
|
||||
|
||||
init() {
|
||||
super.init(initialViewState: SpaceSettingsScreenViewState(title: "SpaceSettings title",
|
||||
placeholder: "Enter something here",
|
||||
bindings: .init(composerText: "Initial composer text")))
|
||||
init(roomProxy: JoinedRoomProxyProtocol, userSession: UserSessionProtocol) {
|
||||
self.roomProxy = roomProxy
|
||||
self.userSession = userSession
|
||||
|
||||
super.init(initialViewState: .init(details: roomProxy.details,
|
||||
joinedMembersCount: roomProxy.infoPublisher.value.joinedMembersCount),
|
||||
mediaProvider: userSession.mediaProvider)
|
||||
|
||||
updateRoomInfo(roomProxy.infoPublisher.value)
|
||||
setupRoomSubscription()
|
||||
Task { await roomProxy.updateMembers() }
|
||||
}
|
||||
|
||||
// MARK: - Public
|
||||
@@ -28,20 +38,58 @@ class SpaceSettingsScreenViewModel: SpaceSettingsScreenViewModelType, SpaceSetti
|
||||
MXLog.info("View model: received view action: \(viewAction)")
|
||||
|
||||
switch viewAction {
|
||||
case .done:
|
||||
case .processTapEdit:
|
||||
break
|
||||
case .processTapSecurity:
|
||||
break
|
||||
case .processTapPeople:
|
||||
break
|
||||
case .processTapRolesAndPermissions:
|
||||
break
|
||||
case .processTapLeave:
|
||||
break
|
||||
case .textChanged:
|
||||
MXLog.info("View model: composer text changed to: \(state.bindings.composerText)")
|
||||
case .incrementCounter:
|
||||
Task {
|
||||
try await Task.sleep(for: .seconds(.random(in: 1.0...2.0)))
|
||||
state.counter += 1
|
||||
}
|
||||
case .decrementCounter:
|
||||
Task {
|
||||
try await Task.sleep(for: .seconds(.random(in: 1.0...2.0)))
|
||||
state.counter -= 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func updateRoomInfo(_ roomInfo: RoomInfoProxyProtocol) {
|
||||
state.joinedMembersCount = roomInfo.joinedMembersCount
|
||||
state.details = roomProxy.details
|
||||
|
||||
if let powerLevels = roomInfo.powerLevels {
|
||||
state.canEditRolesOrPermissions = powerLevels.canOwnUserEditRolesAndPermissions()
|
||||
}
|
||||
}
|
||||
|
||||
private func setupRoomSubscription() {
|
||||
roomProxy.infoPublisher
|
||||
.receive(on: DispatchQueue.main)
|
||||
.sink { [weak self] roomInfo in
|
||||
self?.updateRoomInfo(roomInfo)
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
|
||||
roomProxy.membersPublisher.combineLatest(roomProxy.identityStatusChangesPublisher)
|
||||
.sink { [weak self] _ in
|
||||
Task { await self?.updateMemberIdentityVerificationStates() }
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
}
|
||||
|
||||
private func updateMemberIdentityVerificationStates() async {
|
||||
guard roomProxy.infoPublisher.value.isEncrypted else {
|
||||
// We don't care about identity statuses on non-encrypted rooms
|
||||
return
|
||||
}
|
||||
|
||||
for member in roomProxy.membersPublisher.value {
|
||||
if case let .success(userIdentity) = await userSession.clientProxy.userIdentity(for: member.userID) {
|
||||
if userIdentity?.verificationState == .verificationViolation {
|
||||
state.hasMemberIdentityVerificationStateViolations = true
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
state.hasMemberIdentityVerificationStateViolations = false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,59 +13,112 @@ struct SpaceSettingsScreen: View {
|
||||
|
||||
var body: some View {
|
||||
Form {
|
||||
Section {
|
||||
ListRow(label: .plain(title: context.viewState.placeholder),
|
||||
kind: .textField(text: $context.composerText))
|
||||
|
||||
ListRow(label: .centeredAction(title: L10n.actionDone,
|
||||
icon: \.leave),
|
||||
kind: .button { context.send(viewAction: .done) })
|
||||
}
|
||||
|
||||
Section {
|
||||
ListRow(label: .default(title: "Counter", icon: \.chart),
|
||||
details: .counter(context.viewState.counter),
|
||||
kind: .label)
|
||||
ListRow(label: .default(title: "Increment", icon: \.plus),
|
||||
kind: .button { context.send(viewAction: .incrementCounter) })
|
||||
ListRow(label: .default(title: "Decrement", icon: \.minus),
|
||||
kind: .button { context.send(viewAction: .decrementCounter) })
|
||||
editSection
|
||||
if context.viewState.canEditRolesOrPermissions {
|
||||
securitySection
|
||||
}
|
||||
peopleSection
|
||||
leaveSpaceSection
|
||||
}
|
||||
.compoundList()
|
||||
.navigationTitle(context.viewState.title)
|
||||
.onChange(of: context.composerText) {
|
||||
context.send(viewAction: .textChanged)
|
||||
.navigationTitle(L10n.commonSettings)
|
||||
}
|
||||
|
||||
private var editSection: some View {
|
||||
Section {
|
||||
ListRow(kind: .custom {
|
||||
Button {
|
||||
context.send(viewAction: .processTapEdit)
|
||||
} label: {
|
||||
editSectionContent
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private var editSectionContent: some View {
|
||||
HStack(spacing: 12) {
|
||||
RoomAvatarImage(avatar: context.viewState.details.avatar,
|
||||
avatarSize: .room(on: .spaceSettings),
|
||||
mediaProvider: context.mediaProvider)
|
||||
.accessibilityHidden(true)
|
||||
|
||||
VStack(alignment: .leading, spacing: 2) {
|
||||
Text(context.viewState.details.name ?? context.viewState.details.id)
|
||||
.lineLimit(1)
|
||||
.font(.compound.headingMD)
|
||||
.foregroundStyle(.compound.textPrimary)
|
||||
if let alias = context.viewState.details.canonicalAlias {
|
||||
Text(alias)
|
||||
.lineLimit(1)
|
||||
.font(.compound.bodySM)
|
||||
.foregroundStyle(.compound.textSecondary)
|
||||
}
|
||||
}
|
||||
|
||||
Spacer()
|
||||
|
||||
ListRowAccessory.navigationLink
|
||||
}
|
||||
.padding(.horizontal, ListRowPadding.horizontal)
|
||||
.padding(.vertical, 16)
|
||||
}
|
||||
|
||||
private var securitySection: some View {
|
||||
Section {
|
||||
ListRow(label: .default(title: L10n.screenSpaceSettingsSecurityAndPrivacy, icon: \.lock),
|
||||
kind: .navigationLink {
|
||||
context.send(viewAction: .processTapSecurity)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private var peopleSection: some View {
|
||||
Section {
|
||||
if context.viewState.hasMemberIdentityVerificationStateViolations {
|
||||
ListRow(label: .default(title: L10n.commonPeople, icon: \.user),
|
||||
details: .icon(CompoundIcon(\.infoSolid).foregroundStyle(.compound.iconCriticalPrimary)),
|
||||
kind: .navigationLink {
|
||||
context.send(viewAction: .processTapPeople)
|
||||
})
|
||||
} else {
|
||||
ListRow(label: .default(title: L10n.commonPeople, icon: \.user),
|
||||
details: .title(String(context.viewState.joinedMembersCount)),
|
||||
kind: .navigationLink {
|
||||
context.send(viewAction: .processTapPeople)
|
||||
})
|
||||
}
|
||||
|
||||
if context.viewState.canEditRolesOrPermissions {
|
||||
ListRow(label: .default(title: L10n.screenSpaceSettingsRolesAndPermissions, icon: \.admin),
|
||||
kind: .navigationLink {
|
||||
context.send(viewAction: .processTapRolesAndPermissions)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var leaveSpaceSection: some View {
|
||||
ListRow(label: .action(title: L10n.screenSpaceSettingsLeaveSpace,
|
||||
icon: \.leave,
|
||||
role: .destructive),
|
||||
kind: .button { context.send(viewAction: .processTapLeave) })
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Previews
|
||||
|
||||
struct SpaceSettingsScreen_Previews: PreviewProvider, TestablePreview {
|
||||
static let viewModel = makeViewModel()
|
||||
static let incrementedViewModel = makeViewModel(counterValue: 1)
|
||||
static let viewModel = SpaceSettingsScreenViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "Space",
|
||||
avatarURL: .mockMXCAvatar,
|
||||
isSpace: true,
|
||||
canonicalAlias: "#space:matrix.org",
|
||||
members: .allMembersAsCreator)),
|
||||
userSession: UserSessionMock(.init()))
|
||||
|
||||
static var previews: some View {
|
||||
NavigationStack {
|
||||
SpaceSettingsScreen(context: viewModel.context)
|
||||
}
|
||||
.previewDisplayName("Initial")
|
||||
|
||||
NavigationStack {
|
||||
SpaceSettingsScreen(context: incrementedViewModel.context)
|
||||
}
|
||||
.previewDisplayName("Incremented")
|
||||
.snapshotPreferences(expect: incrementedViewModel.context.observe(\.viewState.counter).map { $0 == 1 }.eraseToStream())
|
||||
}
|
||||
|
||||
static func makeViewModel(counterValue: Int = 0) -> SpaceSettingsScreenViewModel {
|
||||
let viewModel = SpaceSettingsScreenViewModel()
|
||||
|
||||
for _ in 0..<counterValue {
|
||||
viewModel.context.send(viewAction: .incrementCounter)
|
||||
}
|
||||
|
||||
return viewModel
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f98998b99bef84d6cbb7ceeae91e92cf7f2fdb27bf5d3b30fca868950bb60565
|
||||
size 109315
|
||||
oid sha256:6fc900a55aea1573a2d544b88aff8ecbb890a3ec6d61af00d081374f35907368
|
||||
size 108132
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4607ce87cdd6ac4ec9bb182d7fd8e3885b85b9ec5dbe7785d818904d95e28d04
|
||||
size 112831
|
||||
oid sha256:b104bd91c956e166d92b98e95d3abd82d6403dae85f31019c1ec3d4a17070257
|
||||
size 111815
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e781e17b906822518f9fe3510b26191f01cc25d4c23eeca0b4821c6e914c7114
|
||||
size 62953
|
||||
oid sha256:2a49cf8fb6c4684125678d52bee5a04bef44d5db5b5f41e3626043b808ee5990
|
||||
size 61196
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4838942bbe538200c6b8b9595bc5d566a3534dd4f3b7f31bfa136589b77492e0
|
||||
size 67355
|
||||
oid sha256:8106c194e4f97f9ed6972c11aea4f78e5a948e9e461646e4dd20e3aca175013a
|
||||
size 65510
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8d442913fd704dfe8d5cbf38d3fe737b82e21c4e817e2b38d28991e43f10cb0d
|
||||
size 84689
|
||||
oid sha256:f9bdeaa4425619052c7e7eab2b5f4405ad4c5047ed57cba13f31f1a2f1f2436d
|
||||
size 83436
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8d38766231c7052937a68e44097333fb996659ada007e34f5e338883244f644d
|
||||
size 91923
|
||||
oid sha256:5783f775c815f033ff536338e9acce538abc6f903b8e0677997ead6612f09e98
|
||||
size 92114
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e47612a83be0ee99e3cb3b94b73b62541dbf4cdc9b4c0b4e034cb909b6f9e9c7
|
||||
size 42264
|
||||
oid sha256:f57ed7cafac354d0309851aa21a3885032549ab5447d78f1c469e18353856399
|
||||
size 41120
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:938d1dabb2bd7c8f740279bba64efbd7a32754f0b5bdc760951921ef20e955a0
|
||||
size 52406
|
||||
oid sha256:392df165828af183afb78f994d1d9cca5de5c434d190ce242452b1dd79e2a307
|
||||
size 52573
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8b9ba940cc6db7a70910a056aa60cd23de26e73e76f31537a4ea67d8083d0f71
|
||||
size 148240
|
||||
oid sha256:d8e8b9718e40cecfcc94ebb04d2c1e41fc80c9ca00189d3c20200e99dd5f3a79
|
||||
size 147670
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:192b625e111007d795b18744d44b3d71395138f1d61cc5524eaac9f1c5372cd6
|
||||
size 158776
|
||||
oid sha256:06afe8ae860805c6c5b96ef8f3dec4a282b81efc1792d9fa346d6c330132a85b
|
||||
size 158881
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:15e1c89bc62d8bd57d787a03d46a6b7d06767a954e30dd8f3601099ece788b5e
|
||||
size 95729
|
||||
oid sha256:f0738dc64c667fc44298ab817c2eadbc46dd6969941b6a4cdef75bb9ec35399d
|
||||
size 95115
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:bf154a9a79aae4c2bc38dcecbf44a2651e8517ed2de38ce69a897f93bbccf1dc
|
||||
size 106209
|
||||
oid sha256:d768e7fe7686374632a0448b8d71e9394fc86186b700eb505140470779ea2782
|
||||
size 105486
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:9bde7637592fa5b227a681a5f33d803f46ee9fdb03b2a8af3c772896a87fd705
|
||||
size 151804
|
||||
oid sha256:b7f1f3a735682ef5d36cbfe87fecfe0233ded73a14ab02eebc336a8b1792099a
|
||||
size 151862
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:cde4392fb266610e8b476bc65d5673cffb17297934a5f7d23312b28a66ddf0d3
|
||||
size 161807
|
||||
oid sha256:0ff46c798eaac998442ccf3179442425a41f790cb7c5a3cb9aa98dec5553ca3d
|
||||
size 161568
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4d58447c31aaee11dd86427d69069718fad7b8ab33b7d7c89d07f3b0d954d170
|
||||
size 99220
|
||||
oid sha256:c1840368e7afd7efe36ddceb78003bba9ead25bd2c7b408f7af778cd3a146ccb
|
||||
size 99336
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:264175e1a572c47b2ad5d0225a3fd848ae65a9b31e85216aa3544275f2b79d9d
|
||||
size 110450
|
||||
oid sha256:9a0a9f0b949250ca39c3b1698f28c32bc5dcb9cc184f55ee13b285b837234c02
|
||||
size 110635
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4e7f2fe3f057bc630ad50dc1aa6de82762ffac3086e5d24043d18c451d3fe696
|
||||
size 141184
|
||||
oid sha256:cf4d509b9a4e3628c86c9362ab9acbf145520785774b136b7f55aa21e0d8d5ec
|
||||
size 141288
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0f6af855e9ef505885b66959faab69014e0ba2700b3230c0742db97f286850d6
|
||||
size 150583
|
||||
oid sha256:ccdc87a92e6c749b1de8a496f48f87c78b34fc99fec918afadd1d2323cdc6d8c
|
||||
size 150793
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c93e32754d4d6cf7e00ed2cfd1f1ae76010e997e2b105d374f367ce9de38b4b0
|
||||
size 90308
|
||||
oid sha256:1e09aa40dccea285ce9285cae8e27ca074af7928ec78f2b4f29906a6c5a02761
|
||||
size 89977
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:393e9b0ae3606186d3aac7081cb23e698a73e30827ee30e1647db27aae8b73ac
|
||||
size 100040
|
||||
oid sha256:21cdb1184fccb5c74647d45a12ccbf46efa6e87775b364f286c7fd7dde3b73fe
|
||||
size 99479
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f7f551c5f3920224828c2f91320595d6e7736e2c6735b23f6726290c73e4a921
|
||||
size 143030
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:41c373364152a77d3e33986a52cfd0da121c66a6683612f3085c254c7569eba4
|
||||
size 151563
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:03883005f3c0ffa6b2c2c30d1199dd8e8e09c12c589e7745707d4cd34d110ea3
|
||||
size 95660
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6f625d9ac4ee5fafde6e81ad4ea58f4b6f483b0c8664ce812c36ae8c99f08df0
|
||||
size 107710
|
||||
@@ -231,6 +231,7 @@ class SpaceScreenViewModelTests: XCTestCase {
|
||||
spaceServiceProxy: spaceServiceProxy,
|
||||
selectedSpaceRoomPublisher: .init(nil),
|
||||
userSession: UserSessionMock(.init(clientProxy: clientProxy)),
|
||||
appSettings: AppSettings(),
|
||||
userIndicatorController: UserIndicatorControllerMock())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user