Device Manager: Rename Session (#6826)

* Publish the user sessions overview data.
* Add UserSessionName screen.
* Update logout action to match Figma more closely.
This commit is contained in:
Doug
2022-10-11 13:11:15 +01:00
committed by GitHub
parent 969c51db1e
commit efaf98fe6a
29 changed files with 765 additions and 123 deletions
@@ -14,12 +14,14 @@
// limitations under the License.
//
import Combine
import CommonKit
import SwiftUI
struct UserSessionOverviewCoordinatorParameters {
let session: MXSession
let sessionInfo: UserSessionInfo
let sessionsOverviewDataPublisher: CurrentValueSubject<UserSessionsOverviewData, Never>
}
final class UserSessionOverviewCoordinator: Coordinator, Presentable {
@@ -42,7 +44,9 @@ final class UserSessionOverviewCoordinator: Coordinator, Presentable {
self.parameters = parameters
let service = UserSessionOverviewService(session: parameters.session, sessionInfo: parameters.sessionInfo)
viewModel = UserSessionOverviewViewModel(sessionInfo: parameters.sessionInfo, service: service)
viewModel = UserSessionOverviewViewModel(sessionInfo: parameters.sessionInfo,
service: service,
sessionsOverviewDataPublisher: parameters.sessionsOverviewDataPublisher)
hostingController = VectorHostingController(rootView: UserSessionOverview(viewModel: viewModel.context))
hostingController.vc_setLargeTitleDisplayMode(.never)
@@ -36,7 +36,7 @@ enum UserSessionOverviewViewModelResult: Equatable {
// MARK: View
struct UserSessionOverviewViewState: BindableState {
let cardViewData: UserSessionCardViewData
var cardViewData: UserSessionCardViewData
let isCurrentSession: Bool
var isPusherEnabled: Bool?
var remotelyTogglingPushersAvailable: Bool
@@ -14,6 +14,7 @@
// limitations under the License.
//
import Combine
import SwiftUI
typealias UserSessionOverviewViewModelType = StateStoreViewModel<UserSessionOverviewViewState, UserSessionOverviewViewAction>
@@ -26,7 +27,13 @@ class UserSessionOverviewViewModel: UserSessionOverviewViewModelType, UserSessio
// MARK: - Setup
init(sessionInfo: UserSessionInfo, service: UserSessionOverviewServiceProtocol) {
init(sessionInfo: UserSessionInfo,
service: UserSessionOverviewServiceProtocol,
sessionsOverviewDataPublisher: CurrentValueSubject<UserSessionsOverviewData, Never> = .init(.init(currentSession: nil,
unverifiedSessions: [],
inactiveSessions: [],
otherSessions: [],
linkDeviceEnabled: false))) {
self.sessionInfo = sessionInfo
self.service = service
@@ -39,6 +46,21 @@ class UserSessionOverviewViewModel: UserSessionOverviewViewModelType, UserSessio
super.init(initialViewState: state)
startObservingService()
sessionsOverviewDataPublisher.sink { [weak self] overviewData in
guard let self = self else { return }
var updatedInfo: UserSessionInfo?
if let currentSession = overviewData.currentSession, currentSession.id == sessionInfo.id {
updatedInfo = currentSession
} else if let otherSession = overviewData.otherSessions.first(where: { $0.id == sessionInfo.id }) {
updatedInfo = otherSession
}
guard let updatedInfo = updatedInfo else { return }
self.state.cardViewData = UserSessionCardViewData(sessionInfo: updatedInfo)
}
.store(in: &cancellables)
}
private func startObservingService() {
@@ -47,6 +47,7 @@ struct UserSessionOverview: View {
SwiftUI.Section {
UserSessionOverviewItem(title: VectorL10n.manageSessionSignOut,
alignment: .center,
isDestructive: true) {
viewModel.send(viewAction: .logoutOfSession)
}
@@ -66,8 +67,11 @@ struct UserSessionOverview: View {
Label(VectorL10n.manageSessionRename, systemImage: "pencil")
}
} label: {
Image(systemName: "ellipsis.circle")
Image(systemName: "ellipsis")
.padding(.horizontal, 4)
.padding(.vertical, 12)
}
.offset(x: 4) // Re-align the symbol after applying padding.
}
}
.accentColor(theme.colors.accent)
@@ -20,6 +20,7 @@ struct UserSessionOverviewItem: View {
@Environment(\.theme) private var theme: ThemeSwiftUI
let title: String
var alignment: Alignment = .leading
var showsChevron = false
var isDestructive = false
var onBackgroundTap: (() -> Void)?
@@ -32,7 +33,7 @@ struct UserSessionOverviewItem: View {
Text(title)
.font(theme.fonts.body)
.foregroundColor(textColor)
.frame(maxWidth: .infinity, alignment: .leading)
.frame(maxWidth: .infinity, alignment: alignment)
if showsChevron {
Image(Asset.Images.chevron.name)