I’ve created a webapp using Laravel Jetstream. I’m also using Vue and Inertia. Jetstream is dealing with the backend. A new user will land on Welcome.vue and upon loggin in, he will get to Dashboard.vue. This is my web.php:
Route::middleware([
'auth:sanctum',
config('jetstream.auth_session'),
'verified',
])->group(function () {
Route::get('/dashboard', function () {
return Inertia::render('Dashboard', [
'user' => Auth::user()
]);
})->name('dashboard');
});
I’d like to simply show a message on the Dashboard navbar, like "Welcome, name". This would be just a test, as I’d want to show several buttons, texts and stuff to auth users only across different views.
Problem is, my Welcome and Dashboard views are almost identical, they’re 95% made up of components. It look like this:
<script setup>
import { Head, Link } from '@inertiajs/inertia-vue3';
import Main_w_side from '../Components/Custom/main_w_side.vue';
import Navabar from '../Components/Custom/Navabar.vue';
import Our_team from '../Components/Custom/OurTeam.vue';
import Portfolio from '../Components/Custom/Portfoglio.vue';
import CustomFooter from '../Components/Custom/CustomFooter.vue';
import { provide } from 'vue'
defineProps({
canLogin: Boolean,
canRegister: Boolean,
laravelVersion: String,
phpVersion: String,
});
</script>
<template>
<Head title="Dashboard v0.1"/>
<Navabar class="bg-white shadow dark:bg-gray-800" />
<Portfolio/>
<Main_w_side/>
<Our_team/>
<CustomFooter/>
</template>
So the Navbar.vue that Dashboard uses is the same that Welcome uses. The same goes for portfolio, Main_w_side, Our_team,and such.
I know I should use the v-if method
<p class="pl-12" v-if="loggedIn">You're logged in</p>
to show a div if a certain condition is satisfied, but I haven’t found any guidance online, as most of them refer to blade, or to webapps made without Jetstream (using a user controller which I don’t currently have)
I was also thinking that I should probably use Provide/Inject to let every component across the web app know if the user visiting has logged in. But I still don’t know how I would do that.
I feel like there has to be an industry standard for this that I’m not aware of, as virtually almost every website would need this feature (instead of re-creating whole pages just to have a different div somewhere)
2
Answers
As per the default InertiaJS installation, you should be able to do something like this:
so your code should look like this:
There’s no need for
provide/inject
and you are able to retrieve the authenticated user on every component, no matter how deep in the component tree the component is, using inertia’s$page
instance property orusePage()
method.As @Abdullah Hejazy mentioned, in Vue2 and Vue3 you can simply do:
$page.props.auth.user
will be null if the user isn’t logged in. It is comming from theHandleInertiaRequests
middleware.In Vue3 you can also do something like this: