// // ContentView.swift // sdlan // // Created by 安礼成 on 2024/1/17. // import SwiftUI import SwiftData import Combine struct ContentView: View { //@Environment(\.modelContext) private var modelContext //@Query private var items: [Item] @AppStorage("token") private var token: String = "" @ObservedObject private var vpnManager = VPNManager.shared @State private var showAlert = false @State private var showStunAlert = false @State private var message: NoticeMessage.InboundMessage = .none @State private var cancel: AnyCancellable? var body: some View { VStack(alignment: .center, spacing: 10) { Image("logo") Text("PUNCHENT") .font(.system(size: 46, weight: .bold)) .foregroundColor(.white) .cornerRadius(5.0) Spacer() .frame(width: 1, height: 10) TextField("邀请码", text: $token) .multilineTextAlignment(.center) .frame(width: 245, height: 27) .cornerRadius(5.0) Spacer() .frame(width: 1, height: 10) Button(action: { Task { switch self.vpnManager.vpnStatus { case .connected: try await vpnManager.disableVpn() case .disconnected: if self.token.isEmpty { self.showAlert = true return } try await vpnManager.enableVpn(options: [ "version:": SystemConfig.version as NSObject, "installed_channel": SystemConfig.installedChannel as NSObject, "token": self.token as NSObject ]) } } }, label: { Text(vpnManager.title) .font(.system(size: 16, weight: .regular)) .foregroundColor(vpnManager.color) .cornerRadius(5.0) }) .frame(width: 138, height: 33) .buttonStyle(PlainButtonStyle()) .background(Color(red: 74 / 255, green: 207 / 255, blue: 154 / 255)) .cornerRadius(5.0) } .frame(width: 380, height: 560) .background(Color(red: 36 / 255, green: 38 / 255, blue: 51 / 255)) .alert(isPresented: $showAlert) { Alert(title: Text("请输入正确的邀请码")) } .alert(isPresented: $showStunAlert) { switch self.message { case .upgradeMessage(let upgradeMessage): Alert(title: Text(upgradeMessage.prompt)) case .alertMessage(let alertMessage): Alert(title: Text(alertMessage.alert)) default: Alert(title: Text("")) } } .onAppear { self.cancel = UDPNoticeCenterServer.shared.messageFlow.sink{ message in DispatchQueue.main.async { self.message = message self.showStunAlert = true } } } /* NavigationSplitView { List { ForEach(items) { item in NavigationLink { Text("Item at \(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))") } label: { Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard)) } } .onDelete(perform: deleteItems) } .navigationSplitViewColumnWidth(min: 180, ideal: 200) .toolbar { ToolbarItem { Button(action: addItem) { Label("Add Item", systemImage: "plus") } } } } detail: { Text("Select an item") } */ } private func addItem() { withAnimation { } } private func deleteItems(offsets: IndexSet) { withAnimation { // for index in offsets { // modelContext.delete(items[index]) // } } } } #Preview { ContentView() //.modelContainer(for: Item.self, inMemory: true) }