8fee46ce5c
modified: main_dc/yalarba/easySite/easySite/app/middleware/auth.ts modified: main_dc/yalarba/easySite/easySite/app/pages/auth/login.vue modified: main_dc/yalarba/easySite/easySite/app/pages/auth/register.vue new file: main_dc/yalarba/easySite/easySite/app/pages/plugins/auth.client.ts modified: main_dc/yalarba/easySite/easySite/app/pages/profile/index.vue new file: main_dc/yalarba/easySite/easySite/app/schemas/auth.ts modified: main_dc/yalarba/easySite/easySite/app/types/auth.ts modified: main_dc/yalarba/easySite/easySite/package-lock.json modified: main_dc/yalarba/easySite/easySite/package.json update login register with use vee and firebase
102 lines
2.4 KiB
TypeScript
102 lines
2.4 KiB
TypeScript
// composables/useAuth.ts
|
|
import type { User, LoginForm, RegisterForm } from '~/types/auth'
|
|
|
|
export const useAuth = () => {
|
|
const user = useState<User | 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<{ user: User; token: string }>(
|
|
'https://easysite102.ru/api/auth/login',
|
|
{
|
|
method: 'POST',
|
|
body: credentials
|
|
}
|
|
)
|
|
|
|
user.value = response.user
|
|
// Сохраняем токен в localStorage или cookies
|
|
localStorage.setItem('auth_token', response.token)
|
|
|
|
return response
|
|
// eslint-disable-next-line no-useless-catch
|
|
} catch (error) {
|
|
throw error
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
const register = async (userData: RegisterForm) => {
|
|
loading.value = true
|
|
try {
|
|
const { passwordConfirm, ...registerData } = userData
|
|
const full_name = `${userData.first_name} ${userData.last_name}`
|
|
|
|
const response = await $fetch<{ user: User }>(
|
|
'https://easysite102.ru/api/auth/register',
|
|
{
|
|
method: 'POST',
|
|
body: {
|
|
...registerData,
|
|
full_name
|
|
}
|
|
}
|
|
)
|
|
|
|
return response
|
|
// eslint-disable-next-line no-useless-catch
|
|
} catch (error) {
|
|
throw error
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
const logout = async () => {
|
|
try {
|
|
await $fetch('https://easysite102.ru/api/auth/logout', {
|
|
method: 'POST'
|
|
})
|
|
} 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: User }>(
|
|
'https://easysite102.ru/api/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
|
|
}
|
|
} |