'use client' import { useState, useEffect } from 'react' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { useToast } from '@/components/ui/use-toast' import { DestructiveConfirmDialog, useDestructiveConfirm } from '@/components/ui/destructive-confirm-dialog' import { Loader2 } 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) 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) } } 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`, }) fetchConnections() } catch (error) { toast({ title: 'Fel', description: error instanceof Error ? error.message : 'Synkronisering misslyckades', variant: 'destructive', }) } 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') return (
{/* 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.

) }