Files
QuestionProject/hy_qa_asset_backend/frontend/components/h5/MockAuthPanel.tsx
2026-07-05 19:48:32 +08:00

103 lines
3.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use client";
import { LogIn, MessageCircle, ShieldCheck, UserPlus, X } from "lucide-react";
import { buildWechatOAuthUrl, getWechatAuthConfig, isWechatBrowser } from "@/lib/wechatAuth";
export type MockUser = {
name: string;
phone: string;
mode: "login" | "register" | "wechat";
};
export default function MockAuthPanel({
open,
user,
onClose,
onMockLogin,
onWechatMockLogin,
onLogout
}: {
open: boolean;
user: MockUser | null;
onClose: () => void;
onMockLogin: (mode: MockUser["mode"]) => void;
onWechatMockLogin: () => void;
onLogout: () => void;
}) {
if (!open) return null;
const wechatConfig = getWechatAuthConfig();
const inWechat = typeof navigator !== "undefined" && isWechatBrowser(navigator.userAgent);
function startWechatAuth() {
if (wechatConfig) {
window.location.href = buildWechatOAuthUrl(wechatConfig);
return;
}
onWechatMockLogin();
}
return (
<div className="absolute inset-0 z-30 flex items-end bg-slate-950/35 px-3 pb-3">
<section className="w-full rounded-t-[18px] rounded-b-md bg-white p-4 shadow-2xl">
<div className="mb-4 flex items-center justify-between">
<div>
<h2 className="text-lg font-semibold text-ink"></h2>
<p className="mt-1 text-sm text-slate-500">使</p>
</div>
<button onClick={onClose} className="flex h-9 w-9 items-center justify-center rounded-md hover:bg-slate-100" aria-label="关闭">
<X className="h-5 w-5" aria-hidden />
</button>
</div>
{user ? (
<div className="rounded-md border border-line bg-panel p-3">
<div className="flex items-center gap-3">
<div className="flex h-10 w-10 items-center justify-center rounded-md bg-jade text-white">
<ShieldCheck className="h-5 w-5" aria-hidden />
</div>
<div>
<div className="font-medium text-ink">{user.name}</div>
<div className="text-sm text-slate-500">{user.phone}</div>
</div>
</div>
<button onClick={onLogout} className="mt-3 h-10 w-full rounded-md border border-line text-sm font-medium hover:bg-white">
退 mock
</button>
</div>
) : (
<div className="grid gap-3">
<button
onClick={startWechatAuth}
className="flex h-11 items-center justify-center gap-2 rounded-md bg-jade text-sm font-medium text-white hover:bg-teal-800"
>
<MessageCircle className="h-4 w-4" aria-hidden />
{wechatConfig ? "微信授权登录" : "微信授权演示"}
</button>
<button
onClick={() => onMockLogin("login")}
className="flex h-11 items-center justify-center gap-2 rounded-md border border-line text-sm font-medium text-ink hover:bg-slate-50"
>
<LogIn className="h-4 w-4" aria-hidden />
mock
</button>
<button
onClick={() => onMockLogin("register")}
className="flex h-11 items-center justify-center gap-2 rounded-md border border-line text-sm font-medium text-ink hover:bg-slate-50"
>
<UserPlus className="h-4 w-4" aria-hidden />
mock
</button>
</div>
)}
<div className="mt-4 rounded-md bg-amber-50 px-3 py-2 text-xs leading-5 text-amber-800">
{wechatConfig
? `已配置微信 OAuth${inWechat ? ",当前在微信内置浏览器中。" : "。如果不在微信内打开,授权页可能无法完成。"}`
: "尚未配置 NEXT_PUBLIC_WECHAT_APP_ID当前按钮只模拟微信授权不写入后端。"}
</div>
</section>
</div>
);
}