feat(h5-auth): restore partner and shop WeChat login

Re-enable one-tap WeChat login, post-SMS OAuth bind, and quick login gates so partner/shop openId flows work again on staging.
This commit is contained in:
2026-08-02 11:59:23 +08:00
parent 09e732bfa3
commit 3fc2f23e10
5 changed files with 402 additions and 11 deletions
@@ -7,6 +7,8 @@ import {
useState,
type ReactNode,
} from 'react';
import { stripOAuthParamsFromLocation } from '@dukang/weixin-sdk';
import { isWxAuthorizeEnabled } from '@dukang/shared-types';
import {
clearAuth,
ensureSession,
@@ -14,6 +16,12 @@ import {
type ShopSessionPayload,
type StoreSessionStore,
} from '../lib/api';
import {
fetchClientConfig,
handleShopWechatCallback,
handleShopWechatLoginResult,
} from '../lib/wechat-auth';
import { isWechatEnv } from '../lib/weixin';
type StoreSessionContextValue = {
ready: boolean;
@@ -26,6 +34,12 @@ type StoreSessionContextValue = {
const StoreSessionContext = createContext<StoreSessionContextValue | null>(null);
function deriveSelectStore(session: ShopSessionPayload, nextStore: StoreSessionStore | null) {
const storeId = nextStore?.storeId || session.selectedStoreId || '';
const stores = session.stores ?? nextStore?.stores ?? [];
return stores.length > 1 && !storeId;
}
export function StoreSessionProvider({ children }: { children: ReactNode }) {
const [ready, setReady] = useState(false);
const [authenticated, setAuthenticated] = useState(false);
@@ -43,9 +57,7 @@ export function StoreSessionProvider({ children }: { children: ReactNode }) {
}
: null;
setStore(nextStore);
const storeId = nextStore?.storeId || session.selectedStoreId || '';
const stores = session.stores ?? nextStore?.stores ?? [];
setNeedsSelectStore(stores.length > 1 && !storeId);
setNeedsSelectStore(deriveSelectStore(session, nextStore));
}, []);
const resetSession = useCallback(() => {
@@ -59,6 +71,23 @@ export function StoreSessionProvider({ children }: { children: ReactNode }) {
let cancelled = false;
(async () => {
try {
const params = new URLSearchParams(window.location.search);
if (isWechatEnv() && params.get('code')) {
try {
const config = await fetchClientConfig();
if (isWxAuthorizeEnabled(config)) {
const result = await handleShopWechatCallback();
if (result && !cancelled) {
const session = handleShopWechatLoginResult(result);
if (session) applySession(session);
}
stripOAuthParamsFromLocation();
}
} catch {
stripOAuthParamsFromLocation();
}
}
const result = await ensureSession();
if (cancelled) return;
setAuthenticated(result.authenticated);
@@ -73,7 +102,7 @@ export function StoreSessionProvider({ children }: { children: ReactNode }) {
return () => {
cancelled = true;
};
}, [resetSession]);
}, [applySession, resetSession]);
const value = useMemo(
() => ({ ready, authenticated, needsSelectStore, store, applySession, resetSession }),