.help(...)-Tooltips auf jedem Eingabefeld/Picker/Toggle in Connect- sowie allen Einrichten-Schritten (WAN/LAN/VLAN/WLAN/Firewall) -- kurze Erklärung was der Wert bedeutet und welche Auswirkung er hat, passend zum Laien-Anspruch der App. Sicherungen-Tab: Speicherort jetzt änderbar (Ordner wählen über nativen macOS-Dialog, Zurücksetzen auf Standard). BackupService hält den gewählten Pfad in UserDefaults (BackupService.customDirectoryURL), fällt ohne Auswahl weiter auf ~/Library/Application Support/... zurück. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HReLXMbmPvtQ23p1iWiJNW
75 lines
3.4 KiB
Swift
75 lines
3.4 KiB
Swift
import SwiftUI
|
|
|
|
struct WanStepView: View {
|
|
@ObservedObject var viewModel: SetupViewModel
|
|
let availableInterfaces: [NetworkInterface]
|
|
|
|
var body: some View {
|
|
Form {
|
|
Section("Internet-Anschluss") {
|
|
Picker("Anschluss (Port)", selection: $viewModel.wanConfig.interfaceName) {
|
|
ForEach(availableInterfaces) { interface in
|
|
Text(interface.name).tag(interface.name)
|
|
}
|
|
}
|
|
.help("Der Netzwerkport, über den dein Router mit dem Internet verbunden ist (z.B. das Kabel zu deinem Modem oder deiner Anschlussdose).")
|
|
|
|
Picker("Verbindungsart", selection: $viewModel.wanConfig.mode) {
|
|
ForEach(WanConnectionMode.allCases) { mode in
|
|
Text(mode.label).tag(mode)
|
|
}
|
|
}
|
|
.pickerStyle(.inline)
|
|
.help("Wie sich der Router beim Internetanbieter anmeldet. \"Automatisch (DHCP)\" passt für die meisten Kabel-/Glasfaseranschlüsse.")
|
|
}
|
|
|
|
switch viewModel.wanConfig.mode {
|
|
case .dhcpClient:
|
|
Section {
|
|
Text("Der Router bezieht seine Internetadresse automatisch von deinem Anbieter. Für die meisten Kabel-/Glasfaser-Anschlüsse die richtige Wahl.")
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
case .staticIP:
|
|
Section("Statische Adresse") {
|
|
TextField("IP-Adresse (z.B. 203.0.113.5/24)", text: $viewModel.wanConfig.staticAddress)
|
|
.help("Die feste IP-Adresse, die dir dein Anbieter zugewiesen hat, inklusive Netzmaske (die Zahl nach dem /, z.B. /24).")
|
|
TextField("Gateway (z.B. 203.0.113.1)", text: $viewModel.wanConfig.staticGateway)
|
|
.help("Die Adresse des nächsten Geräts Richtung Internet — steht meist in den Unterlagen deines Anbieters.")
|
|
}
|
|
case .pppoe:
|
|
Section("PPPoE-Zugangsdaten") {
|
|
TextField("Benutzername", text: $viewModel.wanConfig.pppoeUsername)
|
|
.help("Zugangsdaten von deinem Internetanbieter für die Einwahl (z.B. bei DSL-Anschlüssen).")
|
|
SecureField("Passwort", text: $viewModel.wanConfig.pppoePassword)
|
|
.help("Das zum Benutzernamen gehörende Passwort von deinem Internetanbieter.")
|
|
Text("Diese Zugangsdaten bekommst du von deinem Internetanbieter (z.B. Telekom, Vodafone).")
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
}
|
|
|
|
Section {
|
|
HStack {
|
|
Spacer()
|
|
Button("Weiter") { viewModel.goNext() }
|
|
.disabled(!isStepValid)
|
|
}
|
|
}
|
|
}
|
|
.formStyle(.grouped)
|
|
.navigationTitle("Internet einrichten")
|
|
}
|
|
|
|
private var isStepValid: Bool {
|
|
guard !viewModel.wanConfig.interfaceName.isEmpty else { return false }
|
|
switch viewModel.wanConfig.mode {
|
|
case .dhcpClient:
|
|
return true
|
|
case .staticIP:
|
|
return !viewModel.wanConfig.staticAddress.isEmpty
|
|
case .pppoe:
|
|
return !viewModel.wanConfig.pppoeUsername.isEmpty && !viewModel.wanConfig.pppoePassword.isEmpty
|
|
}
|
|
}
|
|
}
|