Fix first-login username flow
这个提交包含在:
@@ -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 (
|
||||
|
||||
在新工单中引用
屏蔽一个用户