From 0054b93d3cb059a03aea0142ec2ba9dbdb29284e Mon Sep 17 00:00:00 2001 From: rever-tecnologia Date: Fri, 5 Dec 2025 10:24:53 -0300 Subject: [PATCH] Improve emprestimos UX with skeleton loading and optimistic devolver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace spinner with skeleton table rows during loading - Apply optimistic closing for devolver dialog (instant feedback) - Use toast.promise for background mutation with loading state - Remove unnecessary isSubmitting state from devolver button - Maintain table layout during filter changes (no layout shift) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../emprestimos/emprestimos-page-client.tsx | 57 +++++++++---------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/src/app/emprestimos/emprestimos-page-client.tsx b/src/app/emprestimos/emprestimos-page-client.tsx index ba7b699..8b63966 100644 --- a/src/app/emprestimos/emprestimos-page-client.tsx +++ b/src/app/emprestimos/emprestimos-page-client.tsx @@ -343,27 +343,31 @@ export function EmprestimosPageClient() { const handleDevolver = useCallback(async () => { if (!selectedEmprestimoId || !convexUserId) return - setIsSubmitting(true) - try { - const result = await devolverEmprestimo({ - id: selectedEmprestimoId as Id<"emprestimos">, + // Fechamento otimista - fecha dialog imediatamente + const emprestimoId = selectedEmprestimoId + const observacoes = formObservacoes + setIsDevolverDialogOpen(false) + setSelectedEmprestimoId(null) + setFormObservacoes("") + + // Executa mutacao em background com toast de loading + toast.promise( + devolverEmprestimo({ + id: emprestimoId as Id<"emprestimos">, updatedBy: convexUserId as Id<"users">, - observacoes: formObservacoes || undefined, - }) - if (result.multaCalculada) { - toast.success(`Empréstimo devolvido com multa de R$ ${result.multaCalculada.toFixed(2)}.`) - } else { - toast.success("Empréstimo devolvido com sucesso.") + observacoes: observacoes || undefined, + }), + { + loading: "Registrando devolucao...", + success: (result) => { + if (result.multaCalculada) { + return `Emprestimo devolvido com multa de R$ ${result.multaCalculada.toFixed(2)}.` + } + return "Emprestimo devolvido com sucesso." + }, + error: "Falha ao registrar devolucao.", } - setIsDevolverDialogOpen(false) - setSelectedEmprestimoId(null) - setFormObservacoes("") - } catch (error) { - console.error("[emprestimos] Falha ao devolver", error) - toast.error("Falha ao registrar devolução.") - } finally { - setIsSubmitting(false) - } + ) }, [selectedEmprestimoId, convexUserId, formObservacoes, devolverEmprestimo]) const openDevolverDialog = useCallback((id: string) => { @@ -823,18 +827,9 @@ export function EmprestimosPageClient() { -