Files
SecScore/src/components/OAuth/OAuthCallback.tsx
T
Yukino_fox 21c1183b1d chore: 完成项目多维度优化与功能迭代
本次提交包含多项改进:
1. 新增Vitest测试配置与相关测试用例
2. 完善Deep Link监听与OAuth回调支持
3. 修复并优化多个React组件的依赖与性能
4. 更新后端API域名与端点地址
5. 优化KV存储服务实现与类型定义
6. 调整用户信息展示与权限相关逻辑
7. 重构部分业务逻辑,使用useCallback优化性能
8. 更新依赖包与Cargo.lock依赖版本
2026-07-05 10:28:36 +08:00

70 lines
2.1 KiB
TypeScript

import { useEffect, useState } from "react"
import { useSearchParams, useNavigate } from "react-router-dom"
import { sectlAuth } from "../../services/sectlAuth"
export function OAuthCallback() {
const [searchParams] = useSearchParams()
const navigate = useNavigate()
const [status, setStatus] = useState<"processing" | "success" | "error">("processing")
const [errorMessage, setErrorMessage] = useState<string>("")
useEffect(() => {
const handleCallback = async () => {
const code = searchParams.get("code")
const error = searchParams.get("error")
const errorDescription = searchParams.get("error_description")
if (error) {
setStatus("error")
setErrorMessage(errorDescription || error)
setTimeout(() => navigate("/"), 3000)
return
}
if (code) {
try {
await sectlAuth.exchangeCodeForToken(code)
setStatus("success")
setTimeout(() => navigate("/"), 1500)
} catch (err: any) {
setStatus("error")
setErrorMessage(err.message || "Token 交换失败")
setTimeout(() => navigate("/"), 3000)
}
} else {
setStatus("error")
setErrorMessage("未收到授权码")
setTimeout(() => navigate("/"), 3000)
}
}
handleCallback()
}, [searchParams, navigate])
return (
<div
style={{
display: "flex",
justifyContent: "center",
alignItems: "center",
height: "100vh",
background: "var(--ss-bg-color)",
color: "var(--ss-text-main)",
}}
>
<div style={{ textAlign: "center" }}>
{status === "processing" && <div>正在处理登录...</div>}
{status === "success" && <div>登录成功,正在跳转...</div>}
{status === "error" && (
<div>
<div style={{ color: "#ff4d4f" }}>登录失败</div>
<div style={{ fontSize: "12px", marginTop: "8px", color: "var(--ss-text-secondary)" }}>
{errorMessage}
</div>
</div>
)}
</div>
</div>
)
}