"use client"; import { closestCenter, DndContext, type DragEndEvent, KeyboardSensor, PointerSensor, useSensor, useSensors, } from "@dnd-kit/core"; import { arrayMove, SortableContext, useSortable, verticalListSortingStrategy, } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import { RiDragMove2Line } from "@remixicon/react"; import { useRouter } from "next/navigation"; import { useEffect, useState, useTransition } from "react"; import { toast } from "sonner"; import { updatePreferencesAction } from "@/app/(dashboard)/ajustes/actions"; import { useFont } from "@/components/font-provider"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Switch } from "@/components/ui/switch"; import { DEFAULT_LANCAMENTOS_COLUMN_ORDER, LANCAMENTOS_COLUMN_LABELS, } from "@/lib/lancamentos/column-order"; import { FONT_OPTIONS } from "@/public/fonts/font_index"; interface PreferencesFormProps { disableMagnetlines: boolean; extratoNoteAsColumn: boolean; lancamentosColumnOrder: string[] | null; systemFont: string; moneyFont: string; } function SortableColumnItem({ id }: { id: string }) { const { attributes, listeners, setNodeRef, transform, transition, isDragging, } = useSortable({ id }); const style = { transform: CSS.Transform.toString(transform), transition, }; const label = LANCAMENTOS_COLUMN_LABELS[id] ?? id; return (
{label}
); } export function PreferencesForm({ disableMagnetlines, extratoNoteAsColumn: initialExtratoNoteAsColumn, lancamentosColumnOrder: initialColumnOrder, systemFont: initialSystemFont, moneyFont: initialMoneyFont, }: PreferencesFormProps) { const router = useRouter(); const [isPending, startTransition] = useTransition(); const [magnetlinesDisabled, setMagnetlinesDisabled] = useState(disableMagnetlines); const [extratoNoteAsColumn, setExtratoNoteAsColumn] = useState( initialExtratoNoteAsColumn, ); const [columnOrder, setColumnOrder] = useState( initialColumnOrder && initialColumnOrder.length > 0 ? initialColumnOrder : DEFAULT_LANCAMENTOS_COLUMN_ORDER, ); const [selectedSystemFont, setSelectedSystemFont] = useState(initialSystemFont); const [selectedMoneyFont, setSelectedMoneyFont] = useState(initialMoneyFont); const sensors = useSensors( useSensor(PointerSensor, { activationConstraint: { distance: 8 } }), useSensor(KeyboardSensor), ); const handleColumnDragEnd = (event: DragEndEvent) => { const { active, over } = event; if (over && active.id !== over.id) { setColumnOrder((items) => { const oldIndex = items.indexOf(active.id as string); const newIndex = items.indexOf(over.id as string); return arrayMove(items, oldIndex, newIndex); }); } }; const fontCtx = useFont(); // Live preview: update CSS vars when font selection changes useEffect(() => { fontCtx.setSystemFont(selectedSystemFont); }, [selectedSystemFont, fontCtx.setSystemFont]); useEffect(() => { fontCtx.setMoneyFont(selectedMoneyFont); }, [selectedMoneyFont, fontCtx.setMoneyFont]); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); startTransition(async () => { const result = await updatePreferencesAction({ disableMagnetlines: magnetlinesDisabled, extratoNoteAsColumn, lancamentosColumnOrder: columnOrder, systemFont: selectedSystemFont, moneyFont: selectedMoneyFont, }); if (result.success) { toast.success(result.message); router.refresh(); } else { toast.error(result.error); } }); }; return (
{/* Seção 1: Tipografia */}

Tipografia

Personalize as fontes usadas na interface e nos valores monetários.

{/* Fonte do sistema */}
{/* Fonte de valores */}
{/* Seção: Extrato / Lançamentos */}

Extrato e lançamentos

Como exibir anotações e a ordem das colunas na tabela de movimentações.

Quando ativo, as anotações aparecem em uma coluna na tabela. Quando desativado, aparecem em um balão ao passar o mouse no ícone.

Arraste os itens para definir a ordem em que as colunas aparecem na tabela do extrato e dos lançamentos.

{columnOrder.map((id) => ( ))}
{/* Seção: Dashboard */}

Dashboard

Opções que afetam a experiência no painel principal.

Remove o recurso de linhas magnéticas do sistema.

); }