cc0c0a6ef8
同城 MANUAL/ZZXFX 按小飞侠价规计费,路由查询回退仓配凭证;HQ 配送单补商品、用户和收货地址。门店核销回跳与小程序核销码一并带上。 Co-authored-by: Cursor <cursoragent@cursor.com>
42 lines
1.5 KiB
TypeScript
42 lines
1.5 KiB
TypeScript
import { Navigate, useLocation } from 'react-router-dom';
|
|
import { getStoreProfile, hasShopWxSession } from '../lib/api';
|
|
import { useStoreSession } from '../contexts/StoreSessionContext';
|
|
import { peekShopReturnTo, rememberShopReturnPath } from '../lib/shop-redeem-return';
|
|
|
|
const PUBLIC_PATHS = new Set(['/login', '/legal/user-agreement', '/legal/privacy-policy']);
|
|
const SELECT_STORE_PATH = '/select-store';
|
|
|
|
export default function AuthGate({ children }: { children: React.ReactNode }) {
|
|
const { ready, authenticated, needsSelectStore } = useStoreSession();
|
|
const location = useLocation();
|
|
|
|
if (!ready) {
|
|
return (
|
|
<div className="session-boot">
|
|
<p className="session-boot-text">加载中…</p>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (authenticated && location.pathname === '/login') {
|
|
const next = needsSelectStore ? SELECT_STORE_PATH : (peekShopReturnTo() || '/');
|
|
return <Navigate to={next} replace />;
|
|
}
|
|
|
|
if (authenticated && needsSelectStore && location.pathname !== SELECT_STORE_PATH) {
|
|
rememberShopReturnPath(location);
|
|
return <Navigate to={SELECT_STORE_PATH} replace />;
|
|
}
|
|
|
|
if (!authenticated && !PUBLIC_PATHS.has(location.pathname)) {
|
|
rememberShopReturnPath(location);
|
|
const profile = getStoreProfile();
|
|
if (profile && hasShopWxSession() && location.pathname !== '/login') {
|
|
return <Navigate to="/login?quick=1" replace state={{ from: location }} />;
|
|
}
|
|
return <Navigate to="/login" replace state={{ from: location }} />;
|
|
}
|
|
|
|
return <>{children}</>;
|
|
}
|