Fix first-login username flow

这个提交包含在:
cryptocommuniums-afk
2026-03-14 22:37:15 +08:00
父节点 8d3faecb15
当前提交 bcdd790d91
修改 3 个文件,包含 40 行新增12 行删除

查看文件

@@ -10,23 +10,41 @@ import { Target, Loader2 } from "lucide-react";
export default function Login() {
const [username, setUsername] = useState("");
const [, setLocation] = useLocation();
const loginMutation = trpc.auth.loginWithUsername.useMutation({
onSuccess: (data) => {
toast.success(data.isNew ? `欢迎加入,${data.user.name}` : `欢迎回来,${data.user.name}`);
setLocation("/dashboard");
},
onError: (err) => {
toast.error("登录失败: " + err.message);
},
});
const utils = trpc.useUtils();
const loginMutation = trpc.auth.loginWithUsername.useMutation();
const handleLogin = (e: React.FormEvent) => {
const syncAuthenticatedUser = async (fallbackUser: Awaited<ReturnType<typeof loginMutation.mutateAsync>>["user"]) => {
// Seed the cache immediately so protected routes do not bounce back to /login.
utils.auth.me.setData(undefined, fallbackUser);
for (let attempt = 0; attempt < 3; attempt++) {
const user = await utils.auth.me.fetch();
if (user) {
utils.auth.me.setData(undefined, user);
return user;
}
await new Promise(resolve => window.setTimeout(resolve, 120 * (attempt + 1)));
}
return fallbackUser;
};
const handleLogin = async (e: React.FormEvent) => {
e.preventDefault();
if (!username.trim()) {
toast.error("请输入用户名");
return;
}
loginMutation.mutate({ username: username.trim() });
try {
const data = await loginMutation.mutateAsync({ username: username.trim() });
const user = await syncAuthenticatedUser(data.user);
toast.success(data.isNew ? `欢迎加入,${user.name}` : `欢迎回来,${user.name}`);
setLocation("/dashboard");
} catch (err) {
const message = err instanceof Error ? err.message : "未知错误";
toast.error("登录失败: " + message);
}
};
return (