File size: 5,033 Bytes
8059bf0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# 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

<script setup lang="ts">

import { useAuthStore, useAppStore } from '@/stores'

import { onMounted } from 'vue'



const authStore = useAuthStore()

const appStore = useAppStore()



onMounted(() => {

  // Check for existing session

  authStore.checkAuth()

})



async function handleLogin(username: string, password: string) {

  try {

    await appStore.withLoading(async () => {

      await authStore.login({ username, password })

    })

    appStore.showSuccess('Welcome back!')

  } catch (error) {

    appStore.showError('Login failed. Please check your credentials.')

  }

}



async function handleLogout() {

  authStore.logout()

  appStore.showInfo('You have been logged out.')

}

</script>



<template>

  <div>

    <button @click="appStore.toggleSidebar">Toggle Sidebar</button>



    <div v-if="appStore.loading">Loading...</div>



    <div v-if="authStore.isAuthenticated">

      Welcome, {{ authStore.user?.username }}!

      <button @click="handleLogout">Logout</button>

    </div>

    <div v-else>

      <button @click="handleLogin('user', 'pass')">Login</button>

    </div>

  </div>

</template>

```

## 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

```