refactor: enhance chat components with type safety and response functionality
- Updated type definitions in ChatWindow and MessageList components for better type safety. - Improved MessageInput to handle message responses, including a preview feature for replying to messages. - Enhanced the chat message handling logic to support message references and improve user interaction. - Refactored notification utility functions to support push notifications and rate limiting for email sending. - Updated backend schema to accommodate new features related to message responses and notifications.
This commit is contained in:
75
apps/web/src/lib/components/PushNotificationManager.svelte
Normal file
75
apps/web/src/lib/components/PushNotificationManager.svelte
Normal file
@@ -0,0 +1,75 @@
|
||||
<script lang="ts">
|
||||
import { onMount } from "svelte";
|
||||
import { useConvexClient } from "convex-svelte";
|
||||
import { api } from "@sgse-app/backend/convex/_generated/api";
|
||||
import { authStore } from "$lib/stores/auth.svelte";
|
||||
import {
|
||||
registrarServiceWorker,
|
||||
solicitarPushSubscription,
|
||||
subscriptionToJSON,
|
||||
removerPushSubscription,
|
||||
} from "$lib/utils/notifications";
|
||||
|
||||
const client = useConvexClient();
|
||||
|
||||
onMount(async () => {
|
||||
// Aguardar usuário estar autenticado
|
||||
const checkAuth = setInterval(async () => {
|
||||
if (authStore.usuario) {
|
||||
clearInterval(checkAuth);
|
||||
await registrarPushSubscription();
|
||||
}
|
||||
}, 500);
|
||||
|
||||
// Limpar intervalo após 30 segundos (timeout)
|
||||
setTimeout(() => {
|
||||
clearInterval(checkAuth);
|
||||
}, 30000);
|
||||
|
||||
return () => {
|
||||
clearInterval(checkAuth);
|
||||
};
|
||||
});
|
||||
|
||||
async function registrarPushSubscription() {
|
||||
try {
|
||||
// Solicitar subscription
|
||||
const subscription = await solicitarPushSubscription();
|
||||
|
||||
if (!subscription) {
|
||||
console.log("ℹ️ Push subscription não disponível ou permissão negada");
|
||||
return;
|
||||
}
|
||||
|
||||
// Converter para formato serializável
|
||||
const subscriptionData = subscriptionToJSON(subscription);
|
||||
|
||||
// Registrar no backend
|
||||
const resultado = await client.mutation(api.pushNotifications.registrarPushSubscription, {
|
||||
endpoint: subscriptionData.endpoint,
|
||||
keys: subscriptionData.keys,
|
||||
userAgent: navigator.userAgent,
|
||||
});
|
||||
|
||||
if (resultado.sucesso) {
|
||||
console.log("✅ Push subscription registrada com sucesso");
|
||||
} else {
|
||||
console.error("❌ Erro ao registrar push subscription:", resultado.erro);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("❌ Erro ao configurar push notifications:", error);
|
||||
}
|
||||
}
|
||||
|
||||
// Remover subscription ao fazer logout
|
||||
$effect(() => {
|
||||
if (!authStore.usuario) {
|
||||
removerPushSubscription().then(() => {
|
||||
console.log("Push subscription removida");
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<!-- Componente invisível - apenas lógica -->
|
||||
|
||||
Reference in New Issue
Block a user