# Pinia Stores Documentation This directory contains all Pinia stores for the Sub2API frontend application. ## Stores Overview ### 1. Auth Store (`auth.ts`) Manages user authentication state, login/logout, and token persistence. **State:** - `user: User | null` - Current authenticated user - `token: string | null` - JWT authentication token **Computed:** - `isAuthenticated: boolean` - Whether user is currently authenticated **Actions:** - `login(credentials)` - Authenticate user with username/password - `register(userData)` - Register new user account - `logout()` - Clear authentication and logout - `checkAuth()` - Restore session from localStorage - `refreshUser()` - Fetch latest user data from server ### 2. App Store (`app.ts`) Manages global UI state including sidebar, loading indicators, and toast notifications. **State:** - `sidebarCollapsed: boolean` - Sidebar collapsed state - `loading: boolean` - Global loading state - `toasts: Toast[]` - Active toast notifications **Computed:** - `hasActiveToasts: boolean` - Whether any toasts are active **Actions:** - `toggleSidebar()` - Toggle sidebar state - `setSidebarCollapsed(collapsed)` - Set sidebar state explicitly - `setLoading(isLoading)` - Set loading state - `showToast(type, message, duration?)` - Show toast notification - `showSuccess(message, duration?)` - Show success toast - `showError(message, duration?)` - Show error toast - `showInfo(message, duration?)` - Show info toast - `showWarning(message, duration?)` - Show warning toast - `hideToast(id)` - Hide specific toast - `clearAllToasts()` - Clear all toasts - `withLoading(operation)` - Execute async operation with loading state - `withLoadingAndError(operation, errorMessage?)` - Execute with loading and error handling - `reset()` - Reset store to defaults ## Usage Examples ### Auth Store ```typescript import { useAuthStore } from '@/stores' // In component setup const authStore = useAuthStore() // Initialize on app startup authStore.checkAuth() // Login try { await authStore.login({ username: 'user', password: 'pass' }) console.log('Logged in:', authStore.user) } catch (error) { console.error('Login failed:', error) } // Check authentication if (authStore.isAuthenticated) { console.log('User is logged in:', authStore.user?.username) } // Logout authStore.logout() ``` ### App Store ```typescript import { useAppStore } from '@/stores' // In component setup const appStore = useAppStore() // Sidebar control appStore.toggleSidebar() appStore.setSidebarCollapsed(true) // Loading state appStore.setLoading(true) // ... do work appStore.setLoading(false) // Or use helper await appStore.withLoading(async () => { const data = await fetchData() return data }) // Toast notifications appStore.showSuccess('Operation completed!') appStore.showError('Something went wrong!', 5000) appStore.showInfo('FYI: This is informational') appStore.showWarning('Be careful!') // Custom toast const toastId = appStore.showToast('info', 'Custom message', undefined) // No auto-dismiss // Later... appStore.hideToast(toastId) ``` ### Combined Usage in Vue Component ```vue ``` ## Persistence - **Auth Store**: Token and user data are automatically persisted to `localStorage` - Keys: `auth_token`, `auth_user` - Restored on `checkAuth()` call - **App Store**: No persistence (UI state resets on page reload) ## TypeScript Support All stores are fully typed with TypeScript. Import types from `@/types`: ```typescript import type { User, Toast, ToastType } from '@/types' ``` ## Testing Stores can be reset to initial state: ```typescript // Auth store authStore.logout() // Clears all auth state // App store appStore.reset() // Resets to defaults ```