mirror of
https://github.com/easychen/pushdeer.git
synced 2024-11-17 07:49:22 +08:00
103 lines
2.8 KiB
Swift
103 lines
2.8 KiB
Swift
//
|
|
// LoginView.swift
|
|
// PushDeer
|
|
//
|
|
// Created by HEXT on 2021/12/25.
|
|
//
|
|
|
|
import SwiftUI
|
|
import AuthenticationServices
|
|
|
|
/// 登录界面
|
|
struct LoginView: View {
|
|
|
|
@EnvironmentObject private var store: AppState
|
|
@State private var showLoading = false
|
|
|
|
var body: some View {
|
|
VStack{
|
|
Spacer()
|
|
Image("logo.with.space")
|
|
.resizable()
|
|
.scaledToFit()
|
|
if Env.isSelfHosted {
|
|
Button("重置API endpoint") {
|
|
store.api_endpoint = ""
|
|
}
|
|
}
|
|
Spacer()
|
|
if showLoading {
|
|
ProgressView()
|
|
.scaleEffect(1.5)
|
|
.frame(height: 64)
|
|
} else {
|
|
// 苹果登录按钮
|
|
AppleSignInButton(
|
|
onRequest: { request in
|
|
request.requestedScopes = [.fullName, .email]
|
|
},
|
|
onCompletion: { result in
|
|
do {
|
|
showLoading = true
|
|
store.token = try await store.appleIdLogin(result).token
|
|
// 获取成功去主页
|
|
// 登录成功后的处理
|
|
store.loginAfter()
|
|
} catch {
|
|
showLoading = false
|
|
if (error as NSError).code == 1001 {
|
|
// 取消登录
|
|
HToast.showWarning(error.localizedDescription)
|
|
return
|
|
}
|
|
HToast.showError(error.localizedDescription)
|
|
}
|
|
}
|
|
)
|
|
.overlay(RoundedRectangle(cornerRadius: 6).stroke(Color.white))
|
|
.frame(maxWidth: 375, minHeight: 64, maxHeight: 64)
|
|
.padding()
|
|
|
|
#if !targetEnvironment(macCatalyst) && !APPCLIP && !SELFHOSTED
|
|
if WXApi.isWXAppInstalled() {
|
|
// 微信登录按钮
|
|
Button {
|
|
let req = SendAuthReq()
|
|
req.scope = "snsapi_userinfo";
|
|
req.state = "login";
|
|
WXApi.send(req) { b in
|
|
print("WXApi.send:", b)
|
|
}
|
|
// 微信登录请求发出去后面的逻辑在 AppDelegate 的 onResp 回调方法中处理
|
|
} label: {
|
|
HStack {
|
|
Image("weixin-login")
|
|
.resizable()
|
|
.renderingMode(.template)
|
|
.scaledToFit()
|
|
.frame(height:20)
|
|
Text("通过微信登录")
|
|
}
|
|
.font(.system(size: 26, weight: .semibold))
|
|
.foregroundColor(Color("weixinFgColor"))
|
|
.frame(maxWidth: 375, minHeight: 64, maxHeight: 64)
|
|
}
|
|
.background(Color("weixinBgColor"))
|
|
.cornerRadius(6)
|
|
.overlay(RoundedRectangle(cornerRadius: 6).stroke(Color("weixinFgColor")))
|
|
.padding()
|
|
}
|
|
#endif
|
|
}
|
|
Spacer()
|
|
}
|
|
.padding()
|
|
}
|
|
}
|
|
|
|
struct LoginView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
LoginView()
|
|
}
|
|
}
|