门店账户多账号

This commit is contained in:
2026-07-12 12:24:34 +08:00
parent 06b1cb22e0
commit 54a15d6da7
39 changed files with 1962 additions and 311 deletions
@@ -18,6 +18,7 @@ import {
type StoreSessionContextValue = {
ready: boolean;
authenticated: boolean;
needsSelectStore: boolean;
store: StoreSessionStore | null;
applySession: (session: ShopSessionPayload) => void;
resetSession: () => void;
@@ -28,17 +29,29 @@ const StoreSessionContext = createContext<StoreSessionContextValue | null>(null)
export function StoreSessionProvider({ children }: { children: ReactNode }) {
const [ready, setReady] = useState(false);
const [authenticated, setAuthenticated] = useState(false);
const [needsSelectStore, setNeedsSelectStore] = useState(false);
const [store, setStore] = useState<StoreSessionStore | null>(null);
const applySession = useCallback((session: ShopSessionPayload) => {
saveAuth(session);
setAuthenticated(true);
if (session.store) setStore(session.store);
const nextStore = session.store
? {
...session.store,
stores: session.stores ?? session.store.stores,
isPrimary: session.account?.isPrimary ?? session.store.isPrimary,
}
: null;
setStore(nextStore);
const storeId = nextStore?.storeId || session.selectedStoreId || '';
const stores = session.stores ?? nextStore?.stores ?? [];
setNeedsSelectStore(stores.length > 1 && !storeId);
}, []);
const resetSession = useCallback(() => {
clearAuth();
setAuthenticated(false);
setNeedsSelectStore(false);
setStore(null);
}, []);
@@ -50,6 +63,7 @@ export function StoreSessionProvider({ children }: { children: ReactNode }) {
if (cancelled) return;
setAuthenticated(result.authenticated);
setStore(result.store);
setNeedsSelectStore(result.needsSelectStore);
} catch {
if (!cancelled) resetSession();
} finally {
@@ -62,8 +76,8 @@ export function StoreSessionProvider({ children }: { children: ReactNode }) {
}, [resetSession]);
const value = useMemo(
() => ({ ready, authenticated, store, applySession, resetSession }),
[ready, authenticated, store, applySession, resetSession],
() => ({ ready, authenticated, needsSelectStore, store, applySession, resetSession }),
[ready, authenticated, needsSelectStore, store, applySession, resetSession],
);
return <StoreSessionContext.Provider value={value}>{children}</StoreSessionContext.Provider>;