Files
ClashX-Dashboard/ClashX Dashboard/Views/ContentTabs/Config/ConfigView.swift
2023-05-11 10:51:41 +08:00

136 lines
3.0 KiB
Swift

//
// ConfigView.swift
// ClashX Dashboard
//
//
import SwiftUI
struct ConfigView: View {
@State var httpPort: Int = 0
@State var socks5Port: Int = 0
@State var mixedPort: Int = 0
@State var redirPort: Int = 0
@State var mode: String = "Rule"
@State var logLevel: String = "Debug"
@State var allowLAN: Bool = false
@State var sniffer: Bool = false
@State var enableTUNDevice: Bool = false
@State var tunIPStack: String = "System"
@State var deviceName: String = "utun9"
@State var interfaceName: String = "en0"
@State var disableAll = true
var body: some View {
ScrollView {
LazyVGrid(columns: [
GridItem(.flexible()),
GridItem(.flexible())
]) {
VStack(alignment: .leading) {
Text("Http Port")
TextField("0", value: $httpPort, formatter: NumberFormatter())
}
VStack(alignment: .leading) {
Text("Socks5 Port")
TextField("0", value: $socks5Port, formatter: NumberFormatter())
}
VStack(alignment: .leading) {
Text("Mixed Port")
TextField("0", value: $mixedPort, formatter: NumberFormatter())
}
VStack(alignment: .leading) {
Text("Redir Port")
TextField("0", value: $redirPort, formatter: NumberFormatter())
}
VStack(alignment: .leading) {
Text("Mode")
Picker("", selection: $mode) {
ForEach(["Direct", "Rule", "Script", "Global"], id: \.self) {
Text($0)
}
}
.pickerStyle(.menu)
}
VStack(alignment: .leading) {
Text("Log Level")
Picker("", selection: $logLevel) {
ForEach(["Silent", "Error", "Warning", "Info", "Debug"], id: \.self) {
Text($0)
}
}
.pickerStyle(.menu)
}
Toggle("Allow LAN", isOn: $allowLAN)
Toggle("Sniffer", isOn: $sniffer)
}
.padding()
Divider()
.padding()
LazyVGrid(columns: [
GridItem(.flexible()),
GridItem(.flexible())
]) {
Toggle("Enable TUN Device", isOn: $enableTUNDevice)
VStack(alignment: .leading) {
Text("TUN IP Stack")
Picker("", selection: $tunIPStack) {
ForEach(["gVisor", "System", "LWIP"], id: \.self) {
Text($0)
}
}
.pickerStyle(.menu)
}
VStack(alignment: .leading) {
Text("Device Name")
TextField("utun9", text: $deviceName)
}
VStack(alignment: .leading) {
Text("Interface Name")
TextField("en0", text: $interfaceName)
}
}
.padding()
}
.disabled(disableAll)
.onAppear {
ApiRequest.requestConfig { config in
httpPort = config.port
socks5Port = config.socksPort
mixedPort = config.mixedPort
redirPort = config.redirPort
mode = config.mode.rawValue.capitalized
logLevel = config.logLevel.rawValue.capitalized
allowLAN = config.allowLan
sniffer = config.sniffing
enableTUNDevice = config.tun.enable
tunIPStack = config.tun.stack
deviceName = config.tun.device
interfaceName = config.interfaceName
}
}
}
}
//struct ConfigView_Previews: PreviewProvider {
// static var previews: some View {
// ConfigView()
// }
//}