fix: reset the header and return home when a customer logs out (#21)
Logging out destroyed the server session and navigated home, but never told CustomerAuthContext, so `customer` stayed in React state and the header kept offering "My Account" instead of "Log in" and "Sign up". A reload appeared to fix it, because fetchMe then returned null, which is why the symptom looked intermittent. The cart badge had the same cause: CartContext only clears its items once `customer` goes null. Logout now lives on the auth context, which clears `customer` itself rather than triggering a refetch — a refetch would leave a window where the session is gone but the UI still shows the customer signed in. logoutCustomer also ignored res.ok. A failed logout leaves the session cookie valid, so reporting success signed the customer back in on their next reload. It now rejects, and the account page reports the failure and stays put instead of pretending. Logout is not routed through handle() because the endpoint answers 204 with no body. Navigation uses replace, so Back no longer returns to the account page, which would only bounce to /login now the session is gone. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -49,7 +49,16 @@ export function verifyEmail(token: string): Promise<{ status: string }> {
|
||||
}
|
||||
|
||||
export function logoutCustomer(): Promise<void> {
|
||||
return fetch('/api/customers/logout', { method: 'POST' }).then(() => undefined);
|
||||
// Not routed through handle(): logout answers 204 with no body, so parsing
|
||||
// JSON would throw on success. The failure case still has to reject — the
|
||||
// session cookie survives a failed logout, so reporting success would leave
|
||||
// the customer logged in and silently signed back in on their next reload.
|
||||
return fetch('/api/customers/logout', { method: 'POST' }).then(async (res) => {
|
||||
if (!res.ok) {
|
||||
const data = await res.json().catch(() => ({}));
|
||||
throw new Error(data.error || 'Request failed');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function fetchMe(): Promise<Customer | null> {
|
||||
|
||||
Reference in New Issue
Block a user