@@ -4,6 +4,7 @@ import { createRequestId } from '../utils/requestId'
44import { isAuthRoutePath } from '../utils/navigation'
55import { isDemoMode } from '../utils/demoMode'
66import * as tokenStorage from '../utils/tokenStorage'
7+ import { logError , logWarn } from '../utils/errorReporting'
78import {
89 MAX_RETRIES ,
910 computeRetryDelay ,
@@ -51,7 +52,16 @@ http.interceptors.response.use(
5152 ( response ) => response ,
5253 ( error ) => {
5354 if ( error . response ) {
54- console . error ( 'API Error:' , error . response . data )
55+ // Log only safe, non-sensitive details -- never the full error object,
56+ // which includes error.config.headers (Authorization: Bearer ...).
57+ const safeDetails = {
58+ status : error . response ?. status ,
59+ statusText : error . response ?. statusText ,
60+ data : error . response ?. data ,
61+ url : error . config ?. url ,
62+ method : error . config ?. method ,
63+ }
64+ logError ( 'API Error:' , safeDetails )
5565
5666 // Handle 401 - clear session and redirect to login (skip in demo mode).
5767 // Callers can set `skipAuth401` on the request config to suppress this
@@ -66,9 +76,9 @@ http.interceptors.response.use(
6676 }
6777 }
6878 } else if ( error . request ) {
69- console . error ( 'Network Error:' , error . message )
79+ logError ( 'Network Error:' , { message : error . message } )
7080 } else {
71- console . error ( 'Error:' , error . message )
81+ logError ( 'Error:' , { message : error . message } )
7282 }
7383 return Promise . reject ( error )
7484 }
@@ -108,7 +118,7 @@ http.interceptors.response.use(
108118 const delay = computeRetryDelay ( error , attempt )
109119 if ( import . meta. env . DEV ) {
110120 const status = error . response ?. status ?? 'network'
111- console . warn (
121+ logWarn (
112122 `[http] retry ${ attempt } /${ MAX_RETRIES } for ${ config . method ?. toUpperCase ( ) } ${ config . url } ` +
113123 `after ${ delay } ms (status=${ status } )` ,
114124 )
0 commit comments