This commit is contained in:
mrFq1
2023-04-25 14:51:23 +08:00
commit f3141fbffe
39 changed files with 3793 additions and 0 deletions
@@ -0,0 +1,48 @@
//
// APIServerItem.swift
// ClashX Dashboard
//
//
import SwiftUI
struct APIServerItem: View {
@State var server: String
var action: () -> Void
var onDelete: () -> Void
@State private var mouseOver = false
var body: some View {
HStack {
Button("X") {
onDelete()
}
.buttonStyle(.bordered)
Button() {
action()
} label: {
Text(server)
.font(.title2)
}
.buttonStyle(.borderless)
Spacer()
}
.frame(height: 21)
.padding(EdgeInsets(top: 12, leading: 20, bottom: 12, trailing: 20))
.overlay(
RoundedRectangle(cornerRadius: 6)
.stroke(.secondary, lineWidth: 1)
.padding(1)
)
}
}
//struct APIServerItem_Previews: PreviewProvider {
// static var previews: some View {
// APIServerItem()
// }
//}
@@ -0,0 +1,76 @@
//
// APISettingView.swift
// ClashX Dashboard
//
//
import SwiftUI
struct APISettingView: View {
@State var baseURL: String = ""
@State var secret: String = ""
@State var connectInfo: String = ""
@AppStorage("savedServers") var savedServers = SavedServersAppStorage()
var body: some View {
VStack(alignment: .center) {
HStack {
VStack(alignment: .leading) {
Text("API Base URL")
TextField("http://127.0.0.1:9090", text: $baseURL)
}
.frame(width: 250)
VStack(alignment: .leading) {
Text("Secret(optional)")
TextField("", text: $secret)
}
.frame(width: 120)
}
HStack {
Text(connectInfo)
Spacer()
Button("Add") {
savedServers.append(.init(apiURL: baseURL, secret: secret))
print(savedServers)
}
}
List(savedServers, id: \.id) { server in
APIServerItem(server: server.apiURL) {
ConfigManager.shared.overrideApiURL = .init(string: server.apiURL)
ConfigManager.shared.overrideSecret = server.secret
ApiRequest.requestVersion { version in
if let version {
connectInfo = ""
print(version)
ConfigManager.shared.isRunning = true
} else {
connectInfo = "Failed to connect"
}
}
} onDelete: {
savedServers.removeAll {
$0.id == server.id
}
}
}
}
.padding(.top)
.fixedSize(horizontal: true, vertical: false)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
struct APISettingView_Previews: PreviewProvider {
static var previews: some View {
APISettingView()
}
}
@@ -0,0 +1,36 @@
//
// ClashServerAppStorage.swift
// ClashX Dashboard
//
//
import Foundation
import SwiftUI
typealias SavedServersAppStorage = [ClashServerAppStorage]
struct ClashServerAppStorage: Codable, Identifiable {
let id = UUID().uuidString
let apiURL: String
let secret: String
}
extension SavedServersAppStorage: RawRepresentable {
public init?(rawValue: String) {
guard let data = rawValue.data(using: .utf8),
let result = try? JSONDecoder().decode(SavedServersAppStorage.self, from: data)
else {
return nil
}
self = result
}
public var rawValue: String {
guard let data = try? JSONEncoder().encode(self),
let result = String(data: data, encoding: .utf8)
else {
return "[]"
}
return result
}
}