fix:登录跳转失败问题
This commit is contained in:
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user