Vitron-Front/app/utils/api-error-handler.ts
fazli 0b18438a97 fix(notif+auth): camelCase badge fields, seller push prompt, only 401 signs out
- app/components/MyLayout.tsx / app/components/home/HomePageTopBar.tsx /
  app/routes/profile._index.tsx: the BadgeCounts type was declared with
  snake_case fields (order_updates, seller_orders) while the API's global
  camelCase renderer sends orderUpdates / sellerOrders on the wire — every
  read went to undefined, so the "buyer activity" dot on the profile icon
  and the order-badge on the store dashboard were silently stuck at 0.
  Fixed by renaming the interface to match the wire and adding sellerChat
  (per-store roll-up) so the store dashboard sidebar reads
  badges.sellerChat[storeId] instead of the buyer-side chat count.
- app/hooks/useBadgeCounts.ts: interface + EMPTY constant updated to
  camelCase + new sellerChat map.
- app/utils/api-error-handler.ts: 403 no longer force-redirects to /logout.
  It used to force-log-out on ANY 403/401, so an approved-but-unbadged
  owner (Ehsan / Noelabel) whose store dashboard fired the Instagram-tab
  query got a 403 → forced logout → the store page vanished mid-load
  and the seller landed on the home screen convinced they'd been kicked
  off their own store. Only 401 signs the session out now.
- app/components/store/StorePushPromptCard.tsx: new dashboard-level card
  that nudges the store owner/staff to enable browser push. Unlike the
  global buyer banner it's not dismissible-forever; "بعداً یادآوری کن"
  hides for 24h and it comes back until the user actually subscribes.
  Handles the permission="denied" path with an in-browser-settings hint.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-18 13:18:08 +00:00

32 lines
937 B
TypeScript

/**
* API Error Handler Middleware
*
* Logs the user out on 401 (auth is invalid). Does NOT log out on 403 —
* that's an authorization/permission failure for an authenticated user
* (e.g. a seller endpoint that requires `is_verified`), so kicking the
* session out is wrong and used to silently sign users out of their own
* store dashboard.
*/
import type { Middleware } from "../../src/api/types/runtime";
export const createAuthErrorMiddleware = (): Middleware => ({
post: async (context) => {
const response = context.response;
if (response.status === 401) {
console.warn("[API Error Handler] 401 Unauthorized — logging out user");
if (typeof window !== "undefined") {
window.location.href = "/logout";
}
}
return response;
},
onError: async (context) => {
console.error("[API Error Handler] Request failed:", context.error);
return context.response;
},
});