fix:登录跳转失败问题

This commit is contained in:
ljy
2026-07-10 01:54:23 +08:00
parent e770c98de7
commit d66fd9099f
7 changed files with 88 additions and 28 deletions
+32 -14
View File
@@ -1,13 +1,13 @@
import { useEffect, useState } from 'react';
import { Link, useNavigate, useSearchParams } from 'react-router-dom';
import { request, getLastPhone, getPartnerProfile, saveAuth } from '../lib/api';
import { request, getLastPhone, getPartnerProfile, type PartnerAuthPayload } from '../lib/api';
import { usePartnerSession } from '../contexts/PartnerSessionContext';
import type { PartnerAccount } from '../contexts/PartnerSessionContext';
import { partnerHomePath } from '../lib/partnerAccess';
import type { PartnerMe } from '@dukang/shared-types';
import {
fetchClientConfig,
handlePartnerWechatCallback,
handlePartnerWechatLoginResult,
loginPartnerWithWechat,
} from '../lib/wechat-auth';
import { isWechatEnv } from '../lib/weixin';
@@ -43,9 +43,21 @@ function formatPartnerError(e: unknown): string {
return text;
}
function toLoginSession(data: { accessToken: string; partner?: PartnerMe }): PartnerAuthPayload {
return {
accessToken: data.accessToken,
partner: data.partner,
};
}
function toPartnerAccount(partner?: Record<string, unknown>): PartnerAccount | undefined {
if (!partner || typeof partner.id !== 'string') return undefined;
return partner as unknown as PartnerAccount;
}
export default function LoginPage() {
const navigate = useNavigate();
const { refresh } = usePartnerSession();
const { applySession } = usePartnerSession();
const [params] = useSearchParams();
const quick = params.get('quick') === '1';
const savedProfile = getPartnerProfile();
@@ -73,14 +85,17 @@ export default function LoginPage() {
useEffect(() => {
if (!isWechatEnv() || !wxAuthorize || !params.get('code')) return;
void handlePartnerWechatCallback()
.then(async (result) => {
if (!result) return;
if (!handlePartnerWechatLoginResult(result)) return;
const account = await refresh();
navigate(partnerHomePath(account ?? undefined));
.then((result) => {
if (!result?.accessToken) return;
const session: PartnerAuthPayload = {
accessToken: result.accessToken,
partner: toPartnerAccount(result.partner),
};
applySession(session);
navigate(partnerHomePath(session.partner), { replace: true });
})
.catch((e) => setMsg(formatWechatError(e)));
}, [navigate, refresh, wxAuthorize, params]);
}, [applySession, navigate, wxAuthorize, params]);
function formatWechatError(e: unknown): string {
const text = e instanceof Error ? e.message : '微信登录失败';
@@ -155,10 +170,10 @@ export default function LoginPage() {
body: JSON.stringify({ phone: loginPhone, code }),
silent: true,
});
saveAuth(data);
const session = toLoginSession(data);
applySession(session);
persistRememberAccount(loginPhone);
const account = await refresh();
navigate(partnerHomePath(account ?? data.partner));
navigate(partnerHomePath(session.partner), { replace: true });
} catch (e) {
setMsg(formatPartnerError(e));
} finally {
@@ -177,8 +192,11 @@ export default function LoginPage() {
try {
const ok = await loginPartnerWithWechat();
if (ok) {
const account = await refresh();
navigate(partnerHomePath(account ?? undefined));
applySession({
accessToken: localStorage.getItem('accessToken') ?? '',
partner: getPartnerProfile() ?? undefined,
});
navigate(partnerHomePath(getPartnerProfile()), { replace: true });
}
} catch (e) {
setMsg(formatWechatError(e));