# Authentication Views This directory contains Vue 3 authentication views for the Sub2API frontend application. ## Components ### LoginView.vue Login page for existing users to authenticate. **Features:** - Username and password inputs with validation - Remember me checkbox for persistent sessions - Form validation with real-time error display - Loading state during authentication - Error message display for failed login attempts - Redirect to dashboard on successful login - Link to registration page for new users **Usage:** ```vue ``` **Route:** - Path: `/login` - Name: `Login` - Meta: `{ requiresAuth: false }` **Validation Rules:** - Username: Required, minimum 3 characters - Password: Required, minimum 6 characters **Behavior:** - Calls `authStore.login()` with credentials - Shows success toast on successful login - Shows error toast and inline error message on failure - Redirects to `/dashboard` or intended route from query parameter - Redirects authenticated users away from login page ### RegisterView.vue Registration page for new users to create accounts. **Features:** - Username, email, password, and confirm password inputs - Comprehensive form validation - Password strength requirements (8+ characters, letters + numbers) - Email format validation with regex - Password match validation - Loading state during registration - Error message display for failed registration - Redirect to dashboard on success - Link to login page for existing users **Usage:** ```vue ``` **Route:** - Path: `/register` - Name: `Register` - Meta: `{ requiresAuth: false }` **Validation Rules:** - Username: - Required - 3-50 characters - Only letters, numbers, underscores, and hyphens - Email: - Required - Valid email format (RFC 5322 regex) - Password: - Required - Minimum 8 characters - Must contain at least one letter and one number - Confirm Password: - Required - Must match password **Behavior:** - Calls `authStore.register()` with user data - Shows success toast on successful registration - Shows error toast and inline error message on failure - Redirects to `/dashboard` after successful registration - Redirects authenticated users away from register page ## Architecture ### Component Structure Both views follow a consistent structure: ``` ``` ### State Management Both views use: - `useAuthStore()` - For authentication actions (login, register) - `useAppStore()` - For toast notifications and UI feedback - `useRouter()` - For navigation and redirects ### Validation Strategy **Client-side Validation:** - Real-time validation on form submission - Field-level error messages - Comprehensive validation rules - TypeScript type safety **Server-side Validation:** - Backend API validates all inputs - Error responses handled gracefully - User-friendly error messages displayed ### Styling **Design System:** - TailwindCSS utility classes - Consistent color scheme (indigo primary) - Responsive design - Accessible form controls - Loading states with spinner animations **Visual Feedback:** - Red border on invalid fields - Error messages below inputs - Global error banner for API errors - Success toasts on completion - Loading spinner on submit button ## Dependencies ### Components - `AuthLayout` - Layout wrapper for auth pages from `@/components/layout` ### Stores - `authStore` - Authentication state management from `@/stores/auth` - `appStore` - Application state and toasts from `@/stores/app` ### Libraries - Vue 3 Composition API - Vue Router for navigation - Pinia for state management - TypeScript for type safety ## Usage Examples ### Basic Login Flow ```typescript // User enters credentials formData.username = 'john_doe' formData.password = 'SecurePass123' // Submit form await handleLogin() // On success: // - authStore.login() called // - Token and user stored // - Success toast shown // - Redirected to /dashboard // On error: // - Error message displayed // - Error toast shown // - Form remains editable ``` ### Basic Registration Flow ```typescript // User enters registration data formData.username = 'jane_smith' formData.email = 'jane@example.com' formData.password = 'SecurePass123' formData.confirmPassword = 'SecurePass123' // Submit form await handleRegister() // On success: // - authStore.register() called // - Token and user stored // - Success toast shown // - Redirected to /dashboard // On error: // - Error message displayed // - Error toast shown // - Form remains editable ``` ## Error Handling ### Client-side Errors ```typescript // Validation errors errors.username = 'Username must be at least 3 characters' errors.email = 'Please enter a valid email address' errors.password = 'Password must be at least 8 characters with letters and numbers' errors.confirmPassword = 'Passwords do not match' ``` ### Server-side Errors ```typescript // API error responses { response: { data: { detail: 'Username already exists' } } } // Displayed as: errorMessage.value = 'Username already exists' appStore.showError('Username already exists') ``` ## Accessibility - Semantic HTML elements (`