diff --git a/src/assets/img/banks/ansar.png b/src/assets/img/banks/ansar.png new file mode 100644 index 0000000..b27ad0a Binary files /dev/null and b/src/assets/img/banks/ansar.png differ diff --git a/src/assets/img/banks/ayandeh.png b/src/assets/img/banks/ayandeh.png index 7f4810e..03f9acc 100644 Binary files a/src/assets/img/banks/ayandeh.png and b/src/assets/img/banks/ayandeh.png differ diff --git a/src/assets/img/banks/dey.png b/src/assets/img/banks/dey.png new file mode 100644 index 0000000..f2cd473 Binary files /dev/null and b/src/assets/img/banks/dey.png differ diff --git a/src/assets/img/banks/eghtesad_novin.png b/src/assets/img/banks/eghtesad_novin.png new file mode 100644 index 0000000..37aa944 Binary files /dev/null and b/src/assets/img/banks/eghtesad_novin.png differ diff --git a/src/assets/img/banks/gardeshgari.png b/src/assets/img/banks/gardeshgari.png new file mode 100644 index 0000000..83b85ec Binary files /dev/null and b/src/assets/img/banks/gardeshgari.png differ diff --git a/src/assets/img/banks/ghavamin.png b/src/assets/img/banks/ghavamin.png new file mode 100644 index 0000000..8fef54a Binary files /dev/null and b/src/assets/img/banks/ghavamin.png differ diff --git a/src/assets/img/banks/hekmat.png b/src/assets/img/banks/hekmat.png new file mode 100644 index 0000000..baf5733 Binary files /dev/null and b/src/assets/img/banks/hekmat.png differ diff --git a/src/assets/img/banks/iran_venezuela.png b/src/assets/img/banks/iran_venezuela.png new file mode 100644 index 0000000..e12f0f5 Binary files /dev/null and b/src/assets/img/banks/iran_venezuela.png differ diff --git a/src/assets/img/banks/iran_zamin.png b/src/assets/img/banks/iran_zamin.png new file mode 100644 index 0000000..4799a30 Binary files /dev/null and b/src/assets/img/banks/iran_zamin.png differ diff --git a/src/assets/img/banks/karafarin.png b/src/assets/img/banks/karafarin.png new file mode 100644 index 0000000..e09a05a Binary files /dev/null and b/src/assets/img/banks/karafarin.png differ diff --git a/src/assets/img/banks/keshavarzi.png b/src/assets/img/banks/keshavarzi.png index 23b1ef3..cc2680f 100644 Binary files a/src/assets/img/banks/keshavarzi.png and b/src/assets/img/banks/keshavarzi.png differ diff --git a/src/assets/img/banks/khavarmianeh.svg b/src/assets/img/banks/khavarmianeh.svg new file mode 100644 index 0000000..ef59c60 --- /dev/null +++ b/src/assets/img/banks/khavarmianeh.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/banks/maskan.png b/src/assets/img/banks/maskan.png new file mode 100644 index 0000000..a28b86d Binary files /dev/null and b/src/assets/img/banks/maskan.png differ diff --git a/src/assets/img/banks/mehr_iran.png b/src/assets/img/banks/mehr_iran.png new file mode 100644 index 0000000..187ef59 Binary files /dev/null and b/src/assets/img/banks/mehr_iran.png differ diff --git a/src/assets/img/banks/melal.png b/src/assets/img/banks/melal.png new file mode 100644 index 0000000..62fe59b Binary files /dev/null and b/src/assets/img/banks/melal.png differ diff --git a/src/assets/img/banks/mellat.png b/src/assets/img/banks/mellat.png index 19e2621..c340965 100644 Binary files a/src/assets/img/banks/mellat.png and b/src/assets/img/banks/mellat.png differ diff --git a/src/assets/img/banks/melli.png b/src/assets/img/banks/melli.png index 3ec5d07..ddaae69 100644 Binary files a/src/assets/img/banks/melli.png and b/src/assets/img/banks/melli.png differ diff --git a/src/assets/img/banks/parsian.png b/src/assets/img/banks/parsian.png new file mode 100644 index 0000000..797b216 Binary files /dev/null and b/src/assets/img/banks/parsian.png differ diff --git a/src/assets/img/banks/parsiyan.png b/src/assets/img/banks/parsiyan.png index dfde304..797b216 100644 Binary files a/src/assets/img/banks/parsiyan.png and b/src/assets/img/banks/parsiyan.png differ diff --git a/src/assets/img/banks/pasargad.png b/src/assets/img/banks/pasargad.png index 03a3743..b499ed4 100644 Binary files a/src/assets/img/banks/pasargad.png and b/src/assets/img/banks/pasargad.png differ diff --git a/src/assets/img/banks/postbank.png b/src/assets/img/banks/postbank.png new file mode 100644 index 0000000..6949229 Binary files /dev/null and b/src/assets/img/banks/postbank.png differ diff --git a/src/assets/img/banks/refah.png b/src/assets/img/banks/refah.png index 91e6417..9e9e56c 100644 Binary files a/src/assets/img/banks/refah.png and b/src/assets/img/banks/refah.png differ diff --git a/src/assets/img/banks/resalat.png b/src/assets/img/banks/resalat.png new file mode 100644 index 0000000..014b7b3 Binary files /dev/null and b/src/assets/img/banks/resalat.png differ diff --git a/src/assets/img/banks/saderat.png b/src/assets/img/banks/saderat.png index 0ea8e86..5957ef0 100644 Binary files a/src/assets/img/banks/saderat.png and b/src/assets/img/banks/saderat.png differ diff --git a/src/assets/img/banks/saman.png b/src/assets/img/banks/saman.png index ff22de6..ba60880 100644 Binary files a/src/assets/img/banks/saman.png and b/src/assets/img/banks/saman.png differ diff --git a/src/assets/img/banks/sanatomadan.png b/src/assets/img/banks/sanatomadan.png index 8635f90..9c2bdc0 100644 Binary files a/src/assets/img/banks/sanatomadan.png and b/src/assets/img/banks/sanatomadan.png differ diff --git a/src/assets/img/banks/sarmayeh.png b/src/assets/img/banks/sarmayeh.png index f17a241..9d6c529 100644 Binary files a/src/assets/img/banks/sarmayeh.png and b/src/assets/img/banks/sarmayeh.png differ diff --git a/src/assets/img/banks/sepah.png b/src/assets/img/banks/sepah.png index 1012546..5c3f0af 100644 Binary files a/src/assets/img/banks/sepah.png and b/src/assets/img/banks/sepah.png differ diff --git a/src/assets/img/banks/shahr.png b/src/assets/img/banks/shahr.png new file mode 100644 index 0000000..5897250 Binary files /dev/null and b/src/assets/img/banks/shahr.png differ diff --git a/src/assets/img/banks/sina.png b/src/assets/img/banks/sina.png new file mode 100644 index 0000000..8a12bc4 Binary files /dev/null and b/src/assets/img/banks/sina.png differ diff --git a/src/assets/img/banks/tejarat.png b/src/assets/img/banks/tejarat.png new file mode 100644 index 0000000..f99a9ba Binary files /dev/null and b/src/assets/img/banks/tejarat.png differ diff --git a/src/assets/img/banks/tosee_saderat.png b/src/assets/img/banks/tosee_saderat.png new file mode 100644 index 0000000..24b4e17 Binary files /dev/null and b/src/assets/img/banks/tosee_saderat.png differ diff --git a/src/assets/img/banks/tosee_taavon.png b/src/assets/img/banks/tosee_taavon.png new file mode 100644 index 0000000..55abd6d Binary files /dev/null and b/src/assets/img/banks/tosee_taavon.png differ diff --git a/src/utils/bankBranding.ts b/src/utils/bankBranding.ts index 952538f..acd07de 100644 --- a/src/utils/bankBranding.ts +++ b/src/utils/bankBranding.ts @@ -1,137 +1,134 @@ -import ayandehLogo from '@/assets/img/banks/ayandeh.png' -import keshavarziLogo from '@/assets/img/banks/keshavarzi.png' -import mellatLogo from '@/assets/img/banks/mellat.png' -import melliLogo from '@/assets/img/banks/melli.png' -import parsiyanLogo from '@/assets/img/banks/parsiyan.png' -import pasargadLogo from '@/assets/img/banks/pasargad.png' -import refahLogo from '@/assets/img/banks/refah.png' -import saderatLogo from '@/assets/img/banks/saderat.png' -import samanLogo from '@/assets/img/banks/saman.png' -import sanatomadanLogo from '@/assets/img/banks/sanatomadan.png' -import sarmayehLogo from '@/assets/img/banks/sarmayeh.png' -import sepahLogo from '@/assets/img/banks/sepah.png' +import type { Card } from '@/models/wallet' -const BANK_ACCENT_COLORS: Record = { - 'بانک پاسارگاد': '#1f7a54', - 'پاسارگاد': '#1f7a54', - 'PASARGAD': '#1f7a54', - 'بانک سامان': '#2f63d8', - 'سامان': '#2f63d8', - 'SAMAN': '#2f63d8', - 'بانک پارسیان': '#c9a227', - 'پارسیان': '#c9a227', - 'PARSIAN': '#c9a227', - 'بانک ملی': '#4b5e96', - 'ملی': '#4b5e96', - 'MELLI': '#4b5e96', - 'بانک ملت': '#c0392b', - 'ملت': '#c0392b', - 'MELLAT': '#c0392b', - 'بانک صادرات': '#1a6fb3', - 'صادرات': '#1a6fb3', - 'SADERAT': '#1a6fb3', - 'بانک صنعت و معدن': '#8b6914', - 'صنعت و معدن': '#8b6914', - 'صنعت معدن': '#8b6914', - 'SANATOMADAN': '#8b6914', - 'SANAT_MADAN': '#8b6914', - 'بانک آینده': '#2b2f6b', - 'آینده': '#2b2f6b', - 'AYANDEH': '#2b2f6b', - 'بانک کشاورزی': '#2e8b57', - 'کشاورزی': '#2e8b57', - 'KESHAVARZI': '#2e8b57', - 'بانک رفاه': '#c0392b', - 'رفاه': '#c0392b', - 'REFAH': '#c0392b', - 'بانک سرمایه': '#c0392b', - 'سرمایه': '#c0392b', - 'SARMAYEH': '#c0392b', - 'بانک سپه': '#e85d04', - 'سپه': '#e85d04', - 'SEPAH': '#e85d04', +interface BankDefinition { + id: string + persianName: string + accentColor: string + aliases: string[] } -const BANK_LOGOS: Record = { - 'بانک پاسارگاد': pasargadLogo, - 'پاسارگاد': pasargadLogo, - 'PASARGAD': pasargadLogo, - 'بانک سامان': samanLogo, - 'سامان': samanLogo, - 'SAMAN': samanLogo, - 'بانک ملی': melliLogo, - 'ملی': melliLogo, - 'MELLI': melliLogo, - 'بانک ملت': mellatLogo, - 'ملت': mellatLogo, - 'MELLAT': mellatLogo, - 'بانک آینده': ayandehLogo, - 'آینده': ayandehLogo, - 'AYANDEH': ayandehLogo, - 'بانک کشاورزی': keshavarziLogo, - 'کشاورزی': keshavarziLogo, - 'KESHAVARZI': keshavarziLogo, - 'بانک رفاه': refahLogo, - 'رفاه': refahLogo, - 'REFAH': refahLogo, - 'بانک سرمایه': sarmayehLogo, - 'سرمایه': sarmayehLogo, - 'SARMAYEH': sarmayehLogo, - 'بانک پارسیان': parsiyanLogo, - 'پارسیان': parsiyanLogo, - 'PARSIAN': parsiyanLogo, - 'بانک صادرات': saderatLogo, - 'صادرات': saderatLogo, - 'SADERAT': saderatLogo, - 'بانک صنعت و معدن': sanatomadanLogo, - 'صنعت و معدن': sanatomadanLogo, - 'صنعت معدن': sanatomadanLogo, - 'SANATOMADAN': sanatomadanLogo, - 'SANAT_MADAN': sanatomadanLogo, - 'بانک سپه': sepahLogo, - 'سپه': sepahLogo, - 'SEPAH': sepahLogo, +const bankLogoModules = import.meta.glob('@/assets/img/banks/*.{png,svg}', { + eager: true, + import: 'default', +}) + +const BANK_LOGO_BY_STEM = Object.fromEntries( + Object.entries(bankLogoModules).map(([path, url]) => { + const stem = path.split('/').pop()?.replace(/\.(png|svg)$/i, '') ?? '' + return [stem, url] + }), +) as Record + +const BANKS: BankDefinition[] = [ + { id: 'melli', persianName: 'بانک ملی', accentColor: '#4b5e96', aliases: ['MELLI', 'BMI', 'ملی', 'بانک ملی', 'بانک ملی ایران', '017'] }, + { id: 'sepah', persianName: 'بانک سپه', accentColor: '#e85d04', aliases: ['SEPAH', 'سپه', 'بانک سپه', '015'] }, + { id: 'mellat', persianName: 'بانک ملت', accentColor: '#c0392b', aliases: ['MELLAT', 'MELAT', 'ملت', 'بانک ملت', '012'] }, + { id: 'tejarat', persianName: 'بانک تجارت', accentColor: '#2f5f9e', aliases: ['TEJARAT', 'تجارت', 'بانک تجارت', '018'] }, + { id: 'saderat', persianName: 'بانک صادرات', accentColor: '#1a6fb3', aliases: ['SADERAT', 'BSI', 'صادرات', 'بانک صادرات', 'بانک صادرات ایران', '019'] }, + { id: 'sanatomadan', persianName: 'بانک صنعت و معدن', accentColor: '#8b6914', aliases: ['SANAT_VA_MADAN', 'SANATOMADAN', 'SANAT_MADAN', 'BIM', 'صنعت و معدن', 'صنعت معدن', 'بانک صنعت و معدن', '011'] }, + { id: 'keshavarzi', persianName: 'بانک کشاورزی', accentColor: '#2e8b57', aliases: ['KESHAVARZI', 'BKI', 'کشاورزی', 'بانک کشاورزی', '016'] }, + { id: 'maskan', persianName: 'بانک مسکن', accentColor: '#f39c12', aliases: ['MASKAN', 'مسکن', 'بانک مسکن', '014'] }, + { id: 'refah', persianName: 'بانک رفاه', accentColor: '#c0392b', aliases: ['REFAH', 'RB', 'رفاه', 'بانک رفاه', 'بانک رفاه کارگران', '013'] }, + { id: 'tosee_saderat', persianName: 'بانک توسعه صادرات', accentColor: '#1f6f8b', aliases: ['TOSEE_SADERAT', 'EXPORT_DEVELOPMENT', 'EDBI', 'توسعه صادرات', 'بانک توسعه صادرات', '020'] }, + { id: 'postbank', persianName: 'پست بانک', accentColor: '#f1c40f', aliases: ['POSTBANK', 'POST', 'پست بانک', '021', '080'] }, + { id: 'tosee_taavon', persianName: 'بانک توسعه تعاون', accentColor: '#7f8c8d', aliases: ['TOSEE_TAAVON', 'TOSEE_TAAVON_ESLAMI', 'TT', 'توسعه تعاون', 'بانک توسعه تعاون', '022'] }, + { id: 'karafarin', persianName: 'بانک کارآفرین', accentColor: '#16a085', aliases: ['KARAFARIN', 'KAR', 'کارآفرین', 'بانک کارآفرین', '053'] }, + { id: 'parsian', persianName: 'بانک پارسیان', accentColor: '#c9a227', aliases: ['PARSIAN', 'پارسیان', 'بانک پارسیان', '054'] }, + { id: 'eghtesad_novin', persianName: 'بانک اقتصاد نوین', accentColor: '#5b2c83', aliases: ['EGHTESAD_NOVIN', 'EN', 'ENBANK', 'اقتصاد نوین', 'بانک اقتصاد نوین', '055'] }, + { id: 'saman', persianName: 'بانک سامان', accentColor: '#2f63d8', aliases: ['SAMAN', 'SB', 'سامان', 'بانک سامان', '056'] }, + { id: 'pasargad', persianName: 'بانک پاسارگاد', accentColor: '#1f7a54', aliases: ['PASARGAD', 'BPI', 'پاسارگاد', 'بانک پاسارگاد', '057'] }, + { id: 'sarmayeh', persianName: 'بانک سرمایه', accentColor: '#8e1b1b', aliases: ['SARMAYEH', 'سرمایه', 'بانک سرمایه', '058'] }, + { id: 'sina', persianName: 'بانک سینا', accentColor: '#1f4e79', aliases: ['SINA', 'SINAA', 'سینا', 'بانک سینا', '059'] }, + { id: 'mehr_iran', persianName: 'بانک قرض‌الحسنه مهر ایران', accentColor: '#27ae60', aliases: ['MEHR_IRAN', 'MEHR', 'MEHRIRAN', 'مهر ایران', 'قرض الحسنه مهر ایران', 'بانک قرض‌الحسنه مهر ایران', '060'] }, + { id: 'shahr', persianName: 'بانک شهر', accentColor: '#c0392b', aliases: ['SHAHR', 'شهر', 'بانک شهر', '061'] }, + { id: 'ayandeh', persianName: 'بانک آینده', accentColor: '#2b2f6b', aliases: ['AYANDEH', 'BA', 'آینده', 'بانک آینده', '062'] }, + { id: 'ansar', persianName: 'بانک انصار', accentColor: '#7b241c', aliases: ['ANSAR', 'انصار', 'بانک انصار', '063'] }, + { id: 'gardeshgari', persianName: 'بانک گردشگری', accentColor: '#148f77', aliases: ['GARDESHGARI', 'TOURISM', 'گردشگری', 'بانک گردشگری', '064'] }, + { id: 'hekmat', persianName: 'بانک حکمت ایرانیان', accentColor: '#1a5276', aliases: ['HEKMAT', 'HEKMAT_IRANIAN', 'HI', 'حکمت', 'حکمت ایرانیان', 'بانک حکمت ایرانیان', '065'] }, + { id: 'dey', persianName: 'بانک دی', accentColor: '#00838f', aliases: ['DEY', 'DAY', 'دی', 'بانک دی', '066'] }, + { id: 'iran_zamin', persianName: 'بانک ایران زمین', accentColor: '#6c3483', aliases: ['IRANZAMIN', 'IRAN_ZAMIN', 'IZ', 'ایران زمین', 'بانک ایران زمین', '069'] }, + { id: 'resalat', persianName: 'بانک قرض‌الحسنه رسالت', accentColor: '#1e8449', aliases: ['RESALAT', 'رسالت', 'قرض الحسنه رسالت', 'بانک قرض‌الحسنه رسالت', '070'] }, + { id: 'melal', persianName: 'مؤسسه اعتباری ملل', accentColor: '#566573', aliases: ['MELALL', 'MELAL', 'ملل', 'مؤسسه اعتباری ملل', '075'] }, + { id: 'khavarmianeh', persianName: 'بانک خاورمیانه', accentColor: '#f29200', aliases: ['KHAVARMIANEH', 'KHAVAR_MIANEH', 'MIRAN', 'خاورمیانه', 'بانک خاورمیانه', '078'] }, + { id: 'iran_venezuela', persianName: 'بانک ایران و ونزوئلا', accentColor: '#b03a2e', aliases: ['IRAN_VENEZUELA', 'IVBB', 'ایران و ونزوئلا', 'بانک ایران و ونزوئلا', '095'] }, + { id: 'ghavamin', persianName: 'بانک قوامین', accentColor: '#1b4f72', aliases: ['GHAVAMIN', 'GHBI', 'قوامین', 'بانک قوامین'] }, +] + +const ALIAS_TO_BANK_ID = new Map() +const BANK_BY_ID = new Map() + +for (const bank of BANKS) { + BANK_BY_ID.set(bank.id, bank) + for (const alias of bank.aliases) { + ALIAS_TO_BANK_ID.set(normalizeAlias(alias), bank.id) + } + ALIAS_TO_BANK_ID.set(normalizeAlias(bank.persianName), bank.id) + ALIAS_TO_BANK_ID.set(normalizeAlias(bank.id), bank.id) } -const BANK_PERSIAN_NAMES: Record = { - PASARGAD: 'بانک پاسارگاد', - SAMAN: 'بانک سامان', - MELLI: 'بانک ملی', - MELLAT: 'بانک ملت', - AYANDEH: 'بانک آینده', - KESHAVARZI: 'بانک کشاورزی', - REFAH: 'بانک رفاه', - SARMAYEH: 'بانک سرمایه', - PARSIAN: 'بانک پارسیان', - SADERAT: 'بانک صادرات', - SEPAH: 'بانک سپه', - 'بانک پاسارگاد': 'بانک پاسارگاد', - 'پاسارگاد': 'بانک پاسارگاد', - 'بانک سامان': 'بانک سامان', - 'سامان': 'بانک سامان', - 'بانک ملی': 'بانک ملی', - 'ملی': 'بانک ملی', - 'بانک ملت': 'بانک ملت', - 'ملت': 'بانک ملت', - 'بانک آینده': 'بانک آینده', - 'آینده': 'بانک آینده', - 'بانک کشاورزی': 'بانک کشاورزی', - 'کشاورزی': 'بانک کشاورزی', - 'بانک رفاه': 'بانک رفاه', - 'رفاه': 'بانک رفاه', - 'بانک سرمایه': 'بانک سرمایه', - 'سرمایه': 'بانک سرمایه', - 'بانک پارسیان': 'بانک پارسیان', - 'پارسیان': 'بانک پارسیان', - 'بانک صادرات': 'بانک صادرات', - 'صادرات': 'بانک صادرات', - 'بانک صنعت و معدن': 'بانک صنعت و معدن', - 'صنعت و معدن': 'بانک صنعت و معدن', - 'صنعت معدن': 'بانک صنعت و معدن', - SANATOMADAN: 'بانک صنعت و معدن', - SANAT_MADAN: 'بانک صنعت و معدن', - 'بانک سپه': 'بانک سپه', - 'سپه': 'بانک سپه', +function normalizeAlias(value: string): string { + return value.trim().replace(/\s+/g, ' ').toUpperCase() +} + +function findBankId(raw?: string | null): string | undefined { + if (!raw?.trim()) { + return undefined + } + + const trimmed = raw.trim() + const normalized = normalizeAlias(trimmed) + if (ALIAS_TO_BANK_ID.has(normalized)) { + return ALIAS_TO_BANK_ID.get(normalized) + } + + const upper = trimmed.toUpperCase() + const matched = BANKS.find((bank) => + bank.aliases.some((alias) => { + const aliasNorm = normalizeAlias(alias) + return /[\u0600-\u06FF]/u.test(alias) + ? trimmed.includes(alias) + : upper.includes(aliasNorm) + }), + ) + + return matched?.id +} + +function extractIbanBankCode(sheba?: string | null): string | undefined { + const normalized = sheba?.replace(/\s/g, '').toUpperCase() + if (!normalized?.startsWith('IR') || normalized.length < 7) { + return undefined + } + + return normalized.slice(4, 7) +} + +export function resolveBankKey(card: Pick): string | undefined { + const fromName = findBankId(card.bank_name) + if (fromName) { + return fromName + } + + const ibanCode = extractIbanBankCode(card.shaba_number) + if (ibanCode) { + return findBankId(ibanCode) + } + + return undefined +} + +function getBankDefinition(bankKey?: string | null): BankDefinition | undefined { + if (!bankKey) { + return undefined + } + + const byId = BANK_BY_ID.get(bankKey) + if (byId) { + return byId + } + + const resolvedId = findBankId(bankKey) + return resolvedId ? BANK_BY_ID.get(resolvedId) : undefined } export function formatShebaForDisplay(value?: string | number | null): string { @@ -157,74 +154,30 @@ export function formatShebaForDisplay(value?: string | number | null): string { ].join(' ') } -export function getBankAccentColor(bankName?: string): string { - if (!bankName) { - return '#64748b' - } - - const trimmed = bankName.trim() - if (BANK_ACCENT_COLORS[trimmed]) { - return BANK_ACCENT_COLORS[trimmed] - } - - const matched = Object.entries(BANK_ACCENT_COLORS).find(([name]) => trimmed.includes(name)) - return matched?.[1] ?? '#64748b' +export function getBankAccentColor(bankKey?: string): string { + return getBankDefinition(bankKey)?.accentColor ?? '#64748b' } -export function getBankMonogram(bankName?: string): string { - if (!bankName?.trim()) { +export function getBankMonogram(bankKey?: string): string { + const bank = getBankDefinition(bankKey) + if (!bank) { return 'بانک' } - const trimmed = bankName.trim() - if (/^[A-Za-z]/u.test(trimmed)) { - return trimmed.replace(/[^A-Za-z]/g, '').slice(0, 2).toUpperCase() || 'BN' - } - - const normalized = trimmed.replace(/^بانک\s+/u, '').trim() - return normalized.slice(0, 2) || 'بانک' + const shortName = bank.persianName.replace(/^بانک\s+/u, '').trim() + return shortName.slice(0, 2) || 'بانک' } -function findBankEntry(bankName: string | undefined, entries: Record): T | undefined { - if (!bankName?.trim()) { +export function getBankLogoUrl(bankKey?: string): string | undefined { + const bank = getBankDefinition(bankKey) + if (!bank) { return undefined } - const trimmed = bankName.trim() - if (entries[trimmed]) { - return entries[trimmed] - } - - const matched = Object.entries(entries).find(([name]) => trimmed.includes(name)) - return matched?.[1] + return BANK_LOGO_BY_STEM[bank.id] } -export function getBankLogoUrl(bankName?: string): string | undefined { - return findBankEntry(bankName, BANK_LOGOS) -} - -export function getBankDisplayName(bankName?: string): string { - if (!bankName?.trim()) { - return 'بانک' - } - - const trimmed = bankName.trim() - if (BANK_PERSIAN_NAMES[trimmed]) { - return BANK_PERSIAN_NAMES[trimmed] - } - - const upper = trimmed.toUpperCase() - if (BANK_PERSIAN_NAMES[upper]) { - return BANK_PERSIAN_NAMES[upper] - } - - const matched = Object.entries(BANK_PERSIAN_NAMES).find(([name]) => { - if (/[\u0600-\u06FF]/u.test(name)) { - return trimmed.includes(name) - } - - return upper.includes(name) - }) - - return matched?.[1] ?? trimmed +export function getBankDisplayName(bankKey?: string): string { + const bank = getBankDefinition(bankKey) + return bank?.persianName ?? (bankKey?.trim() || 'بانک') } diff --git a/src/views/base/wallet/components/BoursecuBankAccountOption.vue b/src/views/base/wallet/components/BoursecuBankAccountOption.vue index 4974505..fad79a9 100644 --- a/src/views/base/wallet/components/BoursecuBankAccountOption.vue +++ b/src/views/base/wallet/components/BoursecuBankAccountOption.vue @@ -24,6 +24,7 @@ import { getBankDisplayName, getBankLogoUrl, getBankMonogram, + resolveBankKey, } from '@/utils/bankBranding' const props = withDefaults( @@ -34,10 +35,11 @@ const props = withDefaults( { compact: false }, ) -const accentColor = computed(() => getBankAccentColor(props.card.bank_name)) -const displayName = computed(() => getBankDisplayName(props.card.bank_name)) -const logoUrl = computed(() => getBankLogoUrl(props.card.bank_name)) -const monogram = computed(() => getBankMonogram(props.card.bank_name)) +const bankKey = computed(() => resolveBankKey(props.card)) +const accentColor = computed(() => getBankAccentColor(bankKey.value)) +const displayName = computed(() => getBankDisplayName(bankKey.value)) +const logoUrl = computed(() => getBankLogoUrl(bankKey.value)) +const monogram = computed(() => getBankMonogram(bankKey.value)) const shebaText = computed(() => formatShebaForDisplay(props.card.shaba_number)) diff --git a/src/views/base/wallet/components/UISlider/index.vue b/src/views/base/wallet/components/UISlider/index.vue index 9e8c146..edb5d4b 100644 --- a/src/views/base/wallet/components/UISlider/index.vue +++ b/src/views/base/wallet/components/UISlider/index.vue @@ -3,7 +3,7 @@
@@ -26,7 +26,7 @@ import { computed, onMounted, ref, watch } from 'vue' import { useSwipe } from '@vueuse/core' import CardItem from './CardItem.vue' import type { Card } from '@/models/wallet' -import { getBankDisplayName } from '@/utils/bankBranding' +import { getBankDisplayName, resolveBankKey } from '@/utils/bankBranding' const el = ref(null) const container = ref(null)