2941b14b38
- Moved contents of main_dc/yalarba/easySite/easySite/ up to easySite/ - Updated docker-compose.yml build context path - Deleted empty nested easySite/ directory
92 lines
2.2 KiB
TypeScript
92 lines
2.2 KiB
TypeScript
import type { UserInfo, LoginForm, RegisterForm, AuthResponse } from '~/types/auth'
|
|
|
|
export const useAuth = () => {
|
|
const config = useRuntimeConfig()
|
|
const apiBase = config.public.apiBase
|
|
|
|
const user = useState<UserInfo | null>('user', () => null)
|
|
const isAuthenticated = computed(() => !!user.value)
|
|
const loading = ref(false)
|
|
|
|
const login = async (credentials: LoginForm) => {
|
|
loading.value = true
|
|
try {
|
|
const response = await $fetch<AuthResponse>(`${apiBase}/auth/login`, {
|
|
method: 'POST',
|
|
body: credentials
|
|
})
|
|
|
|
user.value = response.user
|
|
localStorage.setItem('auth_token', response.token)
|
|
|
|
return response
|
|
} catch (error) {
|
|
throw error
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
const register = async (userData: RegisterForm) => {
|
|
loading.value = true
|
|
try {
|
|
const { passwordConfirm, ...registerData } = userData
|
|
|
|
const response = await $fetch<AuthResponse>(`${apiBase}/auth/register`, {
|
|
method: 'POST',
|
|
body: registerData
|
|
})
|
|
|
|
user.value = response.user
|
|
localStorage.setItem('auth_token', response.token)
|
|
|
|
return response
|
|
} catch (error) {
|
|
throw error
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
const logout = async () => {
|
|
const token = localStorage.getItem('auth_token')
|
|
try {
|
|
await $fetch(`${apiBase}/auth/logout`, {
|
|
method: 'POST',
|
|
headers: { Authorization: `Bearer ${token}` }
|
|
})
|
|
} catch (error) {
|
|
console.error('Logout error:', error)
|
|
} finally {
|
|
user.value = null
|
|
localStorage.removeItem('auth_token')
|
|
await navigateTo('/auth/login')
|
|
}
|
|
}
|
|
|
|
const checkAuth = async () => {
|
|
const token = localStorage.getItem('auth_token')
|
|
if (!token) return
|
|
|
|
try {
|
|
const response = await $fetch<{ user: UserInfo }>(`${apiBase}/auth/me`, {
|
|
headers: { Authorization: `Bearer ${token}` }
|
|
})
|
|
user.value = response.user
|
|
} catch (error) {
|
|
console.error('Auth check failed:', error)
|
|
localStorage.removeItem('auth_token')
|
|
}
|
|
}
|
|
|
|
return {
|
|
user: readonly(user),
|
|
isAuthenticated,
|
|
loading: readonly(loading),
|
|
login,
|
|
register,
|
|
logout,
|
|
checkAuth
|
|
}
|
|
}
|