import { Settings } from '@greenpay/models' export interface RememberedBankAccount { found: boolean cookieToken?: string accountToken?: string institution?: string last4?: string nickname?: string logoUrl?: string accounts?: RememberedBankAccount[] } function normalizeRemembered(data: RememberedBankAccount): RememberedBankAccount { const accounts = data.accounts?.filter((item) => item.accountToken) ?? [] if (!accounts.length && data.accountToken) { accounts.push({ found: true, cookieToken: data.cookieToken, accountToken: data.accountToken, institution: data.institution, last4: data.last4, nickname: data.nickname, logoUrl: data.logoUrl, }) } return { ...data, found: data.found || accounts.length > 0, accounts, } } async function postRememberedBank( ajaxUrl: string | undefined, nonce: string | undefined, action: string, fields: Record, ): Promise { if (!ajaxUrl) { return null } const formData = new FormData() formData.append('action', action) formData.append('_ajax_nonce', nonce ?? '') for (const [key, value] of Object.entries(fields)) { formData.append(key, value) } try { const response = await fetch(ajaxUrl, { method: 'POST', body: formData, credentials: 'same-origin', }) const json = (await response.json()) as { success: boolean data?: RememberedBankAccount } if (!json.success || !json.data) { return null } return normalizeRemembered(json.data) } catch { return null } } export async function captureRibbitBankAccount( accountToken: string, institutionName: string, settings: Settings | null | undefined, ): Promise { return postRememberedBank( settings?.ribbitCaptureAjaxUrl, settings?.ribbitCaptureNonce, 'capture_ribbit_bank_account', { AccountToken: accountToken, InstitutionName: institutionName, }, ) } export async function getRememberedBankAccount( cookieToken: string, settings: Settings | null | undefined, ): Promise { return postRememberedBank( settings?.ribbitRememberedAjaxUrl, settings?.ribbitRememberedNonce, 'get_remembered_bank_account', { CookieToken: cookieToken }, ) } export async function forgetRememberedBankAccount( cookieToken: string, settings: Settings | null | undefined, ): Promise { const result = await postRememberedBank( settings?.ribbitForgetAjaxUrl, settings?.ribbitForgetNonce, 'forget_ribbit_bank_account', { CookieToken: cookieToken }, ) return Boolean(result) }