Files
UUVPN/iOS-SwiftUI-Code/XiaoXiong/DefaultUI/View/LoginView/Signup.swift
T
2025-09-21 19:51:09 +08:00

215 lines
6.9 KiB
Swift

//
// Signup.swift
// LoginKit
//
// Created by zues on 04/08/23.
//
import SwiftUI
struct SignUp: View {
@Binding var isLoggedIn: Bool
@Binding var showSignup: Bool
@State private var isLoading = false
@State private var errorMessage: String?
/// View Properties
@State private var emailID: String = ""
@State private var fullName: String = ""
@State private var password: String = ""
/// Optional, Present If you want to ask OTP for Signup
@State private var askOTP: Bool = false
@State private var otpText: String = ""
var body: some View {
VStack(alignment: .leading, spacing: 15, content: {
// HStack{
// Spacer()
// Image("applogo").resizable().frame(width: 100, height: 100).cornerRadius(20)
// Spacer()
// }
Text("注册")
.font(.largeTitle)
//.fontWeight(.heavy)
.padding(.top, 25)
Text("请按注册按钮继续")
.font(.callout)
//.fontWeight(.semibold)
.foregroundStyle(.gray)
.padding(.top, -5)
VStack(spacing: 25) {
/// Custom Text Fields
CustomTF(sfIcon: "at", hint: "Email", value: $emailID)
CustomTF(sfIcon: "lock", hint: "密码", isPassword: true, value: $password)
.padding(.top, 5)
CustomTF(sfIcon: "person", hint: "邀请人(可不填)", value: $fullName)
.padding(.top, 5)
Text("通过注册,你同意我们的[条款和条件](https://minipanda.soccertt.com/teams.html)和[隐私政策](https://minipanda.soccertt.com/privacy.html)")
.font(.caption)
.tint(.white)
.foregroundStyle(.gray)
.frame(height: 50)
if isLoading {
ProgressView()
}
if let errorMessage = errorMessage {
Text(errorMessage)
.bold()
.foregroundColor(.red)
.multilineTextAlignment(.center) // 确保多行文本居中
.padding()
}
/// SignUp Button
GradientButton(title: "注册", icon: "arrow.right") {
/// YOUR CODE
//askOTP.toggle()
Task{
await logupUser()
}
}
.hSpacing(.trailing)
/// Disabling Until the Data is Entered || fullName.isEmpty
.disableWithOpacity(emailID.isEmpty || password.isEmpty || isLoading)
}
.padding(.top, 20)
Spacer(minLength: 0)
HStack(spacing: 6) {
Text("已经有账号?")
.foregroundStyle(.gray)
Button("登录") {
showSignup = false
}
//.fontWeight(.bold)
.tint(.white)
}
.font(.callout)
.hSpacing()
})
.padding(.vertical, 15)
.padding(.horizontal, 25)
//.toolbar(.hidden, for: .navigationBar)
/// OTP Prompt
.sheet(isPresented: $askOTP, onDismiss: {
/// YOUR CODE
/// Reset OTP if You Want
// otpText = ""
}, content: {
if #available(iOS 16.4, *) {
/// Since I wanted a Custom Sheet Corner Radius
OTPView(otpText: $otpText)
.presentationDetents([.height(350)])
.presentationCornerRadius(30)
} else {
OTPView(otpText: $otpText)
// .presentationDetents([.height(350)])
}
})
}
// MARK: - Networking Logic
func logupUser() async {
isLoading = true
errorMessage = nil
let loginUrl = URL(string: "\(UserManager.shared.baseURL())passport/auth/register")!
var request = URLRequest(url: loginUrl)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let loginData = ["email": emailID, "password": password, "captchaData": "","email_code":"","invite_code":fullName]
guard let httpBody = try? JSONSerialization.data(withJSONObject: loginData) else {
self.errorMessage = "Invalid login data"
self.isLoading = false
return
}
request.httpBody = httpBody
let task = URLSession.shared.dataTask(with: request) { data, response, error in
DispatchQueue.main.async {
self.isLoading = false
if let error = error {
self.errorMessage = "注册失败: \(error.localizedDescription)"
return
}
guard let data = data else {
self.errorMessage = "注册失败:数据返回空"
return
}
// Parse the login response and get the authorization token
if let jsonResponse = try? JSONDecoder().decode(LoginResponseSuccess.self, from: data){
if let authData = jsonResponse.data?.authData {
UserManager.shared.updateLoginStatus(true)
UserManager.shared.storeAutoData(data: authData)
self.isLoggedIn = true
}else{
if let message = jsonResponse.message {
self.errorMessage = "\(message)"
}
}
}else{
self.errorMessage = "注册失败: 返回JSON格式错误"
}
}
}
task.resume()
}
}
/***
{
"status": "success",
"message": "\u64cd\u4f5c\u6210\u529f",
"data": {
"token": "56ffc6d0465212eca2856aa25dc1644e",
"is_admin": null,
"auth_data": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTU0MDMsInNlc3Npb24iOiJiYzk3N2RhOTczN2RjZWVlM2FiNDc2NzAzMjBjOTI2OCJ9.WUPCzTlgsOMGM-DrsSMRrfBqgAB8GEysDyAofq6TgVo"
},
"error": null
}
*/