Let the user name the iPhone in Settings
This commit is contained in:
@@ -107,7 +107,8 @@ private let clientID = newID("cli")
|
||||
#if os(macOS)
|
||||
let deviceName = Host.current().localizedName ?? ProcessInfo.processInfo.hostName
|
||||
#else
|
||||
let deviceName = MainActor.assumeIsolated { UIDevice.current.name }
|
||||
let deviceNameKey = "deviceName"
|
||||
let deviceName = UserDefaults.standard.string(forKey: deviceNameKey) ?? deviceKind
|
||||
#endif
|
||||
|
||||
final class API: Sendable {
|
||||
|
||||
@@ -3,8 +3,6 @@ import SwiftUI
|
||||
|
||||
final class PhoneDelegate: NSObject, UIApplicationDelegate {
|
||||
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
|
||||
// deviceName reads UIDevice, which is main-actor only, so it must first be read here.
|
||||
_ = deviceName
|
||||
Notifier.shared.install()
|
||||
UITextView.appearance().textContainerInset = .zero
|
||||
return true
|
||||
|
||||
@@ -22,6 +22,13 @@ struct SettingsView: View {
|
||||
var body: some View {
|
||||
ScrollView {
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
#if os(iOS)
|
||||
heading("This iPhone's name")
|
||||
Text("byre shows this iPhone by this name, and names its tailnet node after it. A new name takes effect the next time byre opens.")
|
||||
.foregroundStyle(Palette.muted)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
DeviceNameField()
|
||||
#endif
|
||||
heading("Window color")
|
||||
Text("Windows for this server have a border in this color, on every device you use.")
|
||||
.foregroundStyle(Palette.muted)
|
||||
@@ -79,6 +86,40 @@ struct SettingsView: View {
|
||||
}
|
||||
}
|
||||
|
||||
#if os(iOS)
|
||||
private struct DeviceNameField: View {
|
||||
@ViewState private var name = UserDefaults.standard.string(forKey: deviceNameKey) ?? deviceKind
|
||||
@ViewState private var saved = UserDefaults.standard.string(forKey: deviceNameKey) ?? deviceKind
|
||||
|
||||
var body: some View {
|
||||
let trimmed = name.trimmingCharacters(in: .whitespaces)
|
||||
let valid = !slug(trimmed).isEmpty && trimmed != saved
|
||||
HStack(spacing: 6) {
|
||||
TextField("Name", text: $name)
|
||||
.modifier(FieldStyle())
|
||||
.onSubmit {
|
||||
save(trimmed, valid)
|
||||
}
|
||||
Button("Save") {
|
||||
save(trimmed, valid)
|
||||
}
|
||||
.buttonStyle(WebButtonStyle())
|
||||
.disabled(!valid)
|
||||
}
|
||||
.padding(.top, 8)
|
||||
}
|
||||
|
||||
private func save(_ trimmed: String, _ valid: Bool) {
|
||||
if !valid {
|
||||
return
|
||||
}
|
||||
UserDefaults.standard.set(trimmed, forKey: deviceNameKey)
|
||||
saved = trimmed
|
||||
name = trimmed
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
private struct ServerColorPicker: View {
|
||||
@Environment(Store.self) private var store
|
||||
|
||||
|
||||
@@ -26,11 +26,7 @@ func slug(_ text: String) -> String {
|
||||
|
||||
final class TailnetNode: Sendable {
|
||||
let sd: tailscale
|
||||
#if os(macOS)
|
||||
let hostname = "byre-app-\(slug(deviceName))"
|
||||
#else
|
||||
let hostname = "byre-app-\(slug(deviceKind))"
|
||||
#endif
|
||||
private let socks = TailnetProxy()
|
||||
|
||||
init() {
|
||||
|
||||
Reference in New Issue
Block a user