fix: Correct incomplete $state initialization in multiple Svelte components and pages.

This commit is contained in:
2025-12-02 19:18:53 -03:00
parent 4bd9e21748
commit 8a50fb6f61
99 changed files with 520 additions and 519 deletions

View File

@@ -1,8 +1,7 @@
<script lang="ts">
import { api } from '@sgse-app/backend/convex/_generated/api';
import type { Id, Doc } from '@sgse-app/backend/convex/_generated/dataModel';
import { useConvexClient, useQuery } from 'convex-svelte';
import { formatDistanceToNow } from 'date-fns';
import { ptBR } from 'date-fns/locale';
import { abrirConversa } from '$lib/stores/chatStore';
import NewConversationModal from './NewConversationModal.svelte';
import UserAvatar from './UserAvatar.svelte';
@@ -19,8 +18,8 @@
// Buscar conversas (grupos e salas de reunião)
const conversas = useQuery(api.chat.listarConversas, {});
const searchQuery = $state('');
const activeTab = $state<'usuarios' | 'conversas'>('usuarios');
let searchQuery = $state('');
let activeTab = $state<'usuarios' | 'conversas'>('usuarios');
// Debug: monitorar carregamento de dados
$effect(() => {
@@ -29,7 +28,7 @@
console.log('🆔 [ChatList] Meu ID:', meuPerfil?.data?._id || 'Não encontrado');
if (usuarios?.data) {
const meuId = meuPerfil?.data?._id;
const meusDadosNaLista = usuarios.data.find((u: any) => u._id === meuId);
const meusDadosNaLista = usuarios.data.find((u) => u._id === meuId);
if (meusDadosNaLista) {
console.warn(
'⚠️ [ChatList] ATENÇÃO: Meu usuário está na lista do backend!',
@@ -39,7 +38,7 @@
}
});
const usuariosFiltrados = $derived.by(() => {
let usuariosFiltrados = $derived.by(() => {
if (!usuarios?.data || !Array.isArray(usuarios.data)) return [];
// Se não temos o perfil ainda, retornar lista vazia para evitar mostrar usuários incorretos
@@ -51,10 +50,10 @@
const meuId = meuPerfil.data._id;
// Filtrar o próprio usuário da lista (filtro de segurança no frontend)
let listaFiltrada = usuarios.data.filter((u: any) => u._id !== meuId);
let listaFiltrada = usuarios.data.filter((u) => u._id !== meuId);
// Log se ainda estiver na lista após filtro (não deveria acontecer)
const aindaNaLista = listaFiltrada.find((u: any) => u._id === meuId);
const aindaNaLista = listaFiltrada.find((u) => u._id === meuId);
if (aindaNaLista) {
console.error('❌ [ChatList] ERRO: Meu usuário ainda está na lista após filtro!');
}
@@ -63,7 +62,7 @@
if (searchQuery.trim()) {
const query = searchQuery.toLowerCase();
listaFiltrada = listaFiltrada.filter(
(u: any) =>
(u) =>
u.nome?.toLowerCase().includes(query) ||
u.email?.toLowerCase().includes(query) ||
u.matricula?.toLowerCase().includes(query)
@@ -71,7 +70,7 @@
}
// Ordenar: Online primeiro, depois por nome
return listaFiltrada.sort((a: any, b: any) => {
return listaFiltrada.sort((a, b) => {
const statusOrder = {
online: 0,
ausente: 1,
@@ -87,22 +86,16 @@
});
});
function formatarTempo(timestamp: number | undefined): string {
if (!timestamp) return '';
try {
return formatDistanceToNow(new Date(timestamp), {
addSuffix: true,
locale: ptBR
});
} catch {
return '';
}
let processando = $state(false);
let showNewConversationModal = $state(false);
interface Usuario {
_id: Id<'usuarios'>;
nome: string;
[key: string]: unknown;
}
let processando = $state(false);
const showNewConversationModal = $state(false);
async function handleClickUsuario(usuario: any) {
async function handleClickUsuario(usuario: Usuario) {
if (processando) {
console.log('⏳ Já está processando uma ação, aguarde...');
return;
@@ -122,7 +115,7 @@
// Abrir a conversa
console.log('📂 Abrindo conversa...');
abrirConversa(conversaId as any);
abrirConversa(conversaId as Id<'conversas'>);
console.log('✅ Conversa aberta com sucesso!');
} catch (error) {
@@ -150,21 +143,28 @@
}
// Filtrar conversas por tipo e busca
const conversasFiltradas = $derived(() => {
let conversasFiltradas = $derived.by(() => {
if (!conversas?.data) return [];
let lista = conversas.data.filter((c: any) => c.tipo === 'grupo' || c.tipo === 'sala_reuniao');
let lista = conversas.data.filter(
(c: Doc<'conversas'>) => c.tipo === 'grupo' || c.tipo === 'sala_reuniao'
);
// Aplicar busca
if (searchQuery.trim()) {
const query = searchQuery.toLowerCase();
lista = lista.filter((c: any) => c.nome?.toLowerCase().includes(query));
lista = lista.filter((c: Doc<'conversas'>) => c.nome?.toLowerCase().includes(query));
}
return lista;
});
function handleClickConversa(conversa: any) {
interface Conversa {
_id: Id<'conversas'>;
[key: string]: unknown;
}
function handleClickConversa(conversa: Conversa) {
if (processando) return;
try {
processando = true;
@@ -178,6 +178,7 @@
}
</script>
```
<div class="flex h-full flex-col">
<!-- Search bar -->
<div class="border-base-300 border-b p-4">