Implemented comprehensive JWT-based authentication with token refresh mechanism, user state management, and protected routes. Changes: - Upgraded API client from fetch to Axios with automatic token refresh interceptors - Created API configuration with centralized endpoint definitions - Implemented Zustand auth store for user state management with persistence - Created React Query hooks for login, register, logout, and current user - Built login and registration pages with form validation (Zod + React Hook Form) - Implemented AuthGuard component for route protection - Enhanced Header with user dropdown menu and logout functionality - Updated Sidebar with user information display at bottom - Added Team navigation item to sidebar - Configured environment variables for API base URL Technical Details: - JWT token storage in localStorage with secure key names - Automatic token refresh on 401 responses - Request queueing during token refresh to prevent race conditions - TypeScript strict typing throughout - ESLint compliant code (fixed type safety issues) - Proper error handling with user-friendly messages 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
24 lines
700 B
TypeScript
24 lines
700 B
TypeScript
export const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:5000';
|
|
|
|
export const API_ENDPOINTS = {
|
|
// Auth
|
|
LOGIN: '/api/auth/login',
|
|
REGISTER_TENANT: '/api/auth/register-tenant',
|
|
REFRESH_TOKEN: '/api/auth/refresh',
|
|
LOGOUT: '/api/auth/logout',
|
|
ME: '/api/auth/me',
|
|
|
|
// Users
|
|
USERS: '/api/users',
|
|
USER_PROFILE: (userId: string) => `/api/users/${userId}`,
|
|
|
|
// Tenants
|
|
TENANT_USERS: (tenantId: string) => `/api/tenants/${tenantId}/users`,
|
|
ASSIGN_ROLE: (tenantId: string, userId: string) =>
|
|
`/api/tenants/${tenantId}/users/${userId}/role`,
|
|
|
|
// Projects (to be implemented)
|
|
PROJECTS: '/api/projects',
|
|
PROJECT: (id: string) => `/api/projects/${id}`,
|
|
};
|