Compare commits
5 Commits
5892921a7c
...
2f4583f423
| Author | SHA1 | Date |
|---|---|---|
|
|
2f4583f423 | |
|
|
ee69746ac7 | |
|
|
db084a579f | |
|
|
02a6bb6025 | |
|
|
d9955a64d4 |
|
|
@ -5,10 +5,15 @@ export interface User {
|
|||
email_verified_at: string | null
|
||||
password?: string
|
||||
remember_token?: string | null
|
||||
roles: Role[]
|
||||
created_at: string | null
|
||||
updated_at: string | null
|
||||
}
|
||||
|
||||
export interface Role {
|
||||
name: string
|
||||
}
|
||||
|
||||
export interface LoginCredentials {
|
||||
email: string
|
||||
password: string
|
||||
|
|
@ -50,7 +55,9 @@ export function useAuth<T = User>() {
|
|||
}
|
||||
|
||||
async function login(credentials: LoginCredentials) {
|
||||
if (isLoggedIn.value) { return }
|
||||
if (isLoggedIn.value) {
|
||||
return
|
||||
}
|
||||
|
||||
await $larafetch('/login', { method: 'post', body: credentials })
|
||||
await refresh()
|
||||
|
|
@ -71,7 +78,9 @@ export function useAuth<T = User>() {
|
|||
}
|
||||
|
||||
async function logout() {
|
||||
if (!isLoggedIn.value) { return }
|
||||
if (!isLoggedIn.value) {
|
||||
return
|
||||
}
|
||||
|
||||
await $larafetch('/logout', { method: 'post' })
|
||||
user.value = null
|
||||
|
|
@ -114,8 +123,12 @@ export async function fetchCurrentUser<T = User>() {
|
|||
return await $larafetch<T>('/api/user')
|
||||
}
|
||||
catch (error: any) {
|
||||
if ([401, 419].includes(error?.response?.status)) { return null }
|
||||
if (error?.response?.status === undefined) { return null }
|
||||
if ([401, 419].includes(error?.response?.status)) {
|
||||
return null
|
||||
}
|
||||
if (error?.response?.status === undefined) {
|
||||
return null
|
||||
}
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
export function useRoles() {
|
||||
const user = useUser()
|
||||
|
||||
function hasRole(roleName: string) {
|
||||
return user.value?.roles?.some(role => role.name === roleName) ?? false
|
||||
}
|
||||
|
||||
return {
|
||||
hasRole,
|
||||
}
|
||||
}
|
||||
|
|
@ -44,7 +44,9 @@ export function useSubmit<T>(
|
|||
validationErrors.value = []
|
||||
}
|
||||
|
||||
if (e.response?.status !== 422) { throw e }
|
||||
if (e.response?.status !== 422) {
|
||||
throw e
|
||||
}
|
||||
}
|
||||
finally {
|
||||
inProgress.value = false
|
||||
|
|
|
|||
|
|
@ -0,0 +1,13 @@
|
|||
<script setup lang="ts">
|
||||
import type { NuxtError } from '#app'
|
||||
|
||||
defineProps<{
|
||||
error: NuxtError
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NuxtLayout>
|
||||
<UPageError :error="error" />
|
||||
</NuxtLayout>
|
||||
</template>
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
<template>
|
||||
<div>
|
||||
<Header />
|
||||
<UPage>
|
||||
<template #left>
|
||||
<UAside class="lg:static">
|
||||
<Navigation />
|
||||
</UAside>
|
||||
</template>
|
||||
<UPageBody>
|
||||
<UContainer>
|
||||
<slot />
|
||||
</UContainer>
|
||||
</UPageBody>
|
||||
</UPage>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<template>
|
||||
<div>
|
||||
<slot />
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -1,5 +1,17 @@
|
|||
<template>
|
||||
<div>
|
||||
<Header />
|
||||
<UPage>
|
||||
<template #left>
|
||||
<UAside class="lg:static">
|
||||
<Navigation />
|
||||
</UAside>
|
||||
</template>
|
||||
<UPageBody>
|
||||
<UContainer>
|
||||
<slot />
|
||||
</UContainer>
|
||||
</UPageBody>
|
||||
</UPage>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
export default defineNuxtRouteMiddleware(async () => {
|
||||
const { hasRole } = useRoles()
|
||||
const requiredRole = 'super-admin' // Define the role required for this route
|
||||
|
||||
if (!hasRole(requiredRole)) {
|
||||
return abortNavigation({
|
||||
message: 'You are not authorized to access this page',
|
||||
statusCode: 403,
|
||||
})
|
||||
}
|
||||
})
|
||||
|
|
@ -1,4 +1,6 @@
|
|||
export default defineNuxtRouteMiddleware(async () => {
|
||||
const user = useUser();
|
||||
if (!user.value) return navigateTo("/login", { replace: true });
|
||||
});
|
||||
const user = useUser()
|
||||
if (!user.value) {
|
||||
return navigateTo('/login', { replace: true })
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
export default defineNuxtRouteMiddleware(async () => {
|
||||
const user = useUser();
|
||||
if (user.value) return navigateTo("/", { replace: true });
|
||||
});
|
||||
const user = useUser()
|
||||
if (user.value) {
|
||||
return navigateTo('/', { replace: true })
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,7 +1,11 @@
|
|||
export default defineNuxtRouteMiddleware(() => {
|
||||
const user = useUser()
|
||||
|
||||
if (!user.value) { return navigateTo('/login') }
|
||||
if (!user.value) {
|
||||
return navigateTo('/login')
|
||||
}
|
||||
|
||||
if (user.value.email_verified_at) { return navigateTo('/') }
|
||||
if (user.value.email_verified_at) {
|
||||
return navigateTo('/')
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
export default defineNuxtRouteMiddleware(() => {
|
||||
const user = useUser();
|
||||
const user = useUser()
|
||||
|
||||
if (!user.value) return navigateTo("/login");
|
||||
if (!user.value) {
|
||||
return navigateTo('/login')
|
||||
}
|
||||
|
||||
// @ts-ignore
|
||||
if (!(user.value.email_verified_at || user.value.is_verified))
|
||||
return navigateTo("/verify-email");
|
||||
});
|
||||
if (!(user.value.email_verified_at)) {
|
||||
return navigateTo('/verify-email')
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<script setup lang="ts">
|
||||
definePageMeta({ middleware: ['guest'] })
|
||||
definePageMeta({ middleware: ['guest'], layout: 'auth' })
|
||||
|
||||
const router = useRouter()
|
||||
const { forgotPassword } = useAuth()
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
<script setup lang="ts">
|
||||
definePageMeta({ middleware: ['auth'], layout: 'app' })
|
||||
definePageMeta({ middleware: ['auth'] })
|
||||
|
||||
const user = useUser()
|
||||
|
||||
console.log(user.value)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<script setup lang="ts">
|
||||
definePageMeta({ middleware: ['guest'] })
|
||||
definePageMeta({ middleware: ['guest'], layout: 'auth' })
|
||||
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<script setup lang="ts">
|
||||
definePageMeta({ middleware: ['auth'] })
|
||||
definePageMeta({ middleware: ['guest'], layout: 'auth' })
|
||||
const { logout } = useAuth()
|
||||
logout()
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<script setup lang="ts">
|
||||
definePageMeta({ middleware: ['guest'] })
|
||||
definePageMeta({ middleware: ['guest'], layout: 'auth' })
|
||||
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
|
|
|
|||
|
|
@ -4,7 +4,9 @@ export default defineNuxtPlugin(async () => {
|
|||
const user = useUser()
|
||||
|
||||
// Skip if already initialized on server
|
||||
if (user.value !== undefined) { return }
|
||||
if (user.value !== undefined) {
|
||||
return
|
||||
}
|
||||
|
||||
user.value = await fetchCurrentUser()
|
||||
})
|
||||
|
|
|
|||
|
|
@ -2,7 +2,9 @@ import { FetchError } from 'ofetch'
|
|||
|
||||
export default defineNuxtPlugin(async (nuxtApp) => {
|
||||
nuxtApp.hook('vue:error', (error) => {
|
||||
if (!(error instanceof FetchError)) { throw error }
|
||||
if (!(error instanceof FetchError)) {
|
||||
throw error
|
||||
}
|
||||
|
||||
const status = error.response?.status ?? -1
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue