- 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.
91 lines
2.7 KiB
Svelte
91 lines
2.7 KiB
Svelte
<script lang="ts">
|
|
import { useConvexClient } from "convex-svelte";
|
|
import { api } from "@sgse-app/backend/convex/_generated/api";
|
|
import { onMount } from "svelte";
|
|
import { authStore } from "$lib/stores/auth.svelte";
|
|
|
|
const client = useConvexClient();
|
|
|
|
// Token é passado automaticamente via interceptadores em +layout.svelte
|
|
|
|
let heartbeatInterval: ReturnType<typeof setInterval> | null = null;
|
|
let inactivityTimeout: ReturnType<typeof setTimeout> | null = null;
|
|
let lastActivity = Date.now();
|
|
|
|
// Detectar atividade do usuário
|
|
function handleActivity() {
|
|
lastActivity = Date.now();
|
|
|
|
// Limpar timeout de inatividade anterior
|
|
if (inactivityTimeout) {
|
|
clearTimeout(inactivityTimeout);
|
|
}
|
|
|
|
// Configurar novo timeout (5 minutos)
|
|
inactivityTimeout = setTimeout(() => {
|
|
client.mutation(api.chat.atualizarStatusPresenca, { status: "ausente" });
|
|
}, 5 * 60 * 1000);
|
|
}
|
|
|
|
onMount(() => {
|
|
// Configurar como online ao montar
|
|
client.mutation(api.chat.atualizarStatusPresenca, { status: "online" });
|
|
|
|
// Heartbeat a cada 30 segundos
|
|
heartbeatInterval = setInterval(() => {
|
|
const timeSinceLastActivity = Date.now() - lastActivity;
|
|
|
|
// Se houve atividade nos últimos 5 minutos, manter online
|
|
if (timeSinceLastActivity < 5 * 60 * 1000) {
|
|
client.mutation(api.chat.atualizarStatusPresenca, { status: "online" });
|
|
}
|
|
}, 30 * 1000);
|
|
|
|
// Listeners para detectar atividade
|
|
const events = ["mousedown", "keydown", "scroll", "touchstart"];
|
|
events.forEach((event) => {
|
|
window.addEventListener(event, handleActivity);
|
|
});
|
|
|
|
// Configurar timeout inicial de inatividade
|
|
handleActivity();
|
|
|
|
// Detectar quando a aba fica inativa/ativa
|
|
function handleVisibilityChange() {
|
|
if (document.hidden) {
|
|
// Aba ficou inativa
|
|
client.mutation(api.chat.atualizarStatusPresenca, { status: "ausente" });
|
|
} else {
|
|
// Aba ficou ativa
|
|
client.mutation(api.chat.atualizarStatusPresenca, { status: "online" });
|
|
handleActivity();
|
|
}
|
|
}
|
|
|
|
document.addEventListener("visibilitychange", handleVisibilityChange);
|
|
|
|
// Cleanup
|
|
return () => {
|
|
// Marcar como offline ao desmontar
|
|
client.mutation(api.chat.atualizarStatusPresenca, { status: "offline" });
|
|
|
|
if (heartbeatInterval) {
|
|
clearInterval(heartbeatInterval);
|
|
}
|
|
|
|
if (inactivityTimeout) {
|
|
clearTimeout(inactivityTimeout);
|
|
}
|
|
|
|
events.forEach((event) => {
|
|
window.removeEventListener(event, handleActivity);
|
|
});
|
|
|
|
document.removeEventListener("visibilitychange", handleVisibilityChange);
|
|
};
|
|
});
|
|
</script>
|
|
|
|
<!-- Componente invisível - apenas lógica -->
|
|
|