Add “show location” feature in other sessions list

This commit is contained in:
Alfonso Grillo 2022-11-02 15:31:36 +01:00
parent cd5ce7ea72
commit bae2856418
5 changed files with 21 additions and 6 deletions

View file

@ -45,6 +45,7 @@ struct UserOtherSessionsViewState: BindableState, Equatable {
struct UserOtherSessionsBindings: Equatable {
var filter: UserOtherSessionsFilter
var isEditModeEnabled: Bool
var showLocationInfo = false
}
enum UserOtherSessionsViewAction {

View file

@ -52,6 +52,7 @@ struct UserOtherSessions: View {
.toolbar {
UserOtherSessionsToolbar(isEditModeEnabled: $viewModel.isEditModeEnabled,
filter: $viewModel.filter,
isShowLocationEnabled: $viewModel.showLocationInfo,
allItemsSelected: viewModel.viewState.allItemsSelected,
sessionCount: viewModel.viewState.sessionItems.count,
onToggleSelection: { viewModel.send(viewAction: .toggleAllSelection) },
@ -88,7 +89,7 @@ struct UserOtherSessions: View {
LazyVStack(spacing: 0) {
ForEach(viewModel.viewState.sessionItems) { viewData in
UserSessionListItem(viewData: viewData,
showsLocationInfo: false,
showsLocationInfo: viewModel.showLocationInfo,
isSeparatorHidden: viewData == viewModel.viewState.sessionItems.last,
isEditModeEnabled: viewModel.isEditModeEnabled,
onBackgroundTap: { sessionId in viewModel.send(viewAction: .userOtherSessionSelected(sessionId: sessionId)) },

View file

@ -21,6 +21,7 @@ struct UserOtherSessionsToolbar: ToolbarContent {
@Binding var isEditModeEnabled: Bool
@Binding var filter: UserOtherSessionsFilter
@Binding var isShowLocationEnabled: Bool
let allItemsSelected: Bool
let sessionCount: Int
let onToggleSelection: () -> Void
@ -93,6 +94,14 @@ struct UserOtherSessionsToolbar: ToolbarContent {
Label(VectorL10n.userOtherSessionMenuSignOutSessions(String(sessionCount)), systemImage: "rectangle.portrait.and.arrow.forward.fill")
}
}
Button {
isShowLocationEnabled.toggle()
} label: {
let text = isShowLocationEnabled ? VectorL10n.userSessionsHideLocationInfo : VectorL10n.userSessionsShowLocationInfo
let image = isShowLocationEnabled ? "eye.slash" : "eye"
Label(text, systemImage: image)
}
} label: {
Image(systemName: "ellipsis")
.padding(.horizontal, 4)

View file

@ -43,6 +43,10 @@ enum UserSessionsOverviewViewModelResult: Equatable {
// MARK: View
struct UserSessionsOverviewViewBindings {
var showLocationInfo = false
}
struct UserSessionsOverviewViewState: BindableState {
var currentSessionViewData: UserSessionCardViewData?
var unverifiedSessionsViewData = [UserSessionListItemViewData]()
@ -50,7 +54,7 @@ struct UserSessionsOverviewViewState: BindableState {
var otherSessionsViewData = [UserSessionListItemViewData]()
var showLoadingIndicator = false
var linkDeviceButtonVisible = false
var showLocationInfo = false
var bindings: UserSessionsOverviewViewBindings = .init()
}
enum UserSessionsOverviewViewAction {

View file

@ -144,9 +144,9 @@ struct UserSessionsOverview: View {
private var otherSessionsMenu: some View {
Menu {
Button { viewModel.send(viewAction: .viewOtherSessionsLocation) } label: {
let text = viewModel.viewState.showLocationInfo ? VectorL10n.userSessionsHideLocationInfo : VectorL10n.userSessionsShowLocationInfo
let image = viewModel.viewState.showLocationInfo ? "eye.slash" : "eye"
Button { viewModel.showLocationInfo.toggle() } label: {
let text = viewModel.showLocationInfo ? VectorL10n.userSessionsHideLocationInfo : VectorL10n.userSessionsShowLocationInfo
let image = viewModel.showLocationInfo ? "eye.slash" : "eye"
Label(text, systemImage: image)
}
} label: {
@ -166,7 +166,7 @@ struct UserSessionsOverview: View {
LazyVStack(spacing: 0) {
ForEach(viewModel.viewState.otherSessionsViewData.prefix(maxOtherSessionsToDisplay)) { viewData in
UserSessionListItem(viewData: viewData,
showsLocationInfo: viewModel.viewState.showLocationInfo,
showsLocationInfo: viewModel.showLocationInfo,
isSeparatorHidden: viewData == viewModel.viewState.otherSessionsViewData.last,
onBackgroundTap: { sessionId in viewModel.send(viewAction: .tapUserSession(sessionId)) })
}