refactor: optimize query handling and state management in perfil page

- Updated query logic to ensure stable data retrieval for user-related information, reducing unnecessary re-creations.
- Implemented derived states to manage loading and error conditions more effectively, enhancing user experience.
- Improved synchronization of query results with stable states, ensuring data consistency during loading phases.
- Refactored existing queries to utilize stable keys based on user IDs, preventing issues with undefined states.
This commit is contained in:
2025-11-18 06:51:22 -03:00
parent 422dc6f022
commit db098ceea9

View File

@@ -83,95 +83,120 @@
// FuncionarioId disponível diretamente do usuário atual // FuncionarioId disponível diretamente do usuário atual
const funcionarioIdDisponivel = $derived(currentUser?.data?.funcionarioId ?? null); const funcionarioIdDisponivel = $derived(currentUser?.data?.funcionarioId ?? null);
const gestorIdDisponivel = $derived(currentUser?.data?._id ?? null);
// Queries // ✅ CORRIGIDO: Queries no nível superior (sem argumentos) sempre criadas
const funcionarioQuery = $derived( // Queries que não requerem argumentos são criadas uma vez
currentUser?.data?.funcionarioId ? useQuery(api.funcionarios.getCurrent, {}) : { data: null } const funcionarioQuery = useQuery(api.funcionarios.getCurrent, {});
); const timesSubordinadosQuery = useQuery(api.times.listarSubordinadosDoGestorAtual, {});
const chamadosQuery = useQuery(api.chamados.listarChamadosUsuario, {});
$effect(() => { // ✅ CORRIGIDO: Queries com argumentos obrigatórios usando $derived.by para estabilidade
if (funcionarioQuery?.data) { // Usamos uma chave estável baseada no ID para evitar recriação desnecessária
funcionarioEstavel = funcionarioQuery.data; const solicitacoesSubordinadosQuery = $derived.by(() => {
} else if (!currentUser?.data?.funcionarioId) { if (!gestorIdDisponivel) return { data: [] };
funcionarioEstavel = null; return useQuery(api.ferias.listarSolicitacoesSubordinados, {
} gestorId: gestorIdDisponivel as Id<'usuarios'>
});
}); });
const solicitacoesSubordinadosQuery = $derived( const ausenciasSubordinadosQuery = $derived.by(() => {
currentUser?.data?._id if (!gestorIdDisponivel) return { data: [] };
? useQuery(api.ferias.listarSolicitacoesSubordinados, { return useQuery(api.ausencias.listarSolicitacoesSubordinados, {
gestorId: currentUser.data._id as Id<'usuarios'> gestorId: gestorIdDisponivel as Id<'usuarios'>
}) });
: { data: [] } });
);
const ausenciasSubordinadosQuery = $derived( // ✅ CORRIGIDO: Estados estáveis atualizados apenas quando há dados válidos
currentUser?.data?._id // Não limpamos quando undefined (carregando), apenas quando explicitamente sem dados
? useQuery(api.ausencias.listarSolicitacoesSubordinados, { $effect(() => {
gestorId: currentUser.data._id as Id<'usuarios'> if (funcionarioQuery?.data && funcionarioIdDisponivel) {
}) funcionarioEstavel = funcionarioQuery.data;
: { data: [] } } else if (
); funcionarioQuery !== undefined &&
funcionarioQuery?.data === null &&
!funcionarioIdDisponivel
) {
// Só limpar se a query retornou explicitamente null e não há funcionarioId
funcionarioEstavel = null;
}
// Se funcionarioQuery é undefined, ainda está carregando - manter estado atual
});
const minhasSolicitacoesQuery = $derived( // Queries que dependem de funcionarioEstavel
funcionarioEstavel?._id const funcionarioIdParaQueries = $derived(funcionarioEstavel?._id ?? null);
? useQuery(api.ferias.listarMinhasSolicitacoes, {
funcionarioId: funcionarioEstavel._id
})
: { data: [] }
);
const minhasAusenciasQuery = $derived( const minhasSolicitacoesQuery = $derived.by(() => {
funcionarioEstavel?._id if (!funcionarioIdParaQueries) return { data: [] };
? useQuery(api.ausencias.listarMinhasSolicitacoes, { return useQuery(api.ferias.listarMinhasSolicitacoes, {
funcionarioId: funcionarioEstavel._id funcionarioId: funcionarioIdParaQueries
}) });
: { data: [] } });
);
const meuTimeQuery = $derived( const minhasAusenciasQuery = $derived.by(() => {
funcionarioEstavel?._id if (!funcionarioIdParaQueries) return { data: [] };
? useQuery(api.times.obterTimeFuncionario, { return useQuery(api.ausencias.listarMinhasSolicitacoes, {
funcionarioId: funcionarioEstavel._id funcionarioId: funcionarioIdParaQueries
}) });
: { data: null } });
);
const meuTimeQuery = $derived.by(() => {
if (!funcionarioIdParaQueries) return { data: null };
return useQuery(api.times.obterTimeFuncionario, {
funcionarioId: funcionarioIdParaQueries
});
});
$effect(() => { $effect(() => {
if (meuTimeQuery?.data) { if (meuTimeQuery?.data && funcionarioIdParaQueries) {
meuTimeEstavel = meuTimeQuery.data; meuTimeEstavel = meuTimeQuery.data;
} else if (!funcionarioEstavel?._id) { } else if (
meuTimeQuery !== undefined &&
meuTimeQuery?.data === null &&
!funcionarioIdParaQueries
) {
meuTimeEstavel = null; meuTimeEstavel = null;
} }
}); });
const funcionario = $derived(funcionarioEstavel);
const solicitacoesSubordinados = $derived(solicitacoesSubordinadosQuery?.data || []);
const ausenciasSubordinados = $derived(ausenciasSubordinadosQuery?.data || []);
const meuTime = $derived(meuTimeEstavel);
$effect(() => { $effect(() => {
if (Array.isArray(minhasSolicitacoesQuery?.data)) { if (Array.isArray(minhasSolicitacoesQuery?.data) && funcionarioIdParaQueries) {
minhasSolicitacoesEstaveis = minhasSolicitacoesQuery.data; minhasSolicitacoesEstaveis = minhasSolicitacoesQuery.data;
} else if (!funcionarioEstavel?._id) { } else if (
minhasSolicitacoesQuery !== undefined &&
minhasSolicitacoesQuery?.data === null &&
!funcionarioIdParaQueries
) {
minhasSolicitacoesEstaveis = []; minhasSolicitacoesEstaveis = [];
} }
}); });
$effect(() => { $effect(() => {
if (Array.isArray(minhasAusenciasQuery?.data)) { if (Array.isArray(minhasAusenciasQuery?.data) && funcionarioIdParaQueries) {
minhasAusenciasEstaveis = minhasAusenciasQuery.data; minhasAusenciasEstaveis = minhasAusenciasQuery.data;
} else if (!funcionarioEstavel?._id) { } else if (
minhasAusenciasQuery !== undefined &&
minhasAusenciasQuery?.data === null &&
!funcionarioIdParaQueries
) {
minhasAusenciasEstaveis = []; minhasAusenciasEstaveis = [];
} }
}); });
// Deriveds - agora apenas extraem dados, não criam queries
const funcionario = $derived(funcionarioEstavel);
const solicitacoesSubordinados = $derived.by(() => {
if (!gestorIdDisponivel) return [];
return solicitacoesSubordinadosQuery?.data || [];
});
const ausenciasSubordinados = $derived.by(() => {
if (!gestorIdDisponivel) return [];
return ausenciasSubordinadosQuery?.data || [];
});
const meuTime = $derived(meuTimeEstavel);
const minhasSolicitacoes = $derived(minhasSolicitacoesEstaveis); const minhasSolicitacoes = $derived(minhasSolicitacoesEstaveis);
const minhasAusencias = $derived(minhasAusenciasEstaveis); const minhasAusencias = $derived(minhasAusenciasEstaveis);
const timesSubordinadosQuery = $derived(useQuery(api.times.listarSubordinadosDoGestorAtual, {}));
const timesSubordinados = $derived(timesSubordinadosQuery?.data || []); const timesSubordinados = $derived(timesSubordinadosQuery?.data || []);
// Times gerenciados usam a query que já infere o gestor logado
const meusTimesGestor = $derived(timesSubordinados); const meusTimesGestor = $derived(timesSubordinados);
const rolePermiteAprovacao = $derived( const rolePermiteAprovacao = $derived(
@@ -180,28 +205,26 @@
const ehGestor = $derived((timesSubordinados || []).length > 0 || rolePermiteAprovacao); const ehGestor = $derived((timesSubordinados || []).length > 0 || rolePermiteAprovacao);
// Query reativa para Meus Chamados (igual às outras abas) // Estados estáveis para Meus Chamados
const chamadosQuery = $derived(
currentUser?.data?._id ? useQuery(api.chamados.listarChamadosUsuario, {}) : null
);
// Estados estáveis para Meus Chamados (igual às outras abas)
let chamadosEstaveis = $state<Array<Doc<'tickets'>>>([]); let chamadosEstaveis = $state<Array<Doc<'tickets'>>>([]);
// Sincronizar query com estado estável (igual às outras abas) // ✅ CORRIGIDO: Sincronizar query com estado estável preservando durante carregamento
$effect(() => { $effect(() => {
if (chamadosQuery && Array.isArray(chamadosQuery.data)) { if (chamadosQuery && Array.isArray(chamadosQuery.data) && gestorIdDisponivel) {
chamadosEstaveis = chamadosQuery.data; chamadosEstaveis = chamadosQuery.data;
// Sincronizar com a store para compatibilidade
chamadosStore.setTickets(chamadosQuery.data); chamadosStore.setTickets(chamadosQuery.data);
// Selecionar primeiro chamado automaticamente se não houver seleção
if (!selectedTicketId && chamadosQuery.data.length > 0) { if (!selectedTicketId && chamadosQuery.data.length > 0) {
selectedTicketId = chamadosQuery.data[0]._id; selectedTicketId = chamadosQuery.data[0]._id;
} }
} else if (!currentUser?.data?._id) { } else if (
chamadosQuery !== undefined &&
chamadosQuery?.data === null &&
!gestorIdDisponivel
) {
chamadosEstaveis = []; chamadosEstaveis = [];
chamadosStore.setTickets([]); chamadosStore.setTickets([]);
} }
// Se chamadosQuery é undefined, ainda está carregando - manter estado atual
}); });
// Deriveds para Meus Chamados // Deriveds para Meus Chamados