130 lines
3.7 KiB
Swift
130 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 Defaults
|
|
import JellyfinAPI
|
|
import SwiftUI
|
|
|
|
// TODO: Enable for CustomNames for Devices with SDK Changes
|
|
|
|
struct DeviceDetailsView: View {
|
|
|
|
@EnvironmentObject
|
|
private var router: AdminDashboardCoordinator.Router
|
|
|
|
@CurrentDate
|
|
private var currentDate: Date
|
|
|
|
@State
|
|
private var temporaryCustomName: String
|
|
@State
|
|
private var error: Error?
|
|
@State
|
|
private var isPresentingError: Bool = false
|
|
@State
|
|
private var isPresentingSuccess: Bool = false
|
|
|
|
@StateObject
|
|
private var viewModel: DeviceDetailViewModel
|
|
|
|
private var device: DeviceInfo {
|
|
viewModel.device
|
|
}
|
|
|
|
// MARK: - Initializer
|
|
|
|
init(device: DeviceInfo) {
|
|
_viewModel = StateObject(wrappedValue: DeviceDetailViewModel(device: device))
|
|
|
|
// TODO: Enable with SDK Change
|
|
self.temporaryCustomName = device.name ?? "" // device.customName ?? device.name
|
|
|
|
// _viewModel = StateObject(wrappedValue: DevicesViewModel(device.lastUserID))
|
|
}
|
|
|
|
// MARK: - Body
|
|
|
|
var body: some View {
|
|
List {
|
|
if let userID = device.lastUserID,
|
|
let userName = device.lastUserName
|
|
{
|
|
|
|
let user = UserDto(id: userID, name: userName)
|
|
|
|
AdminDashboardView.UserSection(
|
|
user: user,
|
|
lastActivityDate: device.dateLastActivity
|
|
) {
|
|
router.route(to: \.userDetails, user)
|
|
}
|
|
}
|
|
|
|
// TODO: Enable with SDK Change
|
|
// CustomDeviceNameSection(customName: $temporaryCustomName)
|
|
|
|
AdminDashboardView.DeviceSection(
|
|
client: device.appName,
|
|
device: device.name,
|
|
version: device.appVersion
|
|
)
|
|
|
|
CapabilitiesSection(device: device)
|
|
}
|
|
.navigationTitle(L10n.device)
|
|
.onReceive(viewModel.events) { event in
|
|
switch event {
|
|
case let .error(eventError):
|
|
UIDevice.feedback(.error)
|
|
error = eventError
|
|
isPresentingError = true
|
|
case .setCustomName:
|
|
UIDevice.feedback(.success)
|
|
isPresentingSuccess = true
|
|
}
|
|
}
|
|
.topBarTrailing {
|
|
if viewModel.backgroundStates.contains(.updating) {
|
|
ProgressView()
|
|
|
|
// TODO: Enable with SDK Change
|
|
/*
|
|
Button(L10n.save) {
|
|
UIDevice.impact(.light)
|
|
if device.id != nil {
|
|
viewModel.send(.setCustomName(
|
|
id: device.id ?? "",
|
|
newName: temporaryCustomName
|
|
))
|
|
}
|
|
}
|
|
.buttonStyle(.toolbarPill)
|
|
.disabled(temporaryCustomName == device.customName)
|
|
*/
|
|
}
|
|
}
|
|
.alert(
|
|
L10n.error.text,
|
|
isPresented: $isPresentingError,
|
|
presenting: error
|
|
) { _ in
|
|
Button(L10n.dismiss, role: .cancel)
|
|
} message: { error in
|
|
Text(error.localizedDescription)
|
|
}
|
|
.alert(
|
|
L10n.success.text,
|
|
isPresented: $isPresentingSuccess
|
|
) {
|
|
Button(L10n.dismiss, role: .cancel)
|
|
} message: {
|
|
Text(L10n.customDeviceNameSaved(temporaryCustomName))
|
|
}
|
|
}
|
|
}
|