You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
PadelClub/PadelClub/Views/User/ShareModelView.swift

123 lines
3.6 KiB

//
// UserSearchView.swift
// PadelClub
//
// Created by Laurent Morvillier on 03/12/2024.
//
import Combine
import LeStorage
import SwiftUI
import PadelClubData
struct ShareModelView<T: SyncedStorable> : View {
@StateObject private var viewModel = UserSearchViewModel()
let instance: T
var body: some View {
NavigationView {
if !self.viewModel.availableUsers.isEmpty {
List {
ForEach(self.viewModel.availableUsers, id: \.id) { user in
let isSelected = viewModel.contains(user.id)
UserRow(user: user, isSelected: isSelected)
.contentShape(Rectangle())
.onTapGesture {
self.viewModel.userTapped(user.id)
self._modifyAuthorizedUsersList()
}
}
}
.toolbar {
ToolbarItem(placement: .topBarTrailing) {
SupportButtonView(supportButtonType: .supervisorRequest)
}
}
.navigationTitle("Partager à vos superviseurs")
.navigationBarTitleDisplayMode(.inline)
.toolbarBackground(.visible, for: .navigationBar)
} else {
ContentUnavailableView {
Label("Aucun superviseurs", systemImage: "person.crop.circle.badge.xmark")
} description: {
Text("Si vous souhaitez partager votre tournoi avec d'autres utilisateurs, veuillez contacter notre support")
} actions: {
SupportButtonView(supportButtonType: .supervisorRequest)
}
}
}.onAppear {
self.viewModel.selectedUsers = StoreCenter.main.authorizedUsers(for: self.instance.stringId)
}
}
fileprivate func _modifyAuthorizedUsersList() {
do {
try StoreCenter.main.setAuthorizedUsers(for: self.instance, users: self.viewModel.selectedUsers)
} catch {
Logger.error(error)
}
}
}
struct UserRow: View {
let user: ShortUser
let isSelected: Bool
var body: some View {
HStack {
Text("\(user.firstName) \(user.lastName)")
Spacer()
if self.isSelected {
Image(systemName: "checkmark").foregroundStyle(.logoOrange)
}
}
.padding(.vertical, 4)
}
}
class UserSearchViewModel: ObservableObject {
@Published var searchText = ""
@Published var availableUsers: [ShortUser] = []
@Published var selectedUsers: [String] = []
init() {
Task {
do {
let service = try StoreCenter.main.service()
let shortUsers = try await service.getUserAgents()
await self.setAvailableUsers(shortUsers)
} catch {
Logger.error(error)
}
}
}
@MainActor
func setAvailableUsers(_ users: [ShortUser]) {
self.availableUsers = users
}
func userTapped(_ user: String) {
if let index = self.selectedUsers.firstIndex(of: user) {
self.selectedUsers.remove(at: index)
} else {
self.selectedUsers.append(user)
}
}
func contains(_ user: String) -> Bool {
return self.selectedUsers.firstIndex(of: user) != nil
}
}
// Preview provider
struct ShareModelView_Previews: PreviewProvider {
static var previews: some View {
ShareModelView(instance: Tournament.fake())
}
}