jellyflood/Swiftfin tvOS/Views/SelectServerView.swift

128 lines
3.7 KiB
Swift

//
// Swiftfin is subject to the terms of the Mozilla Public
// License, v2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at https://mozilla.org/MPL/2.0/.
//
// Copyright (c) 2024 Jellyfin & Jellyfin Contributors
//
import CollectionVGrid
import SwiftUI
struct SelectServerView: View {
@EnvironmentObject
private var router: SelectUserCoordinator.Router
@Binding
private var serverSelection: SelectUserServerSelection
@ObservedObject
private var viewModel: SelectUserViewModel
private var selectedServer: ServerState? {
if case let SelectUserServerSelection.server(id: id) = serverSelection,
let server = viewModel.servers.keys.first(where: { server in server.id == id })
{
return server
}
return nil
}
init(
selection: Binding<SelectUserServerSelection>,
viewModel: SelectUserViewModel
) {
self._serverSelection = selection
self.viewModel = viewModel
}
var body: some View {
FullScreenMenu(L10n.servers) {
Section {
Button {
router.popLast {
router.route(to: \.connectToServer)
}
} label: {
HStack {
L10n.addServer.text
Spacer()
Image(systemName: "plus")
}
}
if let selectedServer {
Button {
router.popLast {
router.route(to: \.editServer, selectedServer)
}
} label: {
HStack {
L10n.editServer.text
Spacer()
Image(systemName: "server.rack")
}
}
}
}
Section {
if viewModel.servers.keys.count > 1 {
Button {
serverSelection = .all
router.popLast()
} label: {
HStack {
L10n.allServers.text
Spacer()
if serverSelection == .all {
Image(systemName: "checkmark.circle.fill")
}
}
}
}
ForEach(viewModel.servers.keys.reversed()) { server in
Button {
serverSelection = .server(id: server.id)
router.popLast()
} label: {
HStack {
VStack(alignment: .leading) {
Text(server.name)
.font(.headline)
.fontWeight(.semibold)
Text(server.currentURL.absoluteString)
.font(.subheadline)
.foregroundColor(.primary)
}
Spacer()
if selectedServer == server {
Image(systemName: "checkmark.circle.fill")
}
}
.padding()
}
.buttonStyle(.card)
.padding(.horizontal)
}
} header: {
Text(L10n.servers)
}
.headerProminence(.increased)
}
}
}