diff --git a/apps/web/src/lib/components/Sidebar.svelte b/apps/web/src/lib/components/Sidebar.svelte index a554ca7..b394bd1 100644 --- a/apps/web/src/lib/components/Sidebar.svelte +++ b/apps/web/src/lib/components/Sidebar.svelte @@ -5,58 +5,66 @@ import type { Snippet } from "svelte"; import { authStore } from "$lib/stores/auth.svelte"; import { loginModalStore } from "$lib/stores/loginModal.svelte"; - import { useConvexClient } from "convex-svelte"; + import { useQuery } from "convex-svelte"; import { api } from "@sgse-app/backend/convex/_generated/api"; import NotificationBell from "$lib/components/chat/NotificationBell.svelte"; import ChatWidget from "$lib/components/chat/ChatWidget.svelte"; import PresenceManager from "$lib/components/chat/PresenceManager.svelte"; - import { getBrowserInfo } from "$lib/utils/browserInfo"; import { getAvatarUrl } from "$lib/utils/avatarGenerator"; - import { Menu, User, Home, UserPlus, XCircle, LogIn, Tag, Plus, Check } from "lucide-svelte"; + import { + Menu, + User, + Home, + UserPlus, + XCircle, + LogIn, + Tag, + Plus, + Check, + } from "lucide-svelte"; + import { authClient } from "$lib/auth"; let { children }: { children: Snippet } = $props(); - const convex = useConvexClient(); - - // Caminho atual da página const currentPath = $derived(page.url.pathname); + const currentUser = useQuery(api.auth.getCurrentUser, {}); + // Função para obter a URL do avatar/foto do usuário const avatarUrlDoUsuario = $derived(() => { - const usuario = authStore.usuario; - if (!usuario) return null; - + if (!currentUser.data) return null; + // Prioridade: fotoPerfilUrl > avatar > fallback com nome - if (usuario.fotoPerfilUrl) { - return usuario.fotoPerfilUrl; - } - if (usuario.avatar) { - return getAvatarUrl(usuario.avatar); + if (currentUser.data.fotoPerfil) { + return currentUser.data.fotoPerfil; } + // Fallback: gerar avatar baseado no nome - return getAvatarUrl(usuario.nome); + return getAvatarUrl(currentUser.data.nome); }); // Função para gerar classes do menu ativo function getMenuClasses(isActive: boolean) { - const baseClasses = "group font-semibold flex items-center justify-center gap-2 text-center p-3.5 rounded-xl border-2 transition-all duration-300 shadow-md hover:shadow-lg hover:scale-105"; - + const baseClasses = + "group font-semibold flex items-center justify-center gap-2 text-center p-3.5 rounded-xl border-2 transition-all duration-300 shadow-md hover:shadow-lg hover:scale-105"; + if (isActive) { return `${baseClasses} border-primary bg-primary text-white shadow-lg scale-105`; } - - return `${baseClasses} border-primary/30 bg-gradient-to-br from-base-100 to-base-200 text-base-content hover:from-primary hover:to-primary/80 hover:text-white`; + + return `${baseClasses} border-primary/30 bg-linear-to-br from-base-100 to-base-200 text-base-content hover:from-primary hover:to-primary/80 hover:text-white`; } // Função para gerar classes do botão "Solicitar Acesso" function getSolicitarClasses(isActive: boolean) { - const baseClasses = "group font-semibold flex items-center justify-center gap-2 text-center p-3.5 rounded-xl border-2 transition-all duration-300 shadow-md hover:shadow-lg hover:scale-105"; - + const baseClasses = + "group font-semibold flex items-center justify-center gap-2 text-center p-3.5 rounded-xl border-2 transition-all duration-300 shadow-md hover:shadow-lg hover:scale-105"; + if (isActive) { return `${baseClasses} border-success bg-success text-white shadow-lg scale-105`; } - - return `${baseClasses} border-success/30 bg-gradient-to-br from-success/10 to-success/20 text-base-content hover:from-success hover:to-success/80 hover:text-white`; + + return `${baseClasses} border-success/30 bg-linear-to-br from-success/10 to-success/20 text-base-content hover:from-success hover:to-success/80 hover:text-white`; } const setores = [ @@ -113,88 +121,55 @@ showAboutModal = false; } - /** - * FASE 2: Login dual - tenta Better Auth primeiro, fallback para sistema customizado - */ async function handleLogin(e: Event) { e.preventDefault(); erroLogin = ""; carregandoLogin = true; - try { - // FASE 2: Por enquanto, sistema customizado funciona normalmente - // Quando Better Auth estiver configurado, tentaremos primeiro: - // - // try { - // await authStore.loginWithBetterAuth(matricula, senha); - // closeLoginModal(); - // goto("/"); - // return; - // } catch (betterAuthError) { - // // Fallback para sistema customizado - // console.log("Better Auth falhou, usando sistema customizado"); - // } + // const browserInfo = await getBrowserInfo(); - // Sistema customizado (atual e funcionando) - const browserInfo = await getBrowserInfo(); - - const resultado = await convex.mutation(api.autenticacao.login, { - matriculaOuEmail: matricula.trim(), - senha: senha, - userAgent: browserInfo.userAgent || undefined, - ipAddress: browserInfo.ipAddress, - }); + const result = await authClient.signIn.email( + { email: matricula.trim(), password: senha }, + { + onError: (ctx) => { + alert(ctx.error.message); + }, + }, + ); - if (resultado.sucesso) { - authStore.login(resultado.usuario, resultado.token); - closeLoginModal(); - - // Redirecionar baseado no role - if (resultado.usuario.role.nome === "ti" || resultado.usuario.role.nivel === 0) { - goto("/ti/painel-administrativo"); - } else if (resultado.usuario.role.nome === "rh") { - goto("/recursos-humanos"); - } else { - goto("/"); - } - } else { - erroLogin = resultado.erro || "Erro ao fazer login"; - } - } catch (error) { - console.error("Erro ao fazer login:", error); - erroLogin = "Erro ao conectar com o servidor. Tente novamente."; - } finally { - carregandoLogin = false; + if (result.data) { + closeLoginModal(); + goto("/"); + } else { + erroLogin = "Erro ao fazer login"; } } async function handleLogout() { - if (authStore.token) { - try { - await convex.mutation(api.autenticacao.logout, { - token: authStore.token, - }); - } catch (error) { - console.error("Erro ao fazer logout:", error); - } + const result = await authClient.signOut(); + if (result.error) { + console.error("Sign out error:", result.error); } - authStore.logout(); goto("/"); } -