'use client' import { useTranslations } from 'next-intl' import { useState } from 'react' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { BankNameCombobox } from '@/components/settings/BankNameCombobox' import { validateBankgiroNumber, formatBankgiroNumber, validatePlusgiroNumber, formatPlusgiroNumber } from '@/lib/bankgiro/luhn' import { normaliseSwish, isValidSwish } from '@/lib/payments/swish' import { ENABLED_EXTENSION_IDS } from '@/lib/extensions/_generated/enabled-extensions' import type { CompanySettings } from '@/types' interface BankDetailsFormProps { settings: CompanySettings } export function BankDetailsForm({ settings }: BankDetailsFormProps) { const t = useTranslations('settings_bank_details_form') const [bankgiroError, setBankgiroError] = useState(null) const [plusgiroError, setPlusgiroError] = useState(null) const [clearingError, setClearingError] = useState(null) const [accountNumberError, setAccountNumberError] = useState(null) const [swishError, setSwishError] = useState(null) const hasBankingExtension = ENABLED_EXTENSION_IDS.has('enable-banking') return (

{t('heading')}

{t('subheading')}

{ e.target.value = e.target.value.replace(/\D/g, '') }} onBlur={(e) => { const val = e.target.value.trim() if (!val) { setClearingError(null); return } setClearingError(!/^\d{4,5}$/.test(val) ? t('clearing_error') : null) }} /> {clearingError &&

{clearingError}

}
{ e.target.value = e.target.value.replace(/\D/g, '') }} onBlur={(e) => { const val = e.target.value.trim() if (!val) { setAccountNumberError(null); return } setAccountNumberError(!/^\d{6,12}$/.test(val) ? t('account_number_error') : null) }} /> {accountNumberError &&

{accountNumberError}

}
{ const val = e.target.value.trim() if (!val) { setBankgiroError(null); return } if (validateBankgiroNumber(val)) { e.target.value = formatBankgiroNumber(val) setBankgiroError(null) } else { setBankgiroError(t('bankgiro_error')) } }} /> {bankgiroError &&

{bankgiroError}

}
{ const val = e.target.value.trim() if (!val) { setPlusgiroError(null); return } if (validatePlusgiroNumber(val)) { e.target.value = formatPlusgiroNumber(val) setPlusgiroError(null) } else { setPlusgiroError(t('plusgiro_error')) } }} /> {plusgiroError &&

{plusgiroError}

}
{ const val = normaliseSwish(e.target.value) if (!val) { setSwishError(null); e.target.value = ''; return } if (isValidSwish(val)) { e.target.value = val setSwishError(null) } else { setSwishError(t('swish_error')) } }} /> {swishError &&

{swishError}

}
) } /** Validate bank fields from FormData. Returns error messages or null. */ export function validateBankFields(formData: FormData): { field: string; message: string }[] { const errors: { field: string; message: string }[] = [] const clearing = (formData.get('clearing_number') as string || '').trim() const account = (formData.get('account_number') as string || '').trim() const bankgiro = (formData.get('bankgiro') as string || '').trim() const plusgiro = (formData.get('plusgiro') as string || '').trim() const swish = normaliseSwish(formData.get('swish') as string) if (clearing && !/^\d{4,5}$/.test(clearing)) { errors.push({ field: 'clearing_number', message: 'Clearingnummer måste vara 4-5 siffror' }) } if (account && !/^\d{6,12}$/.test(account)) { errors.push({ field: 'account_number', message: 'Kontonummer måste vara 6-12 siffror' }) } if (bankgiro && !validateBankgiroNumber(bankgiro)) { errors.push({ field: 'bankgiro', message: 'Ogiltigt bankgironummer' }) } if (plusgiro && !validatePlusgiroNumber(plusgiro)) { errors.push({ field: 'plusgiro', message: 'Ogiltigt plusgironummer' }) } if (swish && !isValidSwish(swish)) { errors.push({ field: 'swish', message: 'Ogiltigt Swish-nummer (företagsnummer 123XXXXXXX eller mobilnummer 07XXXXXXXX)' }) } return errors }