import { useEffect } from "react";
import { useNavigate } from "@tanstack/react-router";
import { toast } from "sonner";
import {
Banknote,
ArrowRight,
Lock,
Loader2,
Trash2,
CheckCircle2,
AlertCircle,
} from "lucide-react";
import { Button, Card, Chip } from "@rubis/ui";
import { useSubscription } from "@/lib/billing";
import {
useBankConnections,
useBankingSettings,
useBankingStatus,
useDisconnectBank,
useInitBanking,
useUpdateBankingSettings,
type BankConnection,
type BankingReconciliationMode,
} from "@/lib/banking";
/**
* BankingSection — carte Banque dans /parametres.
*
* 3 états visuels :
* - Free : upsell card (CTA "Passer au plan Pro")
* - Pro/Business + 0 banque : carte vide avec CTA "Connecter une banque"
* - Pro/Business + 1 banque : carte connectée (logo, accounts, bouton
* déconnecter, toggle mode de réconciliation)
*
* Détection ?banking=connected|error dans l'URL : affiche un toast et
* nettoie l'URL (replace, pas de history entry). Évite le toast en
* boucle si on F5.
*/
type BankingSectionProps = {
/** Params lus depuis la route parent (cf. parametres.tsx → searchSchema). */
callbackStatus?: "connected" | "error";
callbackReason?: string;
};
export function BankingSection({
callbackStatus,
callbackReason,
}: BankingSectionProps) {
const { data: status } = useBankingStatus();
const { data: sub } = useSubscription();
const isPaid = sub?.plan === "pro" || sub?.plan === "business";
const navigate = useNavigate();
const connectionsQuery = useBankConnections({
enabled: status?.enabled === true && isPaid,
});
// Toast post-callback : on lit la search bag et on nettoie l'URL.
useEffect(() => {
if (!callbackStatus) return;
if (callbackStatus === "connected") {
toast.success("Banque connectée. Récupération des comptes en cours.");
void connectionsQuery.refetch();
} else {
toast.error(
callbackReason
? `Connexion impossible (${callbackReason}). Réessayez.`
: "Connexion impossible. Réessayez.",
);
}
// Nettoie l'URL pour ne pas re-déclencher le toast au refresh / nav.
void navigate({
to: "/parametres",
search: {},
replace: true,
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [callbackStatus, callbackReason]);
if (!isPaid) {
return
Plan Pro ou Business requis
Connectez votre banque pour détecter automatiquement les factures
payées et arrêter les relances inutiles.
Aucune banque connectée
Rubis lit vos virements entrants pour détecter les factures payées. Lecture seule. Aucun déplacement de fonds.
{connection.bankName}
{a.name}
{a.ibanMasked && ({a.ibanMasked}
)}{(a.balanceCents / 100).toLocaleString("fr-FR", { style: "currency", currency: a.currency, })}
)}Réconciliation
Quand un virement matche une facture en attente, Rubis peut soit vous suggérer le match, soit la marquer payée automatiquement.