|
@@ -27,9 +27,20 @@
|
|
|
import logoWhite from '$lib/assets/images/nettown_white_logo.svg';
|
|
import logoWhite from '$lib/assets/images/nettown_white_logo.svg';
|
|
|
import logoBlack from '$lib/assets/images/nettown_black_logo.svg.svg';
|
|
import logoBlack from '$lib/assets/images/nettown_black_logo.svg.svg';
|
|
|
import { theme, toggleTheme } from '$lib/core/stores/theme';
|
|
import { theme, toggleTheme } from '$lib/core/stores/theme';
|
|
|
|
|
+ import { auth } from '$lib/core/stores/auth';
|
|
|
import { onMount } from 'svelte';
|
|
import { onMount } from 'svelte';
|
|
|
|
|
|
|
|
let { children } = $props();
|
|
let { children } = $props();
|
|
|
|
|
+
|
|
|
|
|
+ /** Iniciais para o avatar a partir do nome do usuário. */
|
|
|
|
|
+ function getInitials(name) {
|
|
|
|
|
+ const parts = (name ?? '').trim().split(/\s+/).filter(Boolean);
|
|
|
|
|
+ if (parts.length === 0) return 'NT';
|
|
|
|
|
+ return parts
|
|
|
|
|
+ .slice(0, 2)
|
|
|
|
|
+ .map((p) => p[0].toUpperCase())
|
|
|
|
|
+ .join('');
|
|
|
|
|
+ }
|
|
|
let isMobileMenuOpen = $state(false);
|
|
let isMobileMenuOpen = $state(false);
|
|
|
let isSidebarCollapsed = $state(false);
|
|
let isSidebarCollapsed = $state(false);
|
|
|
let currentTheme = $state('light');
|
|
let currentTheme = $state('light');
|
|
@@ -39,6 +50,13 @@
|
|
|
theme.subscribe((val) => {
|
|
theme.subscribe((val) => {
|
|
|
currentTheme = val;
|
|
currentTheme = val;
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+ // Guard de sessão: reidrata o perfil via /v1/me. Sem sessão válida,
|
|
|
|
|
+ // redireciona ao login. (Um 401 em qualquer chamada já limpa o token
|
|
|
|
|
+ // e redireciona via client HTTP.)
|
|
|
|
|
+ auth.loadMe().then((profile) => {
|
|
|
|
|
+ if (!profile) goto('/login');
|
|
|
|
|
+ });
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
const navItems = [
|
|
const navItems = [
|
|
@@ -54,7 +72,8 @@
|
|
|
];
|
|
];
|
|
|
|
|
|
|
|
function handleLogout() {
|
|
function handleLogout() {
|
|
|
- goto('/');
|
|
|
|
|
|
|
+ auth.logout();
|
|
|
|
|
+ goto('/login');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function toggleMobileMenu() {
|
|
function toggleMobileMenu() {
|
|
@@ -260,8 +279,10 @@
|
|
|
<div class="mx-1 h-8 w-px bg-slate-200 dark:bg-slate-700"></div>
|
|
<div class="mx-1 h-8 w-px bg-slate-200 dark:bg-slate-700"></div>
|
|
|
<div class="relative flex items-center gap-3">
|
|
<div class="relative flex items-center gap-3">
|
|
|
<div class="hidden text-right sm:block">
|
|
<div class="hidden text-right sm:block">
|
|
|
- <div class="text-sm font-medium text-slate-900 dark:text-white">Admin</div>
|
|
|
|
|
- <div class="text-xs text-slate-500">Gestor de Vendas</div>
|
|
|
|
|
|
|
+ <div class="text-sm font-medium text-slate-900 dark:text-white">
|
|
|
|
|
+ {$auth.user?.user_name ?? 'Usuário'}
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="text-xs text-slate-500 capitalize">{$auth.user?.user_role ?? ''}</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="relative">
|
|
<div class="relative">
|
|
|
<button
|
|
<button
|
|
@@ -269,7 +290,7 @@
|
|
|
class="flex h-9 w-9 items-center justify-center rounded-full bg-indigo-600 text-sm font-bold text-white shadow-sm shadow-indigo-900/20 transition-colors hover:bg-indigo-700"
|
|
class="flex h-9 w-9 items-center justify-center rounded-full bg-indigo-600 text-sm font-bold text-white shadow-sm shadow-indigo-900/20 transition-colors hover:bg-indigo-700"
|
|
|
title="Menu do usuário"
|
|
title="Menu do usuário"
|
|
|
>
|
|
>
|
|
|
- AD
|
|
|
|
|
|
|
+ {getInitials($auth.user?.user_name)}
|
|
|
</button>
|
|
</button>
|
|
|
|
|
|
|
|
<!-- User Dropdown Menu -->
|
|
<!-- User Dropdown Menu -->
|
|
@@ -278,8 +299,12 @@
|
|
|
class="absolute right-0 z-50 mt-2 w-56 rounded-lg border border-slate-200 bg-white py-1 shadow-lg dark:border-slate-800 dark:bg-[#1e293b]"
|
|
class="absolute right-0 z-50 mt-2 w-56 rounded-lg border border-slate-200 bg-white py-1 shadow-lg dark:border-slate-800 dark:bg-[#1e293b]"
|
|
|
>
|
|
>
|
|
|
<div class="border-b border-slate-200 px-4 py-3 dark:border-slate-800">
|
|
<div class="border-b border-slate-200 px-4 py-3 dark:border-slate-800">
|
|
|
- <p class="text-sm font-medium text-slate-900 dark:text-white">Admin</p>
|
|
|
|
|
- <p class="text-xs text-slate-500 dark:text-slate-400">admin@nettown.com</p>
|
|
|
|
|
|
|
+ <p class="text-sm font-medium text-slate-900 dark:text-white">
|
|
|
|
|
+ {$auth.user?.user_name ?? 'Usuário'}
|
|
|
|
|
+ </p>
|
|
|
|
|
+ <p class="text-xs text-slate-500 dark:text-slate-400">
|
|
|
|
|
+ {$auth.user?.user_email ?? ''}
|
|
|
|
|
+ </p>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<a
|
|
<a
|