Merge pull request #36 from rede5/codex/fix-errors-in-background.js

Gate marketplace logs behind logger utility
This commit is contained in:
Tiago Yamamoto 2025-12-22 17:52:31 -03:00 committed by GitHub
commit 6719ec6298
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 46 additions and 18 deletions

View file

@ -2,6 +2,7 @@ import { FormEvent, useState } from 'react'
import axios from 'axios' import axios from 'axios'
import { useAuth, UserRole } from '../context/AuthContext' import { useAuth, UserRole } from '../context/AuthContext'
import { authService } from '../services/auth' import { authService } from '../services/auth'
import { logger } from '../utils/logger'
import { decodeJwtPayload } from '../utils/jwt' import { decodeJwtPayload } from '../utils/jwt'
// Eye icon components for password visibility toggle // Eye icon components for password visibility toggle
@ -27,7 +28,7 @@ export function LoginPage() {
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
const resolveRole = (role?: string): UserRole => { const resolveRole = (role?: string): UserRole => {
console.log('🔐 [Login] Resolving role:', role) logger.info('🔐 [Login] Resolving role:', role)
switch (role?.toLowerCase()) { switch (role?.toLowerCase()) {
case 'admin': case 'admin':
return 'admin' return 'admin'
@ -42,7 +43,7 @@ export function LoginPage() {
case 'seller': // keep legacy case 'seller': // keep legacy
default: default:
// Default to seller/owner or log warning? // Default to seller/owner or log warning?
console.warn('⚠️ [Login] Unknown role, defaulting to seller:', role) logger.warn('⚠️ [Login] Unknown role, defaulting to seller:', role)
return 'seller' return 'seller'
} }
} }
@ -52,37 +53,37 @@ export function LoginPage() {
setLoading(true) setLoading(true)
setErrorMessage(null) setErrorMessage(null)
console.log('🔐 [Login] Attempting login with username:', username) logger.info('🔐 [Login] Attempting login with username:', username)
try { try {
console.log('🔐 [Login] Calling authService.login...') logger.info('🔐 [Login] Calling authService.login...')
const response = await authService.login({ username, password }) const response = await authService.login({ username, password })
console.log('🔐 [Login] Response received:', response) logger.info('🔐 [Login] Response received:', response)
const { token } = response const { token } = response
console.log('🔐 [Login] Token extracted:', token ? `${token.substring(0, 50)}...` : 'NULL/UNDEFINED') logger.debug('🔐 [Login] Token extracted:', token ? `${token.substring(0, 50)}...` : 'NULL/UNDEFINED')
if (!token) { if (!token) {
console.error('🔐 [Login] ERROR: Token is null or undefined!') logger.error('🔐 [Login] ERROR: Token is null or undefined!')
throw new Error('Resposta de login inválida. Verifique o usuário e a senha.') throw new Error('Resposta de login inválida. Verifique o usuário e a senha.')
} }
const payload = decodeJwtPayload<{ role?: string, sub: string }>(token) const payload = decodeJwtPayload<{ role?: string, sub: string }>(token)
console.log('🔐 [Login] JWT payload decoded:', payload) logger.debug('🔐 [Login] JWT payload decoded:', payload)
const role = resolveRole(payload?.role) const role = resolveRole(payload?.role)
console.log('🔐 [Login] Role resolved:', role) logger.info('🔐 [Login] Role resolved:', role)
login(token, role, username, payload?.sub || '', undefined, username) login(token, role, username, payload?.sub || '', undefined, username)
console.log('🔐 [Login] Login successful!') logger.info('🔐 [Login] Login successful!')
} catch (error) { } catch (error) {
console.error('🔐 [Login] ERROR caught:', error) logger.error('🔐 [Login] ERROR caught:', error)
const fallback = 'Não foi possível autenticar. Verifique suas credenciais.' const fallback = 'Não foi possível autenticar. Verifique suas credenciais.'
if (axios.isAxiosError(error)) { if (axios.isAxiosError(error)) {
console.error('🔐 [Login] Axios error response:', error.response?.data) logger.error('🔐 [Login] Axios error response:', error.response?.data)
setErrorMessage(error.response?.data?.error ?? fallback) setErrorMessage(error.response?.data?.error ?? fallback)
} else if (error instanceof Error) { } else if (error instanceof Error) {
console.error('🔐 [Login] Error message:', error.message) logger.error('🔐 [Login] Error message:', error.message)
setErrorMessage(error.message) setErrorMessage(error.message)
} else { } else {
setErrorMessage(fallback) setErrorMessage(fallback)

View file

@ -1,8 +1,9 @@
import axios from 'axios' import axios from 'axios'
import { logger } from '../utils/logger'
// Use VITE_API_URL if set, fallback to /api for local development proxy // Use VITE_API_URL if set, fallback to /api for local development proxy
const apiBaseUrl = import.meta.env.VITE_API_URL || '/api' const apiBaseUrl = import.meta.env.VITE_API_URL || '/api'
console.log('🔗 [apiClient] Using API base URL:', apiBaseUrl) logger.info('🔗 [apiClient] Using API base URL:', apiBaseUrl)
const instance = axios.create({ const instance = axios.create({
baseURL: apiBaseUrl, baseURL: apiBaseUrl,
@ -22,7 +23,7 @@ instance.interceptors.response.use(
(response) => response, (response) => response,
(error) => { (error) => {
if (error.response?.status === 401) { if (error.response?.status === 401) {
console.warn('Sessão expirada, por favor, faça login novamente.') logger.warn('Sessão expirada, por favor, faça login novamente.')
} }
return Promise.reject(error) return Promise.reject(error)
} }

View file

@ -1,4 +1,5 @@
import { apiClient } from './apiClient' import { apiClient } from './apiClient'
import { logger } from '../utils/logger'
interface AuthResponse { interface AuthResponse {
token: string token: string
@ -12,13 +13,12 @@ export interface AuthLoginPayload {
export const authService = { export const authService = {
login: async (payload: AuthLoginPayload) => { login: async (payload: AuthLoginPayload) => {
console.log('🔐 [authService] Making request to /v1/auth/login with:', payload) logger.info('🔐 [authService] Making request to /v1/auth/login with:', payload)
const data = await apiClient.post<AuthResponse>('/v1/auth/login', payload) const data = await apiClient.post<AuthResponse>('/v1/auth/login', payload)
console.log('🔐 [authService] Response data:', data) logger.info('🔐 [authService] Response data:', data)
return { token: data.token, expiresAt: data.expires_at } return { token: data.token, expiresAt: data.expires_at }
}, },
logout: async () => { logout: async () => {
await apiClient.post('/v1/auth/logout') await apiClient.post('/v1/auth/logout')
} }
} }

View file

@ -0,0 +1,26 @@
const shouldLog = import.meta.env.DEV || import.meta.env.VITE_ENABLE_LOGS === 'true'
type LogArgs = Parameters<typeof console.log>
export const logger = {
debug: (...args: LogArgs) => {
if (shouldLog) {
console.debug(...args)
}
},
info: (...args: LogArgs) => {
if (shouldLog) {
console.info(...args)
}
},
warn: (...args: LogArgs) => {
if (shouldLog) {
console.warn(...args)
}
},
error: (...args: LogArgs) => {
if (shouldLog) {
console.error(...args)
}
}
}