interface JWTPayload { fresh: boolean iat: number jti: string type: string sub: string nbf: number csrf: string exp: number roles: string[] } export function decodeJWT(token: string): JWTPayload | null { try { // JWT tem 3 partes separadas por pontos: header.payload.signature const parts = token.split(".") if (parts.length !== 3) { return null } // Decodificar a parte do payload (segunda parte) const payload = parts[1] // Adicionar padding se necessário para base64 const paddedPayload = payload + "=".repeat((4 - (payload.length % 4)) % 4) // Decodificar de base64 const decodedPayload = atob(paddedPayload) // Parse do JSON const parsedPayload: JWTPayload = JSON.parse(decodedPayload) return parsedPayload } catch (error) { console.error("Erro ao decodificar JWT:", error) return null } } export function getUserRoles(): string[] { try { const token = localStorage.getItem("access_token") if (!token) { return [] } const payload = decodeJWT(token) return payload?.roles || [] } catch (error) { console.error("Erro ao obter roles do usuário:", error) return [] } } export function hasRole(role: string): boolean { const roles = getUserRoles() return roles.includes(role) } export function isAdmin(): boolean { return hasRole("admin") } export function getCurrentUserEmail(): string | null { try { const token = localStorage.getItem("access_token") if (!token) { return null } const payload = decodeJWT(token) return payload?.sub || null } catch (error) { console.error("Erro ao obter email do usuário:", error) return null } } export function isTokenExpired(): boolean { try { const token = localStorage.getItem("access_token") if (!token) { return true } const payload = decodeJWT(token) if (!payload) { return true } // exp está em segundos, Date.now() está em milissegundos const currentTime = Math.floor(Date.now() / 1000) return payload.exp < currentTime } catch (error) { console.error("Erro ao verificar expiração do token:", error) return true } }