diff --git a/src/browser/manager.ts b/src/browser/manager.ts index 6e3968e..9d3122e 100644 --- a/src/browser/manager.ts +++ b/src/browser/manager.ts @@ -193,6 +193,21 @@ export class BrowserManager { logger.debug({ platform }, 'Cookies saved'); } + /** + * Close and discard the browser context for a platform so the next + * operation creates a fresh one (without any cookies or storage). + */ + async clearContext(platform: string): Promise { + const ctx = this.contexts.get(platform); + if (!ctx) return; + + this.contexts.delete(platform); + await ctx.close().catch((err: unknown) => { + logger.warn({ err, platform }, 'Error closing context during clearContext'); + }); + logger.info({ platform }, 'Browser context cleared'); + } + /** * Wait for every in-flight platform queue to settle. Useful during * graceful shutdown so that running operations finish before teardown. diff --git a/src/platforms/xiaohongshu/login.ts b/src/platforms/xiaohongshu/login.ts index f918e98..3c94a5e 100644 --- a/src/platforms/xiaohongshu/login.ts +++ b/src/platforms/xiaohongshu/login.ts @@ -140,15 +140,13 @@ export async function getLoginQRCode( // --------------------------------------------------------------------------- /** - * Delete persisted cookies for the Xiaohongshu platform. - * - * @param _browser - The shared BrowserManager instance (unused for now but - * passed for consistency; a future version may also clear - * the in-memory browser context). + * Delete persisted cookies and clear the in-memory browser context so the + * next operation starts with a clean session. */ -export async function deleteCookies(_browser: BrowserManager): Promise { +export async function deleteCookies(browser: BrowserManager): Promise { await cookieStore.delete(PLATFORM); - log.info('Xiaohongshu cookies deleted'); + await browser.clearContext(PLATFORM); + log.info('Xiaohongshu cookies deleted and browser context cleared'); } // --------------------------------------------------------------------------- diff --git a/web/src/hooks/useLoginStatus.ts b/web/src/hooks/useLoginStatus.ts index e028f82..5f43fa9 100644 --- a/web/src/hooks/useLoginStatus.ts +++ b/web/src/hooks/useLoginStatus.ts @@ -34,5 +34,11 @@ export function useLoginStatus(options: { auto?: boolean; intervalMs?: number } } }, [refresh, auto, intervalMs]); - return { status, error, loading, refresh }; + const reset = useCallback(() => { + setStatus(null); + setError(null); + setLoading(false); + }, []); + + return { status, error, loading, refresh, reset }; } diff --git a/web/src/pages/LoginPage.tsx b/web/src/pages/LoginPage.tsx index c14af8b..7965fbc 100644 --- a/web/src/pages/LoginPage.tsx +++ b/web/src/pages/LoginPage.tsx @@ -10,7 +10,7 @@ import { useToast } from '@/context/ToastContext'; import { getLoginQRCode, deleteCookies, checkLoginCookie } from '@/api/endpoints'; export function LoginPage() { - const { status, loading: statusLoading, refresh: refreshStatus } = useLoginStatus(); + const { status, loading: statusLoading, refresh: refreshStatus, reset: resetStatus } = useLoginStatus(); const { token } = useAuth(); const { toast } = useToast(); @@ -96,7 +96,7 @@ export function LoginPage() { const res = await deleteCookies(); if (res.success) { toast('success', '已成功登出'); - void refreshStatus(); + resetStatus(); } else { toast('error', res.error?.message || '登出失败'); }