import { formatAdminApiError, isAdminApiError } from '../api/adminApiClient'; export function handlePageError( error: unknown, onUnauthorized: (message?: string) => void, setError: (message: string) => void, ) { if (isAdminApiError(error) && error.status === 401) { onUnauthorized('登录状态已失效'); return; } setError(formatAdminApiError(error)); } export function splitLines(value: string) { return value .split(/\r?\n|,/) .map((item) => item.trim()) .filter(Boolean); } export function formatUnknownJson(value: unknown) { if (value === null || typeof value === 'undefined') { return ''; } try { return JSON.stringify(value, null, 2); } catch { return String(value); } } /** 内部共用:只接受纯十进制数字串(允许前后空白),拒绝小数、科学计数法与非法 token。 */ function parseSafeIntegerText(value: string): number | null { const trimmed = value.trim(); // 中文注释:只接受纯十进制数字串,避免 `Number` 把 `1.0` / `1e2` / `0x10` / `+5` 当成整数。 if (!/^\d+$/.test(trimmed)) { return null; } const parsed = Number(trimmed); return Number.isSafeInteger(parsed) ? parsed : null; } /** 严格解析正安全整数:空串、小数、科学计数法、非十进制、非正数与非数字都返回 `null`。 */ export function parsePositiveInteger(value: string): number | null { const parsed = parseSafeIntegerText(value); return parsed !== null && parsed > 0 ? parsed : null; } /** 严格解析非负安全整数:空串、小数、科学计数法、非十进制、负数与非数字都返回 `null`。 */ export function parseNonNegativeInteger(value: string): number | null { return parseSafeIntegerText(value); } /** 落库用宽松解析:非法输入按 `0` 处理,避免后台保存被输入抖动打断。 */ export function parsePositiveIntegerOrZero(value: string): number { return parsePositiveInteger(value) ?? 0; }