Tahesab import still replaces the name and keeps the previous name. Co-authored-by: Cursor <cursoragent@cursor.com>
63 lines
2.5 KiB
TypeScript
63 lines
2.5 KiB
TypeScript
export function emptyToNull(value?: string | null): string | null {
|
||
if (value == null) return null;
|
||
const trimmed = value.trim();
|
||
return trimmed.length ? trimmed : null;
|
||
}
|
||
|
||
export function normalizeEmail(value?: string | null): string | null {
|
||
const v = emptyToNull(value);
|
||
return v ? v.toLowerCase() : null;
|
||
}
|
||
|
||
const FA_DIGITS = '۰۱۲۳۴۵۶۷۸۹';
|
||
const AR_DIGITS = '٠١٢٣٤٥٦٧٨٩';
|
||
|
||
/** ارقام فارسی و عربی را به لاتین برمیگرداند تا از شماره حذف نشوند. */
|
||
function latinDigits(value: string): string {
|
||
return value.replace(/[۰-۹٠-٩]/g, (ch) => {
|
||
const fa = FA_DIGITS.indexOf(ch);
|
||
return String(fa >= 0 ? fa : AR_DIGITS.indexOf(ch));
|
||
});
|
||
}
|
||
|
||
/** Keep digits and leading + for Iranian/international numbers. */
|
||
export function normalizePhone(value?: string | null): string | null {
|
||
const v = emptyToNull(value);
|
||
if (!v) return null;
|
||
const cleaned = latinDigits(v).replace(/[^\d+]/g, '');
|
||
return cleaned.length ? cleaned : null;
|
||
}
|
||
|
||
/** موبایل ایران به شکل 09xxxxxxxxx. 912… و 98912… و +98912… همان شمارهاند. */
|
||
export function canonicalIranMobile(value?: string | null): string | null {
|
||
const n = normalizePhone(value);
|
||
if (!n) return null;
|
||
let d = n.replace(/\D/g, '');
|
||
if (!d) return null;
|
||
if (d.startsWith('0098') && d.length >= 14) d = d.slice(4);
|
||
else if (d.startsWith('98') && d.length >= 12) d = d.slice(2);
|
||
if (d.length === 10 && d.startsWith('9')) d = `0${d}`;
|
||
return /^09\d{9}$/.test(d) ? d : null;
|
||
}
|
||
|
||
/** شکلهایی که ممکن است همین موبایل با آنها ذخیره شده باشد. */
|
||
export function iranMobileLookupKeys(value?: string | null): string[] {
|
||
const canon = canonicalIranMobile(value);
|
||
if (!canon) return [];
|
||
const core = canon.slice(1);
|
||
return [canon, core, `98${core}`, `+98${core}`, `0098${core}`];
|
||
}
|
||
|
||
/** برای تطبیق: اگر موبایل ایران است همه شکلها، وگرنه همان متن نرمالشده. */
|
||
export function phoneIdentityKeys(value?: string | null): string[] {
|
||
const keys = iranMobileLookupKeys(value);
|
||
if (keys.length) return keys;
|
||
const n = normalizePhone(value);
|
||
return n ? [n] : [];
|
||
}
|
||
|
||
/** ذخیره: موبایل ایران همیشه 09… ؛ بقیه شمارهها فقط تمیز میشوند. */
|
||
export function storedPhoneNumber(value?: string | null): string | null {
|
||
return canonicalIranMobile(value) ?? normalizePhone(value);
|
||
}
|