export interface JwtPayload { sub?: string role?: string exp?: number iat?: number } export function parseJwtPayload(token: string): JwtPayload { try { const base64Url = token.split('.')[1] const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/') const jsonPayload = decodeURIComponent( atob(base64) .split('') .map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)) .join(''), ) return JSON.parse(jsonPayload) } catch { return {} } } export function isTokenExpired(token: string | null): boolean { if (!token) return true const payload = parseJwtPayload(token) if (payload.exp === undefined || payload.exp === null) return false return payload.exp < Math.floor(Date.now() / 1000) }