优化: 前端DRY收敛与命名对齐

审批等待格式化与阈值沉 utils/time 正典
相对时间阶梯三套收敛 formatRelative 参数化
灵感状态表沉 constants,透传通道退役
aggText/clearOwn 等命名对齐,IPC 参数名统一 conversation_id
This commit is contained in:
lxy
2026-10-01 19:35:20 +08:00
parent 6ef15a0940
commit 0560137840
16 changed files with 111 additions and 97 deletions
+39 -2
View File
@@ -44,8 +44,19 @@ export function formatDate(v: string | number | null | undefined): string {
return d.toLocaleDateString(locale) + ' ' + d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' })
}
/** 相对时间(走 i18n:justNow/minutesAgo/hoursAgo/dayAgo;en/zh 双语);无效返回 '—' */
export function formatRelative(v: string | number | null | undefined): string {
/** 相对时间分档差异参数(formatRelative 选项;不传 = 原默认阶梯) */
export interface FormatRelativeOpts {
/** 开启「昨天」档:24~48h 显示 common.yesterday(如 GitChanges 提交时间),默认关 */
yesterday?: boolean
/** 超过 N 天回退绝对日期;缺省不截断,一直显示「N 天前」 */
absAfterDays?: number
/** 绝对日期回退样式:'ago' = 「{date}前」(i18n,默认);'iso' = YYYY-MM-DD(定宽,列表对齐用) */
absStyle?: 'ago' | 'iso'
}
/** 相对时间(走 i18n:justNow/minutesAgo/hoursAgo/dayAgo;en/zh 双语);无效返回 '—'。
* 分档差异(yesterday 档 / N 天截断回退绝对日期)经 opts 表达,不传保持原行为 */
export function formatRelative(v: string | number | null | undefined, opts?: FormatRelativeOpts): string {
const ms = parseTs(v)
if (ms == null) return '—'
const diffMin = Math.floor((Date.now() - ms) / 60000)
@@ -54,5 +65,31 @@ export function formatRelative(v: string | number | null | undefined): string {
const diffH = Math.floor(diffMin / 60)
if (diffH < 24) return t('common.hoursAgo', { n: diffH })
const diffD = Math.floor(diffH / 24)
if (opts?.yesterday && diffD < 2) return t('common.yesterday')
if (opts?.absAfterDays != null && diffD >= opts.absAfterDays) {
const d = new Date(ms)
if (opts.absStyle === 'iso') {
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`
}
return t('common.ago', { time: d.toLocaleDateString() })
}
return t('common.dayAgo', { n: diffD })
}
// ── 审批等待时长(ToolCard / ApprovalPopup 双写收敛) ──
export type WaitLevel = 'normal' | 'long' | 'urgent'
/** 秒 → MM:SS(分秒两位补零,审批挂起时长展示) */
export function formatWaitTime(secs: number): string {
const m = Math.floor(secs / 60)
const s = secs % 60
return `${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`
}
/** 等待分级阈值(与后端 APPROVAL_TIMEOUT_MS 5min 静默拒绝对齐):≥300s urgent / ≥120s long */
export function waitLevelOf(secs: number): WaitLevel {
if (secs >= 300) return 'urgent'
if (secs >= 120) return 'long'
return 'normal'
}