Add CI/CD configuration and API documentation
This commit is contained in:
@@ -0,0 +1,182 @@
|
||||
//
|
||||
// ForgotPassword.swift
|
||||
// LoginKit
|
||||
//
|
||||
// Created by zues on 04/08/23.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct ForgotPassword: View {
|
||||
@Binding var showResetView: Bool
|
||||
/// View Properties
|
||||
//@State private var emailID: String = ""
|
||||
@Binding var emailID: String
|
||||
/// Environment Properties
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
|
||||
@State private var askOTP: Bool = false
|
||||
//@State private var otpText: String = ""
|
||||
|
||||
@Binding var otpText: String
|
||||
|
||||
@State private var isLoading = false
|
||||
@State private var errorMessage: String?
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading, spacing: 15, content: {
|
||||
/// Back Button
|
||||
Button(action: {
|
||||
dismiss()
|
||||
}, label: {
|
||||
Image(systemName: "arrow.left")
|
||||
.font(.title2)
|
||||
.foregroundStyle(.gray)
|
||||
})
|
||||
.padding(.top, 10)
|
||||
|
||||
Text("忘记密码?")
|
||||
.font(.largeTitle)
|
||||
//.fontWeight(.heavy)
|
||||
.padding(.top, 5)
|
||||
|
||||
Text("请输入您的电子邮件,以便我们可以发送验证码。")
|
||||
.font(.caption)
|
||||
//.fontWeight(.semibold)
|
||||
.foregroundStyle(.gray)
|
||||
.padding(.top, -5)
|
||||
|
||||
|
||||
|
||||
VStack(spacing: 25) {
|
||||
/// Custom Text Fields
|
||||
CustomTF(sfIcon: "at", hint: "输入邮箱", value: $emailID)
|
||||
|
||||
if isLoading {
|
||||
ProgressView()
|
||||
}
|
||||
|
||||
if let errorMessage = errorMessage {
|
||||
Text(errorMessage)
|
||||
.bold()
|
||||
.foregroundColor(.red)
|
||||
.multilineTextAlignment(.center) // 确保多行文本居中
|
||||
.padding()
|
||||
}
|
||||
|
||||
/// SignUp Button
|
||||
GradientButton(title: "发送验证码", icon: "arrow.right") {
|
||||
/// YOUR CODE
|
||||
/// After the Link sent
|
||||
Task {
|
||||
await sendemail(email:emailID)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
.hSpacing(.trailing)
|
||||
/// Disabling Until the Data is Entered
|
||||
.disableWithOpacity(emailID.isEmpty || isLoading)
|
||||
}
|
||||
.padding(.top, 20)
|
||||
|
||||
Spacer(minLength: 0)
|
||||
})/// 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,onButtonClick: {
|
||||
print(otpText)
|
||||
Task {
|
||||
dismiss()
|
||||
// try? await Task.sleep(for: .seconds(0))
|
||||
/// Showing the Reset View
|
||||
showResetView = true
|
||||
}
|
||||
})
|
||||
.presentationDetents([.height(350)])
|
||||
.presentationCornerRadius(30)
|
||||
} else {
|
||||
if #available(iOS 16.0, *) {
|
||||
OTPView(otpText: $otpText,onButtonClick: {
|
||||
print(otpText)
|
||||
Task {
|
||||
dismiss()
|
||||
// try? await Task.sleep(for: .seconds(0))
|
||||
/// Showing the Reset View
|
||||
showResetView = true
|
||||
}
|
||||
}).presentationDetents([.height(350)])
|
||||
} else {
|
||||
OTPView(otpText: $otpText,onButtonClick: {
|
||||
print(otpText)
|
||||
Task {
|
||||
dismiss()
|
||||
// try? await Task.sleep(for: .seconds(0))
|
||||
/// Showing the Reset View
|
||||
showResetView = true
|
||||
}
|
||||
})
|
||||
// Fallback on earlier versions
|
||||
}
|
||||
}
|
||||
})
|
||||
.padding(.vertical, 15)
|
||||
.padding(.horizontal, 25)
|
||||
/// Since this is going to be a Sheet.
|
||||
.interactiveDismissDisabled()
|
||||
}
|
||||
|
||||
|
||||
|
||||
@MainActor
|
||||
public func sendemail(email: String) async {
|
||||
|
||||
isLoading = true
|
||||
errorMessage = nil
|
||||
|
||||
|
||||
let userInfoUrl = URL(string: "\(UserManager.shared.baseURL())passport/comm/sendEmailVerify?email=\(email)&recaptcha_data=")!
|
||||
var request = URLRequest(url: userInfoUrl)
|
||||
request.httpMethod = "POST"
|
||||
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
|
||||
request.addValue(UserManager.shared.getAutoData(), forHTTPHeaderField: "Authorization")
|
||||
|
||||
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 user info response
|
||||
if let message = try? JSONDecoder().decode(MessageResponse.self, from: data) {
|
||||
dump(message)
|
||||
if let _ = message.errors{
|
||||
self.errorMessage = message.message
|
||||
}else{
|
||||
askOTP.toggle()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
task.resume()
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user