diff --git a/extensions/general/enable-banking/components/BankSelector.tsx b/extensions/general/enable-banking/components/BankSelector.tsx index 5bbfba45..ffcea0da 100644 --- a/extensions/general/enable-banking/components/BankSelector.tsx +++ b/extensions/general/enable-banking/components/BankSelector.tsx @@ -1,10 +1,9 @@ 'use client' -import { useCallback, useEffect, useMemo, useState } from 'react' -import { Input } from '@/components/ui/input' -import { Button } from '@/components/ui/button' -import { Loader2, Search, RefreshCw } from 'lucide-react' +import { useCallback, useEffect, useRef, useState } from 'react' +import { Loader2 } from 'lucide-react' import { cn } from '@/lib/utils' +import Script from 'next/script' export interface Bank { name: string @@ -20,14 +19,18 @@ interface BankSelectorProps { className?: string } -const POPULAR_BANK_NAMES = [ - 'Nordea', - 'SEB', - 'Swedbank', - 'Handelsbanken', - 'Länsförsäkringar', - 'Skandia', - 'Danske Bank', +/** + * Popular Swedish banks shown as quick-access buttons above the full widget. + * Country is always 'SE' since we only support Swedish banks. + */ +const POPULAR_BANKS: Bank[] = [ + { name: 'Nordea', country: 'SE' }, + { name: 'SEB', country: 'SE' }, + { name: 'Swedbank', country: 'SE' }, + { name: 'Handelsbanken', country: 'SE' }, + { name: 'Länsförsäkringar', country: 'SE' }, + { name: 'Skandia', country: 'SE' }, + { name: 'Danske Bank', country: 'SE' }, ] export function BankSelector({ @@ -36,95 +39,47 @@ export function BankSelector({ connectingBankName = null, className, }: BankSelectorProps) { - const [banks, setBanks] = useState([]) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) - const [searchQuery, setSearchQuery] = useState('') + const widgetRef = useRef(null) + const [scriptReady, setScriptReady] = useState(false) - const fetchBanks = useCallback(async () => { - setLoading(true) - setError(null) - try { - const res = await fetch('/api/extensions/ext/enable-banking/banks') - if (!res.ok) throw new Error('Kunde inte hämta banklistan') - const data = await res.json() - setBanks(data.banks || []) - } catch (e) { - setError(e instanceof Error ? e.message : 'Något gick fel') - } finally { - setLoading(false) + // Stable ref so the event listener never goes stale + const onConnectRef = useRef(onConnect) + useEffect(() => { + onConnectRef.current = onConnect + }, [onConnect]) + + const handleSelected = useCallback((e: Event) => { + const detail = (e as CustomEvent).detail as { + name: string + country: string + psuType: string + sandbox: boolean } + onConnectRef.current({ + name: detail.name, + country: detail.country, + }) }, []) + // Attach event listener once the script is ready and the widget is in the DOM useEffect(() => { - fetchBanks() - }, [fetchBanks]) + if (!scriptReady) return + const widget = widgetRef.current + if (!widget) return - const popularBanks = useMemo( - () => - POPULAR_BANK_NAMES.map((name) => - banks.find((b) => b.name === name) - ).filter((b): b is Bank => b !== undefined), - [banks] - ) - - const filteredBanks = useMemo(() => { - if (!searchQuery.trim()) { - // Show all banks except popular ones - const popularSet = new Set(POPULAR_BANK_NAMES) - return banks - .filter((b) => !popularSet.has(b.name)) - .sort((a, b) => a.name.localeCompare(b.name, 'sv')) + widget.addEventListener('selected', handleSelected) + return () => { + widget.removeEventListener('selected', handleSelected) } - const q = searchQuery.toLowerCase() - return banks - .filter((b) => b.name.toLowerCase().includes(q)) - .sort((a, b) => a.name.localeCompare(b.name, 'sv')) - }, [banks, searchQuery]) - - if (loading) { - return ( -
- {/* Popular banks skeleton */} -
- {Array.from({ length: 7 }).map((_, i) => ( -
- ))} -
-
-
- {Array.from({ length: 4 }).map((_, i) => ( -
- ))} -
-
- ) - } - - if (error) { - return ( -
-

{error}

- -
- ) - } + }, [scriptReady, handleSelected]) return ( -
- {/* Popular banks grid */} - {popularBanks.length > 0 && !searchQuery.trim() && ( +
+ {/* Popular banks — one-click connect */} +
+

Populära banker

- {popularBanks.map((bank) => { + {POPULAR_BANKS.map((bank) => { const connecting = isConnecting && connectingBankName === bank.name return ( ) })}
- )} - - {/* Search */} -
- - setSearchQuery(e.target.value)} - placeholder="Sök bland alla banker..." - className="pl-9 h-9" - />
- {/* Bank list */} -
- {filteredBanks.length === 0 ? ( -

- {searchQuery.trim() ? 'Inga banker matchar sökningen' : 'Inga banker tillgängliga'} -

+ {/* Full bank list via Enable Banking widget — includes logos and search */} +
+

Alla banker

+