Allow server/user deletion
This commit is contained in:
parent
1aa2716f42
commit
b13877cddd
|
@ -15,7 +15,7 @@ struct ServerDetailView: View {
|
|||
|
||||
var body: some View {
|
||||
Form {
|
||||
Section(header: Text("")) {
|
||||
Section(header: Text("Server Details")) {
|
||||
HStack {
|
||||
Text("Name")
|
||||
Spacer()
|
||||
|
|
|
@ -52,6 +52,13 @@ struct ServerListView: View {
|
|||
}
|
||||
.padding()
|
||||
}
|
||||
.contextMenu {
|
||||
Button(role: .destructive) {
|
||||
viewModel.remove(server: server)
|
||||
} label: {
|
||||
Label("Remove", systemImage: "trash")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -60,7 +67,7 @@ struct ServerListView: View {
|
|||
@ViewBuilder
|
||||
private var noServerView: some View {
|
||||
VStack {
|
||||
Text("Connect to a Jellyfin server to get started.")
|
||||
Text("Connect to a Jellyfin server to get started")
|
||||
.frame(minWidth: 50, maxWidth: 240)
|
||||
.multilineTextAlignment(.center)
|
||||
|
||||
|
|
|
@ -28,6 +28,30 @@ struct SettingsView: View {
|
|||
var body: some View {
|
||||
Form {
|
||||
Section(header: EmptyView()) {
|
||||
|
||||
// There is a bug where the SettingsView attmempts to remake itself upon signing out
|
||||
// so this check is made
|
||||
if SessionManager.main.currentLogin == nil {
|
||||
HStack {
|
||||
Text("User")
|
||||
Spacer()
|
||||
Text("")
|
||||
.foregroundColor(.jellyfinPurple)
|
||||
}
|
||||
|
||||
Button {
|
||||
settingsRouter.route(to: \.serverDetail)
|
||||
} label: {
|
||||
HStack {
|
||||
Text("Server")
|
||||
Spacer()
|
||||
Text("")
|
||||
.foregroundColor(.jellyfinPurple)
|
||||
|
||||
Image(systemName: "chevron.right")
|
||||
}
|
||||
}
|
||||
} else {
|
||||
HStack {
|
||||
Text("User")
|
||||
Spacer()
|
||||
|
@ -47,6 +71,7 @@ struct SettingsView: View {
|
|||
Image(systemName: "chevron.right")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
settingsRouter.dismissCoordinator {
|
||||
|
|
|
@ -45,6 +45,13 @@ struct UserListView: View {
|
|||
}
|
||||
.padding()
|
||||
}
|
||||
.contextMenu {
|
||||
Button(role: .destructive) {
|
||||
viewModel.remove(user: user)
|
||||
} label: {
|
||||
Label("Remove", systemImage: "trash")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -53,7 +60,7 @@ struct UserListView: View {
|
|||
@ViewBuilder
|
||||
private var noUserView: some View {
|
||||
VStack {
|
||||
Text("Sign in to get started.")
|
||||
Text("Sign in to get started")
|
||||
.frame(minWidth: 50, maxWidth: 240)
|
||||
.multilineTextAlignment(.center)
|
||||
|
||||
|
|
|
@ -175,6 +175,7 @@ final class SessionManager {
|
|||
}
|
||||
|
||||
func logout() {
|
||||
currentLogin = nil
|
||||
JellyfinAPI.basePath = ""
|
||||
setAuthHeader(with: "")
|
||||
SwiftfinStore.Defaults.suite[.lastServerUserID] = nil
|
||||
|
@ -182,11 +183,35 @@ final class SessionManager {
|
|||
}
|
||||
|
||||
func delete(user: SwiftfinStore.State.User) {
|
||||
|
||||
guard let storedUser = try? SwiftfinStore.dataStack.fetchOne(From<SwiftfinStore.Models.StoredUser>(),
|
||||
[Where<SwiftfinStore.Models.StoredUser>("id == %@", user.id)]) else { fatalError("No stored user for state user?")}
|
||||
_delete(user: storedUser, transaction: nil)
|
||||
}
|
||||
|
||||
func delete(server: SwiftfinStore.State.Server) {
|
||||
guard let storedServer = try? SwiftfinStore.dataStack.fetchOne(From<SwiftfinStore.Models.StoredServer>(),
|
||||
[Where<SwiftfinStore.Models.StoredServer>("id == %@", server.id)]) else { fatalError("No stored server for state server?")}
|
||||
_delete(server: storedServer, transaction: nil)
|
||||
}
|
||||
|
||||
private func _delete(user: SwiftfinStore.Models.StoredUser, transaction: UnsafeDataTransaction?) {
|
||||
guard let storedAccessToken = user.accessToken else { fatalError("No access token for stored user?")}
|
||||
|
||||
let transaction = transaction == nil ? SwiftfinStore.dataStack.beginUnsafe() : transaction!
|
||||
transaction.delete(storedAccessToken)
|
||||
transaction.delete(user)
|
||||
try? transaction.commitAndWait()
|
||||
}
|
||||
|
||||
private func _delete(server: SwiftfinStore.Models.StoredServer, transaction: UnsafeDataTransaction?) {
|
||||
let transaction = transaction == nil ? SwiftfinStore.dataStack.beginUnsafe() : transaction!
|
||||
|
||||
for user in server.users {
|
||||
_delete(user: user, transaction: transaction)
|
||||
}
|
||||
|
||||
transaction.delete(server)
|
||||
try? transaction.commitAndWait()
|
||||
}
|
||||
|
||||
private func setAuthHeader(with accessToken: String) {
|
||||
|
|
|
@ -25,4 +25,9 @@ class ServerListViewModel: ObservableObject {
|
|||
return "\(server.userIDs.count) users"
|
||||
}
|
||||
}
|
||||
|
||||
func remove(server: SwiftfinStore.State.Server) {
|
||||
SessionManager.main.delete(server: server)
|
||||
fetchServers()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,4 +29,9 @@ class UserListViewModel: ViewModel {
|
|||
SessionManager.main.loginUser(server: server, user: user)
|
||||
SwiftfinNotificationCenter.main.post(name: SwiftfinNotificationCenter.Keys.didSignIn, object: nil)
|
||||
}
|
||||
|
||||
func remove(user: SwiftfinStore.State.User) {
|
||||
SessionManager.main.delete(user: user)
|
||||
fetchUsers()
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue