chore: snapshot sidebar layout antes de experimentar topbar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Felipe Coutinho
2026-02-22 19:57:42 +00:00
parent 82713d667f
commit f16140cb44
6 changed files with 703 additions and 444 deletions

View File

@@ -3,11 +3,13 @@ import {
useCallback,
useEffect,
useMemo,
useRef,
useState,
useTransition,
} from "react";
import { toast } from "sonner";
import {
checkFaturaStatusAction,
createLancamentoAction,
updateLancamentoAction,
} from "@/app/(dashboard)/lancamentos/actions";
@@ -30,6 +32,10 @@ import {
applyFieldDependencies,
buildLancamentoInitialState,
} from "@/lib/lancamentos/form-helpers";
import {
type FaturaWarning,
FaturaWarningDialog,
} from "../fatura-warning-dialog";
import { BasicFieldsSection } from "./basic-fields-section";
import { BoletoFieldsSection } from "./boleto-fields-section";
import { CategorySection } from "./category-section";
@@ -90,6 +96,10 @@ export function LancamentoDialog({
const [periodDirty, setPeriodDirty] = useState(false);
const [isPending, startTransition] = useTransition();
const [errorMessage, setErrorMessage] = useState<string | null>(null);
const [faturaWarning, setFaturaWarning] = useState<FaturaWarning | null>(
null,
);
const lastCheckedRef = useRef<string | null>(null);
useEffect(() => {
if (dialogOpen) {
@@ -111,6 +121,10 @@ export function LancamentoDialog({
);
setErrorMessage(null);
setPeriodDirty(false);
setFaturaWarning(null);
lastCheckedRef.current = null;
} else {
setFaturaWarning(null);
}
}, [
dialogOpen,
@@ -126,6 +140,40 @@ export function LancamentoDialog({
isImporting,
]);
useEffect(() => {
if (mode !== "create") return;
if (!dialogOpen) return;
if (formState.paymentMethod !== "Cartão de crédito") return;
if (!formState.cartaoId) return;
const checkKey = `${formState.cartaoId}:${formState.period}`;
if (checkKey === lastCheckedRef.current) return;
lastCheckedRef.current = checkKey;
checkFaturaStatusAction(formState.cartaoId, formState.period).then(
(result) => {
if (result?.shouldSuggestNext) {
setFaturaWarning({
nextPeriod: result.nextPeriod,
cardName: result.cardName,
isPaid: result.isPaid,
isAfterClosing: result.isAfterClosing,
closingDay: result.closingDay,
currentPeriod: formState.period,
});
} else {
setFaturaWarning(null);
}
},
);
}, [
mode,
dialogOpen,
formState.paymentMethod,
formState.cartaoId,
formState.period,
]);
const primaryPagador = formState.pagadorId;
const secondaryPagadorOptions = useMemo(
@@ -392,103 +440,114 @@ export function LancamentoDialog({
const disableCartaoSelect = Boolean(lockCartaoSelection && mode === "create");
return (
<Dialog open={dialogOpen} onOpenChange={setDialogOpen}>
{trigger ? <DialogTrigger asChild>{trigger}</DialogTrigger> : null}
<DialogContent className="sm:max-w-xl p-6 sm:px-8">
<DialogHeader>
<DialogTitle>{title}</DialogTitle>
<DialogDescription>{description}</DialogDescription>
</DialogHeader>
<>
<Dialog open={dialogOpen} onOpenChange={setDialogOpen}>
{trigger ? <DialogTrigger asChild>{trigger}</DialogTrigger> : null}
<DialogContent className="sm:max-w-xl p-6 sm:px-8">
<DialogHeader>
<DialogTitle>{title}</DialogTitle>
<DialogDescription>{description}</DialogDescription>
</DialogHeader>
<form
className="space-y-2 -mx-6 max-h-[80vh] overflow-y-auto px-6 pb-1"
onSubmit={handleSubmit}
noValidate
>
<BasicFieldsSection
formState={formState}
onFieldChange={handleFieldChange}
estabelecimentos={estabelecimentos}
/>
<CategorySection
formState={formState}
onFieldChange={handleFieldChange}
categoriaOptions={categoriaOptions}
categoriaGroups={categoriaGroups}
isUpdateMode={isUpdateMode}
hideTransactionType={
Boolean(isNewWithType) && !forceShowTransactionType
}
/>
{!isUpdateMode ? (
<SplitAndSettlementSection
<form
className="space-y-2 -mx-6 max-h-[80vh] overflow-y-auto px-6 pb-1"
onSubmit={handleSubmit}
noValidate
>
<BasicFieldsSection
formState={formState}
onFieldChange={handleFieldChange}
showSettledToggle={showSettledToggle}
estabelecimentos={estabelecimentos}
/>
) : null}
<PagadorSection
formState={formState}
onFieldChange={handleFieldChange}
pagadorOptions={pagadorOptions}
secondaryPagadorOptions={secondaryPagadorOptions}
totalAmount={totalAmount}
/>
<PaymentMethodSection
formState={formState}
onFieldChange={handleFieldChange}
contaOptions={contaOptions}
cartaoOptions={cartaoOptions}
isUpdateMode={isUpdateMode}
disablePaymentMethod={disablePaymentMethod}
disableCartaoSelect={disableCartaoSelect}
/>
{showDueDate ? (
<BoletoFieldsSection
<CategorySection
formState={formState}
onFieldChange={handleFieldChange}
showPaymentDate={showPaymentDate}
categoriaOptions={categoriaOptions}
categoriaGroups={categoriaGroups}
isUpdateMode={isUpdateMode}
hideTransactionType={
Boolean(isNewWithType) && !forceShowTransactionType
}
/>
) : null}
{!isUpdateMode ? (
<ConditionSection
{!isUpdateMode ? (
<SplitAndSettlementSection
formState={formState}
onFieldChange={handleFieldChange}
showSettledToggle={showSettledToggle}
/>
) : null}
<PagadorSection
formState={formState}
onFieldChange={handleFieldChange}
showInstallments={showInstallments}
showRecurrence={showRecurrence}
pagadorOptions={pagadorOptions}
secondaryPagadorOptions={secondaryPagadorOptions}
totalAmount={totalAmount}
/>
) : null}
<NoteSection
formState={formState}
onFieldChange={handleFieldChange}
/>
<PaymentMethodSection
formState={formState}
onFieldChange={handleFieldChange}
contaOptions={contaOptions}
cartaoOptions={cartaoOptions}
isUpdateMode={isUpdateMode}
disablePaymentMethod={disablePaymentMethod}
disableCartaoSelect={disableCartaoSelect}
/>
{errorMessage ? (
<p className="text-sm text-destructive">{errorMessage}</p>
) : null}
{showDueDate ? (
<BoletoFieldsSection
formState={formState}
onFieldChange={handleFieldChange}
showPaymentDate={showPaymentDate}
/>
) : null}
<DialogFooter className="gap-3">
<Button
type="button"
variant="outline"
onClick={() => setDialogOpen(false)}
disabled={isPending}
>
Cancelar
</Button>
<Button type="submit" disabled={isPending}>
{isPending ? "Salvando..." : submitLabel}
</Button>
</DialogFooter>
</form>
</DialogContent>
</Dialog>
{!isUpdateMode ? (
<ConditionSection
formState={formState}
onFieldChange={handleFieldChange}
showInstallments={showInstallments}
showRecurrence={showRecurrence}
/>
) : null}
<NoteSection
formState={formState}
onFieldChange={handleFieldChange}
/>
{errorMessage ? (
<p className="text-sm text-destructive">{errorMessage}</p>
) : null}
<DialogFooter className="gap-3">
<Button
type="button"
variant="outline"
onClick={() => setDialogOpen(false)}
disabled={isPending}
>
Cancelar
</Button>
<Button type="submit" disabled={isPending}>
{isPending ? "Salvando..." : submitLabel}
</Button>
</DialogFooter>
</form>
</DialogContent>
</Dialog>
<FaturaWarningDialog
warning={faturaWarning}
onConfirm={(nextPeriod) => {
handleFieldChange("period", nextPeriod);
setFaturaWarning(null);
}}
onCancel={() => setFaturaWarning(null)}
/>
</>
);
}