[iOS] Select all Users When Editing (#1373)

This commit is contained in:
Daniel Chick 2024-12-23 12:43:18 -06:00 committed by GitHub
parent af602d3d98
commit 2f13093cc0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 61 additions and 52 deletions

View File

@ -17,4 +17,10 @@ extension Set {
insert(value)
}
}
mutating func insert(contentsOf elements: [Element]) {
for element in elements {
insert(element)
}
}
}

View File

@ -20,6 +20,9 @@ import SwiftUI
// TODO: user ordering
// - name
// - last signed in date
// TODO: between the server selection menu and delete toolbar,
// figure out a way to make the grid/list and splash screen
// not jump when size is changed
struct SelectUserView: View {
@ -85,6 +88,17 @@ struct SelectUserView: View {
@State
private var error: Error? = nil
private var users: [UserState] {
gridItems.compactMap { item in
switch item {
case let .user(user, _):
return user
default:
return nil
}
}
}
// MARK: - Select Server
private var selectedServer: ServerState? {
@ -380,33 +394,6 @@ struct SelectUserView: View {
}
}
// MARK: - Delete Users Button
@ViewBuilder
private var deleteUsersButton: some View {
Button {
isPresentingConfirmDeleteUsers = true
} label: {
ZStack {
Color.red
Text(L10n.delete)
.font(.body.weight(.semibold))
.foregroundStyle(selectedUsers.isNotEmpty ? .primary : .secondary)
if selectedUsers.isEmpty {
Color.black
.opacity(0.5)
}
}
.clipShape(RoundedRectangle(cornerRadius: 10))
.frame(height: 50)
.frame(maxWidth: 400)
}
.disabled(selectedUsers.isEmpty)
.buttonStyle(.plain)
}
// MARK: - User View
@ViewBuilder
@ -453,11 +440,6 @@ struct SelectUserView: View {
)
.edgePadding([.bottom, .horizontal])
}
if isEditingUsers {
deleteUsersButton
.edgePadding([.bottom, .horizontal])
}
}
.background {
if selectUserUseSplashscreen, splashScreenImageSources.isNotEmpty {
@ -516,30 +498,51 @@ struct SelectUserView: View {
.aspectRatio(contentMode: .fit)
.frame(width: 30)
}
}
.topBarTrailing {
ToolbarItem(placement: .topBarLeading) {
if isEditingUsers {
Button {
isEditingUsers = false
} label: {
L10n.cancel.text
.font(.headline)
.padding(.vertical, 5)
.padding(.horizontal, 10)
.background {
if colorScheme == .light {
Color.secondarySystemFill
if selectedUsers.count == users.count {
Button(L10n.removeAll) {
selectedUsers.removeAll()
}
.buttonStyle(.toolbarPill)
} else {
Color.tertiarySystemBackground
Button(L10n.selectAll) {
selectedUsers.insert(contentsOf: users)
}
.buttonStyle(.toolbarPill)
}
}
.clipShape(RoundedRectangle(cornerRadius: 10))
}
.buttonStyle(.plain)
ToolbarItemGroup(placement: .topBarTrailing) {
if isEditingUsers {
Button(isEditingUsers ? L10n.cancel : L10n.edit) {
isEditingUsers.toggle()
UIDevice.impact(.light)
if !isEditingUsers {
selectedUsers.removeAll()
}
}
.buttonStyle(.toolbarPill)
} else {
advancedMenu
}
}
ToolbarItem(placement: .bottomBar) {
if isEditingUsers {
Button(L10n.delete) {
isPresentingConfirmDeleteUsers = true
}
.buttonStyle(.toolbarPill(.red))
.disabled(selectedUsers.isEmpty)
.frame(maxWidth: .infinity, alignment: .trailing)
}
}
}
.onAppear {
viewModel.send(.getServers)