'use client' import { useState, useEffect } from 'react' import Link from 'next/link' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { useToast } from '@/components/ui/use-toast' import { DestructiveConfirmDialog, useDestructiveConfirm } from '@/components/ui/destructive-confirm-dialog' import { Loader2, Upload } from 'lucide-react' import { createClient } from '@/lib/supabase/client' import { BankSelector, type Bank } from './BankSelector' import { BankConnectionStatus } from './BankConnectionStatus' import type { BankConnection } from '@/types' /** * Self-contained banking settings panel for the enable-banking extension. * Loaded dynamically by the settings panel registry. */ export default function BankingSettingsPanel() { const { toast } = useToast() const supabase = createClient() const { dialogProps, confirm } = useDestructiveConfirm() const [bankConnections, setBankConnections] = useState([]) const [syncingConnectionId, setSyncingConnectionId] = useState(null) const [isConnecting, setIsConnecting] = useState(false) const [connectingBankName, setConnectingBankName] = useState(null) const [isLoading, setIsLoading] = useState(true) const [showCsvFallback, setShowCsvFallback] = useState(false) useEffect(() => { fetchConnections() }, []) async function fetchConnections() { setIsLoading(true) const { data: { user } } = await supabase.auth.getUser() if (!user) return const { data: connections } = await supabase .from('bank_connections') .select('*') .eq('user_id', user.id) .order('created_at', { ascending: false }) setBankConnections(connections || []) setIsLoading(false) } async function handleConnectBank(bank: Bank) { setIsConnecting(true) setConnectingBankName(bank.name) try { const response = await fetch('/api/extensions/ext/enable-banking/connect', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ aspsp_name: bank.name, aspsp_country: bank.country }), }) const data = await response.json() if (!response.ok) { throw new Error(data.error) } window.location.href = data.authorization_url } catch (error) { toast({ title: 'Fel', description: error instanceof Error ? error.message : 'Kunde inte ansluta bank', variant: 'destructive', }) setIsConnecting(false) setConnectingBankName(null) setShowCsvFallback(true) } } async function handleSyncTransactions(connectionId: string) { setSyncingConnectionId(connectionId) try { const response = await fetch('/api/extensions/ext/enable-banking/sync', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ connection_id: connectionId }), }) const data = await response.json() if (!response.ok) { throw new Error(data.error) } toast({ title: 'Synkronisering klar', description: `${data.imported} nya transaktioner importerade`, }) setShowCsvFallback(false) fetchConnections() } catch (error) { toast({ title: 'Fel', description: error instanceof Error ? error.message : 'Synkronisering misslyckades', variant: 'destructive', }) setShowCsvFallback(true) } setSyncingConnectionId(null) } async function handleDisconnectBank(connectionId: string) { const ok = await confirm({ title: 'Koppla bort bank?', description: 'PSD2-samtycket kommer återkallas. Befintliga transaktioner påverkas inte.', confirmLabel: 'Koppla bort', variant: 'warning', }) if (!ok) return try { const response = await fetch('/api/extensions/ext/enable-banking/disconnect', { method: 'DELETE', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ connection_id: connectionId }), }) if (!response.ok) { const data = await response.json() throw new Error(data.error || 'Disconnect failed') } toast({ title: 'Bank bortkopplad', description: 'Bankanslutningen och PSD2-samtycket har återkallats', }) fetchConnections() } catch (error) { toast({ title: 'Fel', description: error instanceof Error ? error.message : 'Kunde inte koppla bort bank', variant: 'destructive', }) } } if (isLoading) { return (
) } const activeConnections = bankConnections.filter((c) => c.status === 'active') const actionRequiredConnections = bankConnections.filter((c) => ['expired', 'error'].includes(c.status)) return (
{/* Persistent CSV fallback after connection/sync failure */} {showCsvFallback && (

Har du problem med bankanslutningen? Du kan importera transaktioner manuellt via bankfil.

)} {/* Action required — expired/error connections */} {actionRequiredConnections.length > 0 && ( Åtgärd krävs Dessa anslutningar behöver uppmärksamhet. {actionRequiredConnections.map((connection) => ( ))} )} {/* Connected banks */} {activeConnections.length > 0 && ( Anslutna banker {activeConnections.map((connection) => ( ))} )} {/* Connect new bank */} Anslut ny bank Välj din bank nedan för att koppla ditt konto via PSD2. {/* Info about PSD2 */} Om bankintegration (PSD2) Automatisk import av transaktioner via PSD2 open banking. Samtycket gäller i 90 dagar och behöver sedan förnyas.

Vi använder säker bankintegration (PSD2). Vi kan endast läsa transaktioner, aldrig flytta pengar. Du kan också importera transaktioner manuellt via bankfiler på importsidan.

) }