feat: integrate Better Auth and enhance authentication flow
- Added Better Auth integration to the web application, allowing for dual login support with both custom and Better Auth systems. - Updated authentication client configuration to dynamically set the base URL based on the environment. - Enhanced chat components to utilize user authentication status, improving user experience and security. - Refactored various components to support Better Auth, including error handling and user identity management. - Improved notification handling and user feedback mechanisms during authentication processes.
This commit is contained in:
@@ -67,6 +67,10 @@ class AuthStore {
|
||||
return this.state.usuario?.role.nome === "rh" || this.isAdmin;
|
||||
}
|
||||
|
||||
/**
|
||||
* FASE 2: Login dual - suporta tanto sistema customizado quanto Better Auth
|
||||
* Por enquanto, mantém sistema customizado. Better Auth será adicionado depois.
|
||||
*/
|
||||
login(usuario: Usuario, token: string) {
|
||||
this.state.usuario = usuario;
|
||||
this.state.token = token;
|
||||
@@ -75,8 +79,33 @@ class AuthStore {
|
||||
if (browser) {
|
||||
localStorage.setItem("auth_token", token);
|
||||
localStorage.setItem("auth_usuario", JSON.stringify(usuario));
|
||||
|
||||
// FASE 2: Preparar para Better Auth (ainda não ativo)
|
||||
// Quando Better Auth estiver configurado, também salvaremos sessão do Better Auth aqui
|
||||
if (import.meta.env.DEV) {
|
||||
console.log("✅ [AuthStore] Login realizado:", {
|
||||
usuario: usuario.nome,
|
||||
email: usuario.email,
|
||||
sistema: "customizado" // Será "better-auth" quando migrado
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* FASE 2: Login via Better Auth (preparado para futuro)
|
||||
* Por enquanto não implementado, será usado quando Better Auth estiver completo
|
||||
*/
|
||||
async loginWithBetterAuth(email: string, senha: string) {
|
||||
// TODO: Implementar quando Better Auth estiver pronto
|
||||
// const { authClient } = await import("$lib/auth");
|
||||
// const result = await authClient.signIn.email({ email, password: senha });
|
||||
// if (result.data) {
|
||||
// // Obter perfil do usuário do Convex
|
||||
// // this.login(usuario, result.data.session.token);
|
||||
// }
|
||||
throw new Error("Better Auth ainda não configurado. Use login customizado.");
|
||||
}
|
||||
|
||||
logout() {
|
||||
this.state.usuario = null;
|
||||
|
||||
64
apps/web/src/lib/stores/convexAuth.ts
Normal file
64
apps/web/src/lib/stores/convexAuth.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
/**
|
||||
* Helper para garantir que o token seja passado para todas requisições Convex
|
||||
*
|
||||
* Este store reativa garante que quando o token mudar no authStore,
|
||||
* todos os clientes Convex sejam atualizados automaticamente.
|
||||
*/
|
||||
|
||||
import { authStore } from "./auth.svelte";
|
||||
import { browser } from "$app/environment";
|
||||
import { PUBLIC_CONVEX_URL } from "$env/static/public";
|
||||
|
||||
let convexClients = new Set<any>();
|
||||
|
||||
/**
|
||||
* Registrar um cliente Convex para receber atualizações de token
|
||||
*/
|
||||
export function registerConvexClient(client: any) {
|
||||
if (!browser) return;
|
||||
|
||||
convexClients.add(client);
|
||||
|
||||
// Configurar token inicial
|
||||
if (authStore.token && client.setAuth) {
|
||||
client.setAuth(authStore.token);
|
||||
}
|
||||
|
||||
// Retornar função de limpeza
|
||||
return () => {
|
||||
convexClients.delete(client);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Atualizar token em todos clientes registrados
|
||||
*/
|
||||
function updateAllClients() {
|
||||
if (!browser) return;
|
||||
|
||||
const token = authStore.token;
|
||||
convexClients.forEach((client) => {
|
||||
if (client && typeof client.setAuth === "function") {
|
||||
if (token) {
|
||||
client.setAuth(token);
|
||||
} else {
|
||||
client.clearAuth?.();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Observar mudanças no token e atualizar clientes
|
||||
if (browser) {
|
||||
// Usar uma abordagem reativa simples
|
||||
let lastToken: string | null = null;
|
||||
|
||||
setInterval(() => {
|
||||
const currentToken = authStore.token;
|
||||
if (currentToken !== lastToken) {
|
||||
lastToken = currentToken;
|
||||
updateAllClients();
|
||||
}
|
||||
}, 500); // Verificar a cada 500ms
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user