fix: update dependencies and improve chat component structure

- Updated `lucide-svelte` dependency to version 0.552.0 across multiple files for consistency.
- Refactored chat components to enhance structure and readability, including adjustments to the Sidebar, ChatList, and MessageInput components.
- Improved notification handling in chat components to ensure better user experience and responsiveness.
- Added type safety enhancements in various components to ensure better integration with backend data models.
This commit is contained in:
2025-11-05 11:52:01 -03:00
parent 1774b135b3
commit 6cb7414dcc
15 changed files with 377 additions and 408 deletions

View File

@@ -21,14 +21,49 @@
let messagesContainer: HTMLDivElement;
let shouldScrollToBottom = true;
let lastMessageCount = 0;
let lastMessageId = $state<string | null>(null);
let mensagensNotificadas = $state<Set<string>>(new Set());
let showNotificationPopup = $state(false);
let notificationMessage = $state<{ remetente: string; conteudo: string } | null>(null);
let notificationTimeout: ReturnType<typeof setTimeout> | null = null;
let mensagensCarregadas = $state(false);
// Obter ID do usuário atual - usar $state para garantir reatividade
let usuarioAtualId = $state<string | null>(null);
// Carregar mensagens já notificadas do localStorage ao montar
$effect(() => {
if (typeof window !== 'undefined' && !mensagensCarregadas) {
const saved = localStorage.getItem('chat-mensagens-notificadas');
if (saved) {
try {
const ids = JSON.parse(saved) as string[];
mensagensNotificadas = new Set(ids);
} catch {
mensagensNotificadas = new Set();
}
}
mensagensCarregadas = true;
// Marcar todas as mensagens atuais como já visualizadas (não tocar beep ao abrir)
if (mensagens?.data && mensagens.data.length > 0) {
mensagens.data.forEach((msg) => {
mensagensNotificadas.add(String(msg._id));
});
salvarMensagensNotificadas();
}
}
});
// Salvar mensagens notificadas no localStorage
function salvarMensagensNotificadas() {
if (typeof window !== 'undefined') {
const ids = Array.from(mensagensNotificadas);
// Limitar a 1000 IDs para não encher o localStorage
const idsLimitados = ids.slice(-1000);
localStorage.setItem('chat-mensagens-notificadas', JSON.stringify(idsLimitados));
}
}
// Atualizar usuarioAtualId sempre que authStore.usuario mudar
$effect(() => {
const usuario = authStore.usuario;
@@ -44,7 +79,9 @@
function tocarSomNotificacao() {
try {
// Usar AudioContext (requer interação do usuário para iniciar)
const AudioContext = window.AudioContext || (window as any).webkitAudioContext;
const AudioContextClass = window.AudioContext || (window as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;
if (!AudioContextClass) return;
let audioContext: AudioContext | null = null;
try {
@@ -106,13 +143,18 @@
// Detectar nova mensagem de outro usuário
if (isNewMessage && mensagens.data.length > 0 && usuarioAtualId) {
const ultimaMensagem = mensagens.data[mensagens.data.length - 1];
const mensagemId = String(ultimaMensagem._id);
const remetenteIdStr = ultimaMensagem.remetenteId
? String(ultimaMensagem.remetenteId).trim()
: (ultimaMensagem.remetente?._id ? String(ultimaMensagem.remetente._id).trim() : null);
// Se é uma nova mensagem de outro usuário (não minha)
if (remetenteIdStr && remetenteIdStr !== usuarioAtualId && ultimaMensagem._id !== lastMessageId) {
// Tocar som de notificação
// Se é uma nova mensagem de outro usuário (não minha) E ainda não foi notificada
if (remetenteIdStr && remetenteIdStr !== usuarioAtualId && !mensagensNotificadas.has(mensagemId)) {
// Marcar como notificada antes de tocar som (evita duplicação)
mensagensNotificadas.add(mensagemId);
salvarMensagensNotificadas();
// Tocar som de notificação (apenas uma vez)
tocarSomNotificacao();
// Mostrar popup de notificação
@@ -130,8 +172,6 @@
showNotificationPopup = false;
notificationMessage = null;
}, 5000);
lastMessageId = ultimaMensagem._id;
}
}
@@ -311,11 +351,11 @@
alert(resultado.erro || "Erro ao deletar mensagem");
}
} else {
await client.mutation(api.chat.deletarMensagem, {
mensagemId,
});
await client.mutation(api.chat.deletarMensagem, {
mensagemId,
});
}
} catch (error: any) {
} catch (error) {
console.error("Erro ao deletar mensagem:", error);
alert(error.message || "Erro ao deletar mensagem");
}
@@ -548,20 +588,20 @@
<div class="flex gap-1">
{#if isMinha}
<!-- Ações para minhas próprias mensagens -->
<button
class="text-xs text-base-content/50 hover:text-primary transition-colors"
onclick={() => editarMensagem(mensagem)}
title="Editar mensagem"
>
✏️
</button>
<button
class="text-xs text-base-content/50 hover:text-error transition-colors"
<button
class="text-xs text-base-content/50 hover:text-primary transition-colors"
onclick={() => editarMensagem(mensagem)}
title="Editar mensagem"
>
✏️
</button>
<button
class="text-xs text-base-content/50 hover:text-error transition-colors"
onclick={() => deletarMensagem(mensagem._id, false)}
title="Deletar mensagem"
>
🗑️
</button>
title="Deletar mensagem"
>
🗑️
</button>
{:else if isAdmin?.data}
<!-- Ações para admin deletar mensagens de outros -->
<button