From edd5b8627dc8ce12f6fbe3799a632a4fd710c047 Mon Sep 17 00:00:00 2001 From: Felipe Coutinho Date: Thu, 26 Feb 2026 17:23:37 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20corrigir=20hooks=20com=20depend=C3=AAnci?= =?UTF-8?q?as=20exaustivas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - magnet-lines: move useEffect antes do early return (hooks não podem ser chamados condicionalmente), adiciona disabled aos deps - use-month-period: memoiza [...MONTH_NAMES] com useMemo - lancamentos-filters: handleFilterChange em useCallback - inbox-page: sortByTimestamp em useCallback, atualiza deps dos useMemo - note-card: remove formattedDate não utilizado do useMemo Co-Authored-By: Claude Opus 4.6 --- components/anotacoes/note-card.tsx | 2 +- .../lancamentos/table/lancamentos-filters.tsx | 35 ++++++++++++------- components/magnet-lines.tsx | 13 +++---- components/pre-lancamentos/inbox-page.tsx | 21 ++++++----- hooks/use-month-period.ts | 2 +- 5 files changed, 43 insertions(+), 30 deletions(-) diff --git a/components/anotacoes/note-card.tsx b/components/anotacoes/note-card.tsx index e79dd0e..6c2cbb6 100644 --- a/components/anotacoes/note-card.tsx +++ b/components/anotacoes/note-card.tsx @@ -34,7 +34,7 @@ export function NoteCard({ onArquivar, isArquivadas = false, }: NoteCardProps) { - const { formattedDate, displayTitle } = useMemo(() => { + const { displayTitle } = useMemo(() => { const resolvedTitle = note.title.trim().length ? note.title : "Anotação sem título"; diff --git a/components/lancamentos/table/lancamentos-filters.tsx b/components/lancamentos/table/lancamentos-filters.tsx index ec26803..dc22014 100644 --- a/components/lancamentos/table/lancamentos-filters.tsx +++ b/components/lancamentos/table/lancamentos-filters.tsx @@ -6,7 +6,13 @@ import { RiFilter3Line, } from "@remixicon/react"; import { usePathname, useRouter, useSearchParams } from "next/navigation"; -import { type ReactNode, useEffect, useState, useTransition } from "react"; +import { + type ReactNode, + useCallback, + useEffect, + useState, + useTransition, +} from "react"; import { Button } from "@/components/ui/button"; import { Command, @@ -143,21 +149,24 @@ export function LancamentosFilters({ const getParamValue = (key: string) => searchParams.get(key) ?? FILTER_EMPTY_VALUE; - const handleFilterChange = (key: string, value: string | null) => { - const nextParams = new URLSearchParams(searchParams.toString()); + const handleFilterChange = useCallback( + (key: string, value: string | null) => { + const nextParams = new URLSearchParams(searchParams.toString()); - if (value && value !== FILTER_EMPTY_VALUE) { - nextParams.set(key, value); - } else { - nextParams.delete(key); - } + if (value && value !== FILTER_EMPTY_VALUE) { + nextParams.set(key, value); + } else { + nextParams.delete(key); + } - startTransition(() => { - router.replace(`${pathname}?${nextParams.toString()}`, { - scroll: false, + startTransition(() => { + router.replace(`${pathname}?${nextParams.toString()}`, { + scroll: false, + }); }); - }); - }; + }, + [searchParams, pathname, router], + ); const [searchValue, setSearchValue] = useState(searchParams.get("q") ?? ""); const currentSearchParam = searchParams.get("q") ?? ""; diff --git a/components/magnet-lines.tsx b/components/magnet-lines.tsx index 8335848..1b3be80 100644 --- a/components/magnet-lines.tsx +++ b/components/magnet-lines.tsx @@ -30,12 +30,8 @@ const MagnetLines: React.FC = ({ }) => { const containerRef = useRef(null); - // Se magnetlines estiver desabilitado, não renderiza nada - if (disabled) { - return null; - } - useEffect(() => { + if (disabled) return; const container = containerRef.current; if (!container) return; @@ -72,7 +68,12 @@ const MagnetLines: React.FC = ({ return () => { window.removeEventListener("pointermove", handlePointerMove); }; - }, []); + }, [disabled]); + + // Se magnetlines estiver desabilitado, não renderiza nada + if (disabled) { + return null; + } const total = rows * columns; const spans = Array.from({ length: total }, (_, i) => ( diff --git a/components/pre-lancamentos/inbox-page.tsx b/components/pre-lancamentos/inbox-page.tsx index 2c2f09e..799f035 100644 --- a/components/pre-lancamentos/inbox-page.tsx +++ b/components/pre-lancamentos/inbox-page.tsx @@ -52,24 +52,27 @@ export function InboxPage({ const [discardOpen, setDiscardOpen] = useState(false); const [itemToDiscard, setItemToDiscard] = useState(null); - const sortByTimestamp = (list: InboxItem[]) => - [...list].sort( - (a, b) => - new Date(b.notificationTimestamp).getTime() - - new Date(a.notificationTimestamp).getTime(), - ); + const sortByTimestamp = useCallback( + (list: InboxItem[]) => + [...list].sort( + (a, b) => + new Date(b.notificationTimestamp).getTime() - + new Date(a.notificationTimestamp).getTime(), + ), + [], + ); const sortedPending = useMemo( () => sortByTimestamp(pendingItems), - [pendingItems], + [pendingItems, sortByTimestamp], ); const sortedProcessed = useMemo( () => sortByTimestamp(processedItems), - [processedItems], + [processedItems, sortByTimestamp], ); const sortedDiscarded = useMemo( () => sortByTimestamp(discardedItems), - [discardedItems], + [discardedItems, sortByTimestamp], ); const handleProcessOpenChange = useCallback((open: boolean) => { diff --git a/hooks/use-month-period.ts b/hooks/use-month-period.ts index 11ca635..08d3d7a 100644 --- a/hooks/use-month-period.ts +++ b/hooks/use-month-period.ts @@ -18,7 +18,7 @@ export function useMonthPeriod() { const now = new Date(); const currentYear = now.getFullYear(); const currentMonthName = MONTH_NAMES[now.getMonth()]; - const optionsMeses = [...MONTH_NAMES]; + const optionsMeses = useMemo(() => [...MONTH_NAMES], []); const defaultMonth = currentMonthName; const defaultYear = currentYear.toString();